Loading... # 运输层(三) ## 拥塞控制原理 原因:太多的源想以过高的速率发送数据,为处理网络拥塞,需要一些机制以在面临网络拥塞时遏制发送方(**流量控制是接收方控制发送方的传输不会超过接收方的缓存**) 拥塞表现:丢包、时延长 **两种处理方法:** * 端到端拥塞控制:网络层没有为运输层拥塞控制提供显示支持,端系统必须通过对网络行为的观察来推测是否存在拥塞——TCP * 网络辅助的拥塞控制:路由器提供反馈给端系统(ATM【Asynchronous Transfer Mode,异步传输模式】、ABR【Available Bite Rate】) ## TCP拥塞控制 **通过感知网络拥塞来限制传输速度** #### 如何限制发送方速度 拥塞窗口(cwnd):LastByteSent - LastByteAcked ≤ min{cwnd,rwnd} 假设rwnd足够大,可以忽略它的限制,此时发送方中未被确认的数据量只受限于cwnd ![image-20220502091419159.png](http://xherlock.top/usr/uploads/2022/05/1710959873.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](http://xherlock.top/usr/uploads/2022/05/530703715.png) * 超时进入慢启动 * 冗余进入快速恢复 * cwnd不为偶,除以2向下取整 * 当拥塞窗口接近超时事件出现前拥塞窗口的一半时,从指数增长转为线性增长 ![image-20220502095741711.png](http://xherlock.top/usr/uploads/2022/05/2394227408.png) 最后修改:2022 年 05 月 07 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 2 如果觉得我的文章对你有用,请随意赞赏