Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

网络为什么会拥塞

复习

  • 流量控制:接收方用通告窗口限制发送速率
  • 滑动窗口:允许连续发送多个尚未确认的数据
  • 超时与重传:丢包后会重新发送

TL;DR

  • 拥塞由太多数据涌入有限的网络造成
  • 拥塞时丢包增加,重传又进一步加剧拥塞
  • 重传会让吞吐量不升反降
  • 拥塞控制由发送方根据网络状况主动调整速率

正文

  流量控制防的是“把接收方压垮”。可就算接收方扛得住,网络本身也可能先受不了。这就是拥塞(congestion)。

高速公路的堵车

  想象一条高速公路:车不多时,跑得飞快;车一多,开始减速;再多,就堵上了——每辆车都在场,却谁也走不动。

  网络也是这样。路由器有缓冲区,能暂时攒一攒包。可流量一旦超过它的处理能力,缓冲区就满了,后来的包只能被丢弃。

越丢越堵的怪圈

  麻烦的是,丢包会触发重传,而重传意味着“又有数据涌进来”。于是形成一个恶性循环:

  1. 流量过多,路由器丢包
  2. 发送方发现丢包,重传
  3. 重传让流量更多,丢包更严重
  4. 更多重传……

  结果就是:发送方明明在拼命发,实际送达的却越来越少。 吞吐量随负载上升到某个点后,反而开始下降。这不是任何一个发送方的错,而是大家一起造成的。

得有人主动退让

  既然是“大家一起挤”造成的,就需要发送方主动收敛:感觉网络缓了、丢包了,就放慢一点;顺畅了,再慢慢加速。

  这就引出了拥塞控制:它由发送方根据网络状况来调整自己的发送速率,而不是等接收方来提醒。保护对象不是某个端点,而是整条网络的通畅。

  这也是一次很有意思的转变:前面的机制都在追求“怎样把数据可靠地送出去”,而拥塞控制追求的是“怎样让大家都能把数据送出去”。从个体最优,转向了整体最优。

  那么,发送方具体怎样试探并调整速率?下一章细说。

思考题 1

  为什么网络拥塞时,盲目重传反而会让情况更糟?

思考题 2

  拥塞为什么可能让吞吐量“不升反降”?

小结

知识点

  • 拥塞由过多数据涌入有限网络造成
  • 路由器缓冲区满则丢包
  • 丢包引发重传,重传加剧拥塞
  • 拥塞控制由发送方主动调整速率

参考资料

  1. Wikipedia(zh):网络拥塞:网络负载过高导致性能下降
  2. Wikipedia(zh):拥塞控制:调节发送速率以避免网络拥塞

思考题答案(仅供参考)

思考题 1

  因为重传本身就是更多流量。网络已经堵住时,再把丢掉的包重新灌进去,只会让路由器更忙、丢得更多,形成越重传越堵的恶性循环。正确的做法是先降速,等缓过来再重传。

思考题 2

  因为当负载超过网络容量后,大量数据被丢弃,其中还要搭上重传的开销。真正送达的有效数据反而减少,所以有效吞吐量随负载继续增加而下降。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪