网络为什么会拥塞
复习
- 流量控制:接收方用通告窗口限制发送速率
- 滑动窗口:允许连续发送多个尚未确认的数据
- 超时与重传:丢包后会重新发送
TL;DR
- 拥塞由太多数据涌入有限的网络造成
- 拥塞时丢包增加,重传又进一步加剧拥塞
- 重传会让吞吐量不升反降
- 拥塞控制由发送方根据网络状况主动调整速率
正文
流量控制防的是“把接收方压垮”。可就算接收方扛得住,网络本身也可能先受不了。这就是拥塞(congestion)。
高速公路的堵车
想象一条高速公路:车不多时,跑得飞快;车一多,开始减速;再多,就堵上了——每辆车都在场,却谁也走不动。
网络也是这样。路由器有缓冲区,能暂时攒一攒包。可流量一旦超过它的处理能力,缓冲区就满了,后来的包只能被丢弃。
越丢越堵的怪圈
麻烦的是,丢包会触发重传,而重传意味着“又有数据涌进来”。于是形成一个恶性循环:
- 流量过多,路由器丢包
- 发送方发现丢包,重传
- 重传让流量更多,丢包更严重
- 更多重传……
结果就是:发送方明明在拼命发,实际送达的却越来越少。 吞吐量随负载上升到某个点后,反而开始下降。这不是任何一个发送方的错,而是大家一起造成的。
得有人主动退让
既然是“大家一起挤”造成的,就需要发送方主动收敛:感觉网络缓了、丢包了,就放慢一点;顺畅了,再慢慢加速。
这就引出了拥塞控制:它由发送方根据网络状况来调整自己的发送速率,而不是等接收方来提醒。保护对象不是某个端点,而是整条网络的通畅。
这也是一次很有意思的转变:前面的机制都在追求“怎样把数据可靠地送出去”,而拥塞控制追求的是“怎样让大家都能把数据送出去”。从个体最优,转向了整体最优。
那么,发送方具体怎样试探并调整速率?下一章细说。
思考题 1
为什么网络拥塞时,盲目重传反而会让情况更糟?
思考题 2
拥塞为什么可能让吞吐量“不升反降”?
小结
知识点
- 拥塞由过多数据涌入有限网络造成
- 路由器缓冲区满则丢包
- 丢包引发重传,重传加剧拥塞
- 拥塞控制由发送方主动调整速率
参考资料
- Wikipedia(zh):网络拥塞:网络负载过高导致性能下降
- Wikipedia(zh):拥塞控制:调节发送速率以避免网络拥塞
思考题答案(仅供参考)
思考题 1
因为重传本身就是更多流量。网络已经堵住时,再把丢掉的包重新灌进去,只会让路由器更忙、丢得更多,形成越重传越堵的恶性循环。正确的做法是先降速,等缓过来再重传。
思考题 2
因为当负载超过网络容量后,大量数据被丢弃,其中还要搭上重传的开销。真正送达的有效数据反而减少,所以有效吞吐量随负载继续增加而下降。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪