运输层(三)
拥塞控制原理
原因:太多的源想以过高的速率发送数据,为处理网络拥塞,需要一些机制以在面临网络拥塞时遏制发送方(流量控制是接收方控制发送方的传输不会超过接收方的缓存)
拥塞表现:丢包、时延长
两种处理方法:
- 端到端拥塞控制:网络层没有为运输层拥塞控制提供显示支持,端系统必须通过对网络行为的观察来推测是否存在拥塞——TCP
- 网络辅助的拥塞控制:路由器提供反馈给端系统(ATM【Asynchronous Transfer Mode,异步传输模式】、ABR【Available Bite Rate】)
TCP拥塞控制
通过感知网络拥塞来限制传输速度
如何限制发送方速度
拥塞窗口(cwnd):LastByteSent - LastByteAcked ≤ min{cwnd,rwnd}
假设rwnd足够大,可以忽略它的限制,此时发送方中未被确认的数据量只受限于cwnd
$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
- 超时进入慢启动
- 冗余进入快速恢复
- cwnd不为偶,除以2向下取整
- 当拥塞窗口接近超时事件出现前拥塞窗口的一半时,从指数增长转为线性增长