原创

TCP拥塞控制算法

TCP 拥塞控制

虽然 TCP 有了滑动窗口这个大杀器, 能够高效可靠的发送大量的数据. 但是如果在刚开始阶段就发送大量的数据, 仍然可能引发问题.因为网络上有很多的计算机, 可能当前的网络状态就已经比较拥堵. 在不清楚当前网络状态下, 贸然发送大量的数据, 是很有可能引起雪上加霜的.TCP 引入慢启动机制, 先发少量的数据, 探探路, 摸清当前的网络拥堵状态, 再决定按照多大的速度传输。

1.慢开始算法

当主机开始发送数据时,如果立即所大量数据字节注入到网络,那么就有可能引起网络拥塞,因为现在并不清楚网络的负荷情况。因此,较好的方法是 先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值。

通常在刚刚开始发送报文段时,先把拥塞窗口 cwnd 设置为一个最大报文段 MSS 的数值。而在每收到一个对新的报文段的确认后,把拥塞窗口增加至多一个 MSS 的数值。用这样的方法逐步增大发送方的拥塞窗口 cwnd ,可以使分组注入到网络的速率更加合理。

MSS(Maximum Segment Size):最大报文段长度。在连接建立的时候,即在发送 SYN 段的时候,同时会将 MSS 发送给对方(MSS 选项只能出现在 SYN 段中!!!),告诉对端他期望接收的 TCP 报文段数据部分最大长度。

慢开始算法
慢开始算法

每经过一个传输轮次,拥塞窗口 cwnd 就加倍。一个传输轮次所经历的时间其实就是往返时间 RTT。不过“传输轮次”更加强调:把拥塞窗口 cwnd 所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认。 另,慢开始的“慢”并不是指 cwnd 的增长速率慢,而是指在 TCP 开始发送报文段时先设置 cwnd=1,使得发送方在开始时只发送一个报文段(目的是试探一下网络的拥塞情况),然后再逐渐增大 cwnd。

2.慢开始门限 ssthresh

为了防止拥塞窗口 cwnd 增长过大引起网络拥塞,还需要设置一个慢开始门限 ssthresh 状态变量。慢开始门限 ssthresh 的用法如下: 当 cwnd < ssthresh 时,使用上述的慢开始算法。 当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。 当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞控制避免算法

让拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT 就把发送方的拥塞窗口 cwnd 加 1,而不是加倍。这样拥塞窗口 cwnd 按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多。

慢开始门限ssthresh
慢开始门限ssthresh

无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢开始门限 ssthresh 设置为出现拥塞时的发送方窗口值的一半(但不能小于 2)。然后把拥塞窗口 cwnd 重新设置为 1,执行慢开始算法。 这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生 拥塞的路由器有足够时间把队列中积压的分组处理完毕。

3.图解拥塞控制的过程

如下图,现在发送窗口的大小和拥塞窗口一样大。

图解拥塞控制的过程
图解拥塞控制的过程
  1. 在标号为 1 的箭头处,TCP 初始连接进行数据交换,开始慢启动,初始 cwnd=I,W=1,ssthresh=16,在传输轮次 0-4 阶段进行慢启动过程,cwnd 按照 1-2-4-8-16 的顺序进行指数增长
  2. 在标号为 2 的箭头处,cwnd=16=ssthresh,此时触发拥塞避免过程,开始线性增长,在传输轮次 4-12 阶段,cwnd 按照 16-17-18-19-20-21-22-23-24 进行线性增长。
  3. 在标号为 3 的箭头处,TCP 发生了 RTO 重传,认为网络发生拥塞,于是设置 ssthresh=cwnd/2=12,cwnd=1 重新进行慢启动过程
  4. 在标号为 4 的箭头处,TCP 从 cwnd=1 开始重新开始慢启动过程
  5. 在标号为 5 的箭头处,当 cwnd = 12 时改为执行拥塞避免算法,拥塞窗口按按线性规律增长,每经过一个往返时延就增加一个 MSS 的大小。

4.为何很多 MOBA、FPS 类游戏不采用 TCP 通信?

成也萧何败萧何,TCP 的拥塞控制对整体网络来说是一个很好的策略,但是对于”自私”的玩家来说,尤其是玩实时对战类游戏的玩家,数据包的收发速度影响了游戏的流畅性,如果采用 TCP 通信,当出现网络拥堵的情况,会让包流速变慢,作为一个玩家,希望的是尽快恢复,而不是有序的等待!由于 TCP 的拥塞控制算法无法在网络上层做修改,而 UDP 还是一片纯净难用的净土,所以有能力的大厂都有自己的 UDP 安全通信团队!!!

正文到此结束