Skip to main content

TCP 拥塞控制

TCP 协议有两个比较重要的控制算法,一个是流量控制,另一个就是拥塞控制。

TCP 协议通过滑动窗口来进行流量控制,它是控制发送方的发送速度从而使接受者来得及接收并处理。

而拥塞控制是作用于网络,主要目的是通过控制自身的数据发送速率,以确保网络中的所有节点都能够正常处理流量,避免网络拥塞的发生。它是防止过多的包被发送到网络中,避免出现网络负载过大,网络拥塞的情况。

拥塞控制主要是四个算法:慢启动、拥塞避免、快重传和快恢复

慢启动算法 – Slow Start

所谓慢启动,也就是 TCP 连接刚建立,一点一点地提速,试探一下网络的承受能力,以免直接扰乱了网络通道的秩序。

慢启动算法用于在 TCP 连接刚建立时,逐步增加拥塞窗口(Congestion Window)的大小,以确定可用的网络带宽。在慢启动期间,每个数据包都会触发拥塞窗口的指数级增加,从而快速占用可用的网络带宽。

慢启动算法:

  1. 连接建好的开始先初始化拥塞窗口 cwnd 大小为 1,表明可以传一个 MSS 大小的数据。
  2. 每当收到一个 ACK,cwnd 大小加一,呈线性上升。
  3. 每当过了一个往返延迟时间 RTT(Round-Trip Time),cwnd 大小直接翻倍,乘以 2,呈指数让升。
  4. 还有一个 ssthresh(slow start threshold),是一个上限,当 cwnd >= ssthresh 时,就会进入“拥塞避免算法”(后面会说这个算法)

拥塞避免算法 – Congestion Avoidance

拥塞避免算法用于在慢启动后维护一个合适的拥塞窗口大小,以尽量利用可用的网络带宽,同时避免网络拥塞。拥塞避免算法的主要思想是每当接收到一个确认信息时,拥塞窗口就增加 1/MSS(Maximum Segment Size),而不是指数级增加。

如同前边说的,当拥塞窗口大小 cwnd 大于等于慢启动阈值 ssthresh 后,就进入拥塞避免算法。算法如下:

  1. 收到一个 ACK,则 cwnd = cwnd + 1

  2. 每当过了一个往返延迟时间 RTT,cwnd 大小加一。

过了慢启动阈值后,拥塞避免算法可以避免窗口增长过快导致窗口拥塞,而是缓慢的增加调整到网络的最佳值。

快重传

快重传算法用于在数据包丢失时快速重新发送丢失的数据包,而不必等待超时重传。当接收方收到一个乱序的数据包时,它会发送一个带有“重复确认”(Duplicate ACK)的确认信息,告诉发送方哪些数据包丢失了。当发送方接收到三个或更多个重复确认时,它会立即重传对应的数据包,而不必等待超时重传。

超时重传 RTO[Retransmission Timeout]超时,或者收到三个重复确认 ACK 时

执行快重传 cwnd 大小缩小为当前的一半 ssthresh 设置为缩小后的 cwnd 大小 然后进入快速恢复算法 Fast Recovery。

快速恢复

快恢复算法用于在数据包丢失后,快速恢复拥塞窗口的大小,以尽量利用可用的网络带宽。在快恢复算法中,当发送方接收到三个或更多个重复确认时,它会将拥塞窗口的大小减半,并进入快恢复状态。在快恢复状态中,发送方将拥塞窗口的大小逐渐增加,直到接收到新的确认信息。

重传 DACKs 指定的数据包。 如果再收到 DACKs,那么 cwnd 大小增加一。 如果收到新的 ACK,表明重传的包成功了,那么退出快速恢复算法。将 cwnd 设置为 ssthresh,然后进入拥塞避免算法。

拥塞控制和流量控制的区别

流量控制窗口的瓶颈是接收方处理数据的能力,接收方自己可以检测到

拥塞窗口的瓶颈是网络之间是否通常,接收方和发送方都很难检测到 需要两者交流,而选择四种算法之一 有时候发送数据多了,网络拥塞才会体现出来 进而启动拥塞算法