【网络】传输层协议TCP(下)

目录

四次挥手状态变化

流量控制

PSH标记位

URG标记位

滑动窗口

快重传

拥塞控制

延迟应答

mtu

TCP异常情况


四次挥手状态变化

之前我们讲了四次挥手的具体过程以及为什么要进行四次挥手,下面是四次挥手的状态变化

那么我们下面可以来验证一下CLOSE_WAIT这个状态,这个状态出现的条件是后调用close的一方(比如服务器)调用close之前(调用完close就进入last_ack),我们可以很容易模拟出来,直接比如让客户端先调用close,不让服务器端调用close即可,这样就可以看到这个状态

用指令netstat -natp,a表示all

这就证明一件事情,如果我们发现服务器上有大量close_wait状态的时候,这就意味着大概率我们写的服务器有BUG,主要是没有close fd

我们把服务器进程关掉就看不到这个状态了,因为进程结束会把所有文件描述符释放掉

我们可以看到图中有一个time_wait的状态,对这个就是等待一段时间,这个状态实际上是先调用close的一方收到对方的close并给应答后处于的一种状态,这个状态通常持续的时间是分钟级别的,所以我们也可以较容易的看到

这样虽然服务器进程已经关闭,但是这里的端口仍然是被占用的,这也就是为什么立即启动服务器会bind err

所以我们的处理方法就是设置地址复用

那么等待的时间是多少呢?

TCP协议规定,主动关闭连接的一方要处于TIME_WAIT状态,等待两个MSL的时间才能回到CLOSED状态

MSL是 Maximum Segment Lifetime(报文在网络中最大存活时间),我们可以看Linux中它是多长

也就是一分钟,所以TIME_WAIT的时间就是两分钟

下面解释一下为什么会等待这么长的时间

1.因为有可能我关闭了服务器后立马又绑定相同的IP和端口,这是其实是发给上一次连接的数据由于阻塞在了网络中一段时间,现在发到了服务器,这样旧报文就会影响新连接

2.或者说,四次挥手的最后一次ACK可能会丢,如果等待了2个MSL,对方没收到ACK就会超时重传,这是处于TIME_WAIT的我们就可以重新发ACK。总之,就是又重传的机会,保证让对方也关闭连接。

流量控制

有下面这样一种场景,如果A给B发消息非常快,导致B的缓冲区被打满了,那么新来的数据就会被丢弃,尽管TCP有超时重传机制,但是这样其实是不合理的,因为发送的数据被丢掉就会白白占用网络资源;不仅如此如果A发送的过于慢,这也会导致效率低下。

这上面的问题就和我们要说的流量控制有关,B可以通过应答ACK报文通告给A自己缓冲区剩余空间的大小,那么A就可以选择加快或减慢发送的速度

这里就是B就是通过报头中的16位窗口大小将自己缓冲区的大小通告给A的

那如果B的缓冲区满了,A和B就不进行数据交互了,那么A是如何知道B什么时候有空间呢?

A会向B发送窗口探测,B会向A发送窗口更新通知,这两种机制是会同时存在的。

PSH标记位

那如果B一直没空间,A就会给B发的报头中把PSH标记位 置一(当然PSH标记位的应用场景不只是会这么极端),就是让B尽快向上交付,当然取走缓冲区中的数据取决于应用层,这里的意思是应用层调用read的时候不要阻塞,即使要读走的内容很少,也要尽量读走

URG标记位

这个标记位 置一是指16位紧急指针有效,16位紧急指针中存着紧急数据在报文数据中的偏移量(广义的指针就是指能找到想要的数据即可),这个紧急数据一般是一个字节,通常是上层应用层规定好的。

这个大概的应用场景是:比如客户端要给服务器上传数据,上传到一半不想上传了,但是此时服务器TCP缓冲区中还有很多数据,这些数据其实都不想上传了,有了紧急指针就可以不按序到达,TCP协议可以让上层先把带有紧急指针的报文读上去,这样就可以停止上传了

滑动窗口

我们之前说过TCP发消息可以串行发,就是发一条消息等一个应答,但是这样发送效率太低。所以TCP一次发多条报文,然后等应答。

那么问题就来了,一次发多条,这些消息都是无需等待确认应答而可以继续发的数据,这个数量是怎么看的呢?

其实无需等待应答而可以继续发送数据的最大值就是滑动窗口的大小

我们可以认为滑动窗口就是发送缓冲区的一部分区域,这个区域是连续的,其中的数据都是暂时不需要应答而可以直接发送的数据

如果不考虑网络情况,滑动窗口的大小一般是对方接收缓冲区中剩余空间的大小,其实这个数据在三次握手的时候接收方就可以通过报头中的16位窗口大小告诉发送方了

我们可以把滑动窗口认为成下面的样子

其实简单来说,要维护一个窗口其实就是维护一段数组空间(可以把缓冲区看成char类型的数组),只需要两个整型变量即可,一个表示窗口开始位置,一个表示结束位置。

我们之前说过超时重传机制,就是对于已发送但是未收到应答的报文进行保存,万一报文丢失触发超时重传我们得找到那个报文,其实报文正好就存在于滑动窗口中

并且这个滑动窗口只能是向右滑动,可以变大,可以变小直至为零。因为滑动窗口的大小就取决于对方接收缓冲区的大小(暂时先这样理解,后面会说其实跟网络状况也有关系)

快重传

为了提高发送笑效率,TCP引入了快重传策略,就是当收到3个报文中具有同样的确认序号时就会重发滑动窗口的最左边的报文。

因为我们知道确认序号的意义就是确认序号之前的报文全部都收到了,接收方之所以会发三个同样的确认序号就是它收到了滑动窗口中间的一些报文,但是滑动窗口最左边(滑动窗口内)的报文没有收到,接收方收到报文后必须发确认应答,并且确认序号只能是滑动窗口左边(滑动窗口外)的已经收到的数组下标

如果没有3个呢?那就会触发超时重传

所以快重传其实是一个提效的策略,而超时重传则是一个兜底的策略

就以为有了上面的策略,所以才不会害怕滑动窗口最左侧丢包。

那如果是滑动窗口中间或最右侧丢包呢?这种情况其实最终还是转化成最左侧丢包,因为收到应答的报文会被分离出滑动窗口

对方在收到一批报文时,会发回一批应答报文,如果这个应答报文是乱序的呢?

1.首先应答报文也是有序号的,不用担心乱序问题

2.就算是乱序的,比如先收到确认序号是3001,后收到2001,其实收到3001是就已经能确定2000收到了,2001其实就可以直接丢弃了

所以就算一部分应答报文会丢失,后面的应答报文也会通告情况,所以是允许部分应答报文丢失的,这一切还是要归功于确认序号的意义上:确认序号之前的报文全部都收到了

接收数据的一方是要对报文进行排序后才能放到接收缓冲区的

我们上面说流量控制,其实滑动窗口就是流量控制的具体实现

缓冲区终归是有限的,那到头了怎么办?我们可以把缓冲区认为成是一个环状结构,滑动窗口就在这个环上循环

拥塞控制

我们发送数据看的其实不仅是通信双方的主机,还有网络

所以拥塞控制就是用来衡量网络的健康状况的

如果网络拥塞了,那么就会导致大面积丢包;如果发送量超过拥塞窗口就会导致网络拥塞

什么控制发送量呢?就是滑动窗口

每次发送数据包的时候,将拥塞窗口和接收端主机反馈的窗口大小作比较,取较小的值作为实际发送的窗口

所以滑动窗口的大小就是对方接收能力和拥塞窗口的最小值

拥塞探测和TCP发送数据其实是同时进行的,拥塞控制的核心算法其实就是指数级增长,因为指数级增长一开始为慢启动,不会给拥塞的网络增加太多的压力;然后一旦发现网络状况较好就会增长的很快,尽快恢复通信;但是到了后面又开始比例增长,否则指数级增长过快了,大致是下面这样

延迟应答

这个意思就是收到数据后先等待一段时间,当然这个时间不会超过超时重传的时间,就是为了可能上层会取走一部分数据,这时就可以向发送方通报更大的接收能力了

mtu

Maximum Transmission Unit,缩写MTU,中文名是:最大传输单元。  MTU是 数据链路层 的概念

这个值我们可以通过ifconfig命令看到,是1500字节

所以网络中能够传输的最大数据包大小是1500字节

TCP异常情况

如果进程崩溃掉了,那么已经建立好连接的双方就会正常进行四次挥手

如果是机器重启导致进程退出,同样会执行上面的操作,所以有进程时的重启会比没进程时慢一些

如果网线断开或者突然断电,那么这方就直接关闭连接了,对方会发消息或者由于保活策略发一些试探性报文,如果没有应答就会断开连接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/59255.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XingHan-Team团队官网系统源码 全开源

XingHan-Team 官网程序是一个现代化的企业官网管理系统,由星涵网络工作室开发。 本系统提供了完整的网站内容管理功能,包括用户管理、内容发布、成员查询、成员申请等功能。 源码下载:https://download.csdn.net/download/m0_66047725/8995…

vrrp和mstp,vrrp和byd

vrrp和mstp 思路 vrrp是用来虚拟网关,噢,是虚拟一条虚拟网关 优先级,priority越大越优先,优先级相同,哪个的路由器的vrrp先起来,谁就是主 mstp是快速生成树协议,防止环路用的 优先级越小越优…

图说复变函数论重大错误:将无穷多各异平面误为同一面

黄小宁 医学若将前所未知的“新冠”病毒误为已熟知的流感病毒,后果...;数学将前所未知的点集误为已熟知的集就会引出一连串的重大错误。 h定理:点集AB的必要条件是A≌B。 证:(1)任何图≌自己是几何学最起码…

SpringBoot技术:打造新闻稿件管理平台

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

深入理解DMA(直接存储器访问)

直接存储器访问(DMA,Direct Memory Access)是一种允许外设和内存之间直接传输数据的机制,旨在提高数据传输的效率,减少CPU的负担。在传统的数据传输中,CPU负责所有的数据移动和处理,这导致CPU资源被大量占用,影响系统的整体性能。而DMA的出现,正是为了优化这一过程,使…

【Wi-Fi】WiFi中QAM及16-QAM、64-QAM、512-QAM、1024-QAM、2048-QAM、4096-QAM整理

参考链接 什么是QAM?QAM是如何工作的? - 华为 不同阶QAM调制星座图中,符号能量的归一化计算原理 - 知乎 16 QAM modulation vs 64 QAM modulation vs 256 QAM modulation 512 QAM vs 1024 QAM vs 2048 QAM vs 4096 QAM modulation type…

EHOME视频平台EasyCVR萤石设备视频接入平台视频诊断技术可以识别哪些视频质量问题?

EasyCVR视频监控汇聚管理平台是一款针对大中型项目设计的跨区域网络化视频监控集中管理平台。萤石设备视频接入平台EasyCVR不仅具备视频资源管理、设备管理、用户管理、运维管理和安全管理等功能,还支持多种主流标准协议,如GB28181、GB35114、RTSP/Onvif…

42python数据分析numpy基础之trace计算对角线元素的和

python的numpy库的trace()函数,计算对角线元素的和。 用法 numpy.trace(a, offset0, axis10, axis21, dtypeNone, outNone)描述 numpy.trace(a),返回数组a的对角线元素的和。 入参 a:必选,数组,列表,元…

WPF+MVVM案例实战(二十三)- 阴影效果详解

文章目录 1、案例效果2、阴影属性参数说明3、阴影效果实现1、案例效果 2、阴影属性参数说明 WPF 中,控件的阴影效果是通过附加属性 Effect 来实现的。这里详细说明以下阴影效果的各个参数。 属性描述BlurRadius阴影模糊程度,值越大越模糊Color阴影颜色Opacity阴影透明度,默…

Vue项目开发:Vuex使用,表单验证配置,ESLint关闭与常见问题解决方案

文章目录 vuexvue配置form表单验证移除vue中表单验证的两种方法关闭vue项目的eslint代码校验做vue项目出现的问题 vuex Vue提供的状态管理工具,用于统一管理我们项目中各种数据的交互和重用,存储我们需要用到的数据对象属性 state:vuex的基本…

HTTP、WebSocket、gRPC 或 WebRTC:各种协议的区别

在为您的应用程序选择通信协议时,有很多不同的选择。 本文将了解四种流行的解决方案:HTTP、WebSocket、gRPC 和 WebRTC。 我们将通过深入学习其背后原理、最佳用途及其优缺点来探索每个协议。 通信方式在不断改进:变得更快、更方便、更可靠&…

24.11.3

星期一: 补24武汉高校联合程序设计新生赛 C cf传送门 最开始用倍增树链刨分,稳定T 思路:处理出树链刨分的dfn序和重链等前置信息,然后对每条重链开个set(常见方法,用于存断开的边&…

大端存储和小端存储

大端存储和小端存储 在计算机系统中,数据在内存中的存储方式并不是唯一的。对于多字节的数据类型(如 int、float 等),计算机可以以不同的方式在内存中存储它们。这些存储方式通常分为两种:大端存储(Big-En…

如何使用RabbitMQ和Python实现广播消息

使用 RabbitMQ 和 Python 实现广播消息的过程涉及设置一个消息队列和多个消费者,以便接收相同的消息。RabbitMQ 的 “fanout” 交换机允许你将消息广播到所有绑定的队列。以下是如何实现这一过程的详细步骤。 1、问题背景 在将系统从Morbid迁移到RabbitMQ时&#x…

C#-类:成员变量

声明在类语句块中,描述对象的特征,可为任意变量类型 可包含:枚举、结构体、类、其他 1. 类成员的详细定义 特征->成员变量:包括类的数据:变量、常量、事件的成员行为->成员方法:普通方法、属性、构…

PAT甲级-1133 Splitting A Linked List

题目 题目大意 给定一个链表的首节点地址和节点个数&#xff0c;以及一个数k。要求重新排列该链表&#xff0c;使其按<0 &#xff0c;> 0 && < k&#xff0c;>k 的顺序排序。但是不改变原有顺序&#xff0c;比如-4 -> -6 -> -2&#xff0c;不需要再…

【spark的集群模式搭建】spark集群之Yarn集群模式搭建(清晰明了的搭建流程)

文章目录 1、使用Anaconda部署Python2、上传、解压、重命名3、创建软连接&#xff08;如果在Standalone模式中创建有就删除&#xff09;4、配置spark环境变量5、修改spark-env.sh配置文件6、修改spark-defaults.conf 配置文件7、修改log4j.properties配置文件8、上传spark jar包…

Android IPC机制(三)进程间通信方式

在Android中有以下几种进程间通信方式: 目录 1.Bundle 2.文件共享 3.Messenger 4.ContentProvider 5.AIDL 1.Bundle Bundle是Android中用于存储一组键值对的类&#xff0c;它实现了Parcelable接口。这使得Bundle能够在不同的进程之间传递数据。当我们通过Intent启动其他应…

GEE数据集:全球天然林和人工林数据集提供了一张高分辨率(30 米)地图,用于区分截至 2021 年全球的天然林和人工林

目录 简介 全球天然林和人工林 数据生成和分类 代码 引用 License 网址推荐 知识星球 机器学习 GEE数据集&#xff1a;全球天然林和人工林数据集提供了一张高分辨率&#xff08;30 米&#xff09;地图&#xff0c;用于区分截至 2021 年全球的天然林和人工林 简介 全球…

基于SpringBoot司机信用评价的货运管理系统【附源码】

基于SpringBoot司机信用评价的货运管理系统 效果如下&#xff1a; 系统主页面 系统注册页面 司机注册页面 管理员主页面 订单评价页面 货物信息页面 个人信息页面 研究背景 随着我国物流行业的迅猛发展&#xff0c;货运管理系统的效率与安全性日益受到重视。在货运过程中&am…