事业无穷年 -- 韩愈
利用窗口控制提高速度:
TCP传输数据是,以一个段为单位(每次发送一个数据包),每发一个段需要一次确认应答,这样就难免存在这样的缺点:包的往返时间越长,通信性能就越低。
为解决这个问题,牛人们提出了窗口的概念。即使往返时间较长的情况下,它也能控制网络性能的下降。
使用窗口后,发送端发送一个段之后,没有必要等到收到对端针对这个段的ACK之后再发送下一个包,而是以更大的单位进行ACK.
窗口大小指 无需等待ACK而可以继续发送数据的最大值,下图所示的窗口为4个段,每个段的大小为1000:
窗口机制的实现使用了大量的缓冲区,如上图,一次连续发送4个段,这些发送出去的数据需要被保存在缓存中,直到收到对端返回的ACK,才能清除。 另外,注意,接受端返回的ACK一定是按照顺序返回的,如上图,肯定是先返回ACK1001,再是ACK2001......
为什么叫做滑动窗口呢:看下图:
窗口里的数据表示已经被发送出去,正在等待回馈的数据。
窗口控制与重发控制:
使用窗口时,如果出现段丢失怎么办?
1)ACK在返回的路途中丢失:
在这种情况下,数据包已经到达了对端,实际上不需要再被重新发送了。在没有使用窗口控制的情况下,没有收到确认应答的数据会不断地重新发送,而在使用窗口控制的情况下,即使某些数据包的ACK被丢失也没有影响! 如下图所示,发送端收到了ACK 2001,就会说说明ACK1001已经被接受端返回了!!就没有必要再等待ACK1001了。
2)某个数据包丢失的情况:
在这种情况下,如下图所示,如果发送端的1001-2000个字节(第二个数据包)丢失,接受端在接受到第3个数据包时,会提醒发送端:“我想要接受的是1001开始的数据段”,即发送ACK1001。如果接受端收到第4个数据段时,还没有收到第2个段,则继续发送ACK1001. 接受端连续收到ACK1001,会确认第2个包丢失,然后就会赶紧重发第2个数据包。 一般地,当发送端连续3次接受到ACK1001时,就会断定需要重发,不必继续等待设置的重传计时器时间了。
这种方式比较高效,因此也被称作高速重发控制。(学习笔记18中会还会提到,其与拥塞控制算法有关)
流控制 (窗口大小)
通信过程中,如果接受端处于高负荷情况,导致其不能接受数据,会导致发送端重新发送数据包,为避免这种无端的流浪浪费,TCP提供了流控制的机制: 让发送端根据接受端的实际能力来控制发送的数据量。
具体操作是,接受端自动向发送端发送自己可以接受的数据的大小,从而 发送端不会发送超过这个限度的数据。该限度被称为窗口大小。
TCP的首部中,专门有一个字段来通知窗口大小。