D4ba8730c13617097a156dae96e4f1e3
TCP流量与拥塞控制

TCP是可靠的传输层协议,内部使用了丢包重传、按序到达、数据完整性等一系列措施确保可靠性。凡事有利也有弊,有得就有舍。这么可靠的设计带来的是某些性能上的损耗。比如重传机制会导致网络节点中有很多重复的数据包,这容易造成网络堵塞。相应地,就出现了一些流量控制与拥塞控制的技术来缓解网络的压力,提升网络传输性能。本文将分别探讨这两种技术。

目录

  1. 流量控制
    1.1 滑动窗口
  2. 拥塞控制
    2.1 慢启动
    2.2 拥塞避免
    2.3 快重传
    2.4 快恢复

1. 流量控制

首先明确一下流量控制拥塞控制概念的区别。
流量控制针对的是端到端的数据通信速率,即是一个局部控制的概念;拥塞控制是针对的是整个网络包括主机、中间节点的转发能力,即是一个全局控制的概念。

1.1 滑动窗口

流量控制是为了防止发送端发送的数据量超出接收端的处理能力,此时接收端可能很忙,负载很高或者说只分配了一个固定大小的buffer。那么此时就需要TCP链接的双方协商好各自初始可用的buffer空间大小并在发送与确认过程中动态调节,这就是滑动窗口的机制。TCP的流量控制就是基于滑动窗口实现的。

滑动窗口可以理解为缓冲区。窗口单位是字节,不是报文段,发送方的发送窗口不能超过接收方给出的接收窗口(Receive window,RWND)的数值。TCP的Window是一个16bit位字段,它代表的是窗口的字节容量,也就是TCP的标准窗口最大为2^16-1=65535个字节。

RFC1323提供了一个“TCP窗口缩放(window scaling)”选项,允许我们把最大接收窗口升级到1GB。这个选项值是在三次握手的时候协商好的,代表需要给原始的16位左移多少位,取值0˜14。

TCP链接刚建立的时候,双方都使用系统默认配置来初始化各自的RWND值(图1)。以后接收端每次发送ACK数据包的时候都会携带一个新的RWND的值(图2),以此来控制发送端的发送窗口(Send window,SWND)大小。

图1 初始RWND值

图1 初始RWND值

图2 ACK数据包调整新的RWND值

图2 ACK数据包调整新的RWND值

除了RWND和SWND,还有一个拥塞窗口(Congestion Window,CWND),这个窗口跟拥塞控制相关,下文再说。这三个窗口的关系是:

SWND = min(RWND, CWND)

即发送窗口的上限是接收窗口和拥塞窗口的小者。
当 RWND < CWND 时,是接收端的接收能力限制发送窗口的最大值。
当 CWND < RWND 时,则是网络的拥塞限制发送窗口的最大值。

对于发送方来说,缓冲区的数据可以分为4类:

  1. 发送并ACK。
  2. 发送未ACK。
  3. 未发送但允许被发送。
  4. 未发送但不允许被发送。

其中,2与3的数据是属于滑动窗口的,即发送窗口。

图3 滑动窗口示意图

图3 滑动窗口示意图

当收到接收方新的ACK对于发送窗口中后续字节的确认时,窗口滑动,滑动原理如下图:

图4 滑动窗口原理

图4 滑动窗口原理

对于接收方来说,缓冲区的数据可以分为3类:

  1. 已接收
  2. 未接收但准备接收
  3. 未接收而且不准备接收

其中,2的数据是属于滑动窗口的,即接收窗口。

top Created with Sketch.