网络学习-传输层TCP(窗口控制提高效率)

内容Are 关键字
TCP以段为单位发送数据 MMS
利用窗口控制提高效率 窗口大小,窗口滑动方式
窗口控制和重发控制 快重传,ACK丢了,数据包丢了

TCP以段为单位发送数据

TCP在建立连接的时候,就确定了发送数据包的基本单位。这个长度被称之为“最大消息长度”(MMS:Maximum Segment Size),。最理想的情况是。MMS等于IP数据包中不会被分片处理的最大数据长度。
TCP在发送数据的时候,是以MMS的大小将数据进行切割发送。进行重发时也是以MMS为单位进行发送。

MMS是在三次握手的时候,在两端计算机中得出。两端主机发出建立连接的请求时。会在TCP首部写上MMS选项。告诉对方自己的MMS大小是多少。然后在两者之中选择一个较小值使用。

(为附加MMS,TCP的首部将不再是20字节,而是4字节的整数倍,且在建立连接时,有一方MMS选项被省略,可以选为IP数据包长度不超过576字节的长度)

网络学习-传输层TCP(窗口控制提高效率)


利用窗口控制提高效率

TCP以一个段为单位,每发一个段进行一次确认,这样的传输方式有一个缺点,就是效率低。包往返的时间越长,通信效率就越低。
如下
网络学习-传输层TCP(窗口控制提高效率)

为了解决这个问题TCP引入窗口这个概念。即使在往返时间较长的情况下,他也能控制网络性能的下降。

如下图,确认应答不再是以每个分段进行确认,而是以更大的单位进行确认,转发时间将会大幅度缩短。也就是说,发送端在发送完一个段后不必一直等待应答确认,而是可以继续发送。
网络学习-传输层TCP(窗口控制提高效率)

窗口大小指的是无需等待确认应答而可以继续发送数据的最大值. 上图的窗口大小就是4000个字节(四个段)

发送前四个段的时候, 不需要等待任何ACK, 直接发送;

收到第一个ACK后, 滑动窗口向后移动, 继续发送第五个段的数据; 依次类推;
操作系统内核为了维护这个滑动窗口, 需要开辟 发送缓冲区 来记录当前还有哪些数据没有应答;
只有确认应答过的数据, 才能从缓冲区删掉;窗口越大, 则网络的吞吐率就越高;


以下是窗口滑动方式

如图,发送区高亮处就是前面提到的窗口。在这个窗口内的数据,即便没有收到ACK,也可以发送出去。不过在整个窗口的确认应答收到之前,如果发现部分数据丢包,那么发送端仍然要负责重传。, 需要开辟 发送缓冲区 来记录当前这些待被重传的数据。直到收到他们的确认应答。

在滑动窗口左边是已经发送的却收到ACK的数据。右边是尚未发送的数据。当数据发出后,如期收到ACK,就不需要重发,且将他们从缓冲区清除。

收到应答时,将串口滑动到确认应答***位置,这样就可以顺序的将多个段同时发送,以提高性能。


窗口控制和重发控制

提高了效率,并不意味着不会丢包。

1)ACK丢了

网络学习-传输层TCP(窗口控制提高效率)
这种情况下, 部分ACK丢了并不要紧, 因为可以通过后续的ACK进行确认。

2)数据包丢了

网络学习-传输层TCP(窗口控制提高效率)
当某一段报文段丢失之后, 发送端会一直收到 1001 这样的ACK, 就像是在提醒发送端 “我想要的是 1001” 一样;如果发送端主机连续三次收到了同样一个 “1001” 这样的应答, 就会将对应的数据1001 - 2000 重新发送(之所以会收到三次而不是两次,是因为即使数据段***被替换两次也会触发重传机制。

这个时候接收端收到了 1001 之后, 再次返回的ACK就是7001了(因为2001 - 7000)接收端其实之前就已经收到了, 被放到了接收端操作系统内核的接收缓冲区接收缓冲区中;
这种机制被称为 “高速重发控制”(也叫 “快重传”).

快重传基于慢重传。