TCP滑动窗口

滑动窗口也称通告窗口,是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的。
TCP的滑动窗口解决了端到端的流量控制问题,允许接受方对传输进行限制,直到它拥有足够的缓冲空间来容纳更多的数据。

TCP的滑动窗口分为接收窗口发送窗口
滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的。

接收窗口

对于TCP的接收方,在某一时刻在它的接收缓存内存在3种。“已接收”,“未接收准备接收”,“未接收并未准备接收”(由于ACK直接由TCP协议栈回复,默认无应用延迟,不存在“已接收未回复ACK”)。其中“未接收准备接收”称之为接收窗口,即,接收窗口的第一个字节序之前一定是已经完全接收的,后面窗口里面的数据都是希望接收的,窗口后面的数据都是不希望接受的。

另外,接收方在给发送方回复ACK时,其回复报文中包含了两个重要信息:

  • 接收方希望接收的下一个字节的序列号。

  • 接收方当前接收窗口的大小。

如此发送方在接收到ACK包含的这两个数据后就可以计算出还可以发送多少字节的数据给对方,假定当前发送方已发送到第字节,则可以发送的字节数就是.这就是滑动窗口控制流量的基本原理。

接收窗口只有在前面所有的段都确认的情况下才会移动左边界。当在前面还有字节未接收但收到后面字节的情况下,窗口不会移动,并不对后续字节确认。以此确保对端会对这些数据重传。

发送窗口

对于TCP会话的发送方,任何时候在其发送缓存内的数据都可以分为4类,“已经发送并得到对端ACK的”,“已经发送但还未收到对端ACK的”,“未发送但对端允许发送的”,“未发送且对端不允许发送”。“已经发送但还未收到对端ACK的”和“未发送但对端允许发送的”这两部分数据称之为发送窗口。

发送窗口只有收到对端对于本段发送窗口内字节的ACK确认,才会移动发送窗口的左边界。

接收窗口与发送窗口的关系

TCP是双工的协议,会话的双方都可以同时接收、发送数据。TCP会话的双方都各自维护一个“发送窗口”和一个“接收窗口”。其中各自的“接收窗口”大小取决于应用、系统、硬件的限制(TCP传输速率不能大于应用的数据处理速率)。各自的“发送窗口”则要求取决于对端通告的“接收窗口”,要求相同。

拥塞窗口

拥塞窗口是发送方使用 的流量控制,而通告窗口则是接收方进行的流量控制。前者是发送方感受到的网络拥塞的估计,而后者则与接收方在该连接上的可用缓存大小有关。

发送方取拥塞窗口与通告窗口中的最小值作为发送上限。

实际上,除了接收方的硬件限制(如缓存的限制),TCP还必须应付互联网中其他设备的拥塞现象。拥塞是指一个或者多个交换点的数据报超载而导致时延剧烈增加的现象。为了控制拥塞,TCP使用了第二个窗口限制,即拥塞窗口限制。对于拥塞窗口大小的限制采用慢开始乘法减小两种技术。

  1. 慢开始为发送方的TCP增加了另一个窗口:拥塞窗口(Congestion Window),记为CWND。当与另一个网络的主机建立TCP连接时,拥塞窗口被初始化为1个报文段(即另一端通告的报文段大小)。每收到一个ACK, 拥塞窗口就增加一个报文段(cwnd以字节为单位,但是慢启动以报文段大小为单位进行增加)。即,发送方开始时发送一个报文段,然后等待ACK。当收到该ACK时,拥塞窗口从1增加为2,即可以发送两个报文段。当收到这两个报文段的ACK时,拥塞窗口就增加为4。这是一种指数增加的关系。

  2. 拥塞避免,加法增加,当窗口值等于慢开始门限(ssthresh,为65535字节),然后我们开始采用”加法增大”的策略,即不在以2倍的方式增加,而是转变为每次加1的方式.直到网络拥塞(数据包确认超时)。

3.乘法减少或快速重传

  • 乘法减少:当网络拥塞时(数据包确认超时),让新的慢开始门限值ssthresh变为发生拥塞时候的窗口值(cwnd和接收方通告窗口大小的较小者,但最少为2个报文段)的一半,将拥塞窗口置为1,然后让它再次重复,这时一瞬间会将网络中的数据量大量降低。

  • 快速重传:当网络拥塞时。即连续收到3个或以上的重复的ACK,就非常可能是一个报文段丢失。于是我们重传丢失的数据报文段,而无需等待超时定时器溢出。同时,将ssthresh设置为当前cwnd的一半,执行拥塞避免算法。这就是快速恢复算法。相关细节如下:
    1) 当收到第3个重复的ACK时,将ssthresh设置为当前拥塞窗口cwnd的一半。重传丢失的报文段。设置拥塞窗口cwnd为拥塞窗口阈值ssthresh加上3倍的报文段大小。
    2) 每次收到一个重复的ACK时,拥塞窗口cwnd增加1个报文段大小并发送1个分组(如果新的拥塞窗口cwnd允许发送)。
    3) 当下一个确认新数据的ACK到达时,设置拥塞窗口cwnd为ssthresh(在第一步中设置的值)。这一步采用拥塞避免,因为当分组丢失时我们将当前的速率减半。

参考文献