慢启动
当主机开始发送数据时,如果立即所大量数据字节注入到网络,那么就有可能引起网络拥塞,因为现在并不清楚网络的负荷情况。因此,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值。通常在刚刚开始发送报文段时,先把拥塞窗口 cwnd 设置为一个最大报文段MSS的数值。而在每收到一个对新的报文段的确认后,把拥塞窗口增加至多一个MSS的数值。用这样的方法逐步增大发送方的拥塞窗口 cwnd ,可以使分组注入到网络的速率更加合理。
每经过一个传输轮次,拥塞窗口 cwnd 就加倍。一个传输轮次所经历的时间其实就是往返时间RTT。不过“传输轮次”更加强调:把拥塞窗口cwnd所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认。
另,慢开始的“慢”并不是指cwnd的增长速率慢,而是指在TCP开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段(目的是试探一下网络的拥塞情况),然后再逐渐增大cwnd。
下面,我们从示例图着手,来分析慢启动的过程。
-
在协商连接时,两个设备交换它们的接收器窗口(在这种情况下它们都有 32KB)
-
双端都以 1KB 的拥塞窗口开始,但由于在该示例中客户端将是唯一发送数据的客户端,因此它将是唯一一个显着使用此值的客户端。
-
在第 2 行,客户端收到一个 ACK并将其 CWND 加倍(现在是 2k)
-
服务器在第 3 行收到一个ACK时也做同样的事情
-
客户端发送两段 1k 的数据,它们稍后在第 6 行和第 7 行确认,其中客户端上的拥塞窗口加倍(4k,然后是 8k)
-
然后,客户端再次发送 1k 数据并立即得到确认,有效地再次将拥塞窗口加倍(现在第 9 行为 16k)。
-
这在第 10-11 行重复,其中 CWND 达到 32k。
-
此时,除非接收端窗口也增长,否则拥塞窗口不能再增长。
慢启动的整个过程如下:
-
初始化 cwnd = 1
-
经过1个RTT,即收到一个ACK,cwnd = 2^(1) = 2
-
经过2个RTT, cwnd = 2^(2) = 4
-
经过3个 RTT, cwnd = 2^(3) = 8
拥塞避免
让拥塞