图解TCP滑动窗口!一分钟搞清楚知识点

【产生背景】

TCP 以1个段为单位,每发一个就需要进行一个确认应答的处理,这样的传输方式有一个缺点:包的往返时间越长通信性能就越低。 

***打个比方好比两个人对话:张三说完一句话,得到李四的确认回答,张三才能说下一句。每一次都是你一句话我一句确认,沟通方式非常低下。

【机制介绍】

为解决这个问题,TCP 引人了“窗口“这个概念,它是操作系统开辟的一个缓存空间,即使RTT(往返时间)较长也能控制网络性能的下降。确认应答以更大的单位进行确认,也就是说,发送端主机在发送了1TCP段以后不必要一直等待确认应答而是继续发送,转发时间将会被大幅度的缩短。

***也就是张三可以一次性连续说多句话,然后一次性等待李四回复OK就行,李四听不清楚的就重新说,完全听清楚了就继续往下说!

窗口大小就是指无需等待确认应答而可以继续发送数据的最大值,上图的窗口大小为4个段(每个段长度1000)。

【窗口类型】

TCP滑动窗口分为两种:发送窗口和接受窗口。

发送端的滑动窗口包含四个部分:

● 已发送且已收到ACK确认

● 已发送但未收到ACK确认

● 未发送但可以发送

● 未发送且不能发送

上图标注的虚线部分就是发送窗口,TCP发送缓存区,是发送端被允许发送的最大数据包大小

● SND.WND:表示发送窗口的大小,上图虚线框的格子大小就是4000个字节。

● SND.UNA:一个绝对指针,它指向的是已发送但未确认的第一个字节的序列号。

● SND.NXT:下一个发送的位置,它指向未发送但可以发送的第一个字节的序列号。

接收端的滑动窗口包含三个部分:

● 已成功接收并确认

● 未收到数据但可以接收

● 未收到数据并不可以接收的数据

上图虚线矩形框就是接收窗口,TCP接收缓存区,用于存储未被进程使用的传入数据。

● REV.WND:表示发送窗口的大小,上图虚线框的格子大小就是3000个字节。

● REV.NXT:下一个接收的位置,它指向未收到但可以接收的第一个字节的序列号。

【实现方式】

下面小云君用图解的方式说明TCP交互中滑动窗口的实现机制:

上述图解是接收端(服务器)进程能很好的处理掉接收的数据的情况,因此可以保证接收窗口大小不变,能持续很好的滑动窗口接收数据。但设想一下,如果来不及处理就会占满TCP接收缓存区,也就是接收端窗口为0,此时就会通知发送端停止发数据了,这也就是TCP流量控制机制。