运输层(三)

拥塞控制原理

原因:太多的源想以过高的速率发送数据,为处理网络拥塞,需要一些机制以在面临网络拥塞时遏制发送方(流量控制是接收方控制发送方的传输不会超过接收方的缓存

拥塞表现:丢包、时延长

两种处理方法:

  • 端到端拥塞控制:网络层没有为运输层拥塞控制提供显示支持,端系统必须通过对网络行为的观察来推测是否存在拥塞——TCP
  • 网络辅助的拥塞控制:路由器提供反馈给端系统(ATM【Asynchronous Transfer Mode,异步传输模式】、ABR【Available Bite Rate】)

TCP拥塞控制

通过感知网络拥塞来限制传输速度

如何限制发送方速度

拥塞窗口(cwnd):LastByteSent - LastByteAcked ≤ min{cwnd,rwnd}

假设rwnd足够大,可以忽略它的限制,此时发送方中未被确认的数据量只受限于cwnd

image-20220502091419159.png

$rate \approx \frac{cwnd}{RTT} bytes/sec$

发送方如何感知网络拥塞

出现拥塞:丢包——超时或3个冗余ACK

未出现拥塞:发送方收到ACK信息,网络状态良好,增加拥塞窗口的大小⟶因此TCP被说成是自计时(self-clocking)

改变发送速度的算法

慢启动(slow start)

最开始cwnd=1MSS,$rate \approx \frac{cwnd}{RTT}$,最开始的带宽比rate大得多,cwnd每确认一个传输的报文段就增加1个MSS,相当于指数增长,不断加倍直到出现拥塞

结束

  • 超时引起的丢包:ssthresh(慢启动阈值) = $\frac{cwnd}2$ ,cwnd=1,重新回到慢启动状态
  • 当检测到cwnd≥ssthresh时,进入拥塞避免状态
  • 3个冗余ACK引起的丢包:ssthresh = $\frac{cwnd}2$ ,cwnd=ssthresh+3MSS,进入快速恢复状态
拥塞避免(congestion avoidance)

一轮RTT(发送方每收到1个ACK)增加1个MSS(线性增长

结束

  • 超时引起的丢包:ssthresh = $\frac{cwnd}2$ ,cwnd=1,重新回到慢启动状态
  • 3个冗余ACK引起的丢包:ssthresh = $\frac{cwnd}2$ ,cwnd=ssthresh+3MSS,进入快速恢复状态
快速恢复(fast recovery)

每收到一个冗余ACK,cwnd++

  • 超时引起的丢包:ssthresh = $\frac{cwnd}2$ ,cwnd=1,重新回到慢启动状态
  • 新的ACK:cwnd = ssthresh,进入拥塞避免状态

快速恢复属于非必须构件

【TCP Tahoe】(旧版本):无快速恢复,只要出现丢包就cwnd=1,不用了

【TCP Reno】(新版本):有快速恢复(对于3个冗余ACK),ssthresh = $\frac{cwnd}2$ ,cwnd=ssthresh+3MSS(很可能网络未出现严重拥塞,可以不从1开始)

why cwnd=ssthresh+3MSS?:收到3个冗余ACK,意味着有3个数据包离开网络抵达接收方缓存,即网络中减少了3个数据包,可以将拥塞窗口扩大

TCP拥塞控制的FSM

image-20220502095504710.png

  • 超时进入慢启动
  • 冗余进入快速恢复
  • cwnd不为偶,除以2向下取整
  • 当拥塞窗口接近超时事件出现前拥塞窗口的一半时,从指数增长转为线性增长

image-20220502095741711.png

最后修改:2022 年 05 月 07 日
如果觉得我的文章对你有用,请随意赞赏