Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

拥塞控制(进阶)

复习

  • 网络为什么会拥塞:太多数据涌入有限网络
  • 滑动窗口:窗口大小决定在途的数据量
  • 流量控制:接收方限制发送速率

本章为进阶内容,零基础读者可以跳过,不影响后续阅读。

TL;DR

  • 拥塞控制让发送方自己试探网络的承载能力
  • 慢启动从小窗口开始,快速上升
  • 遇到拥塞就把窗口减半,之后逐步恢复
  • 核心思路:加性增、乘性减

正文

  上一章说,拥塞需要发送方主动收敛。可发送方并不知道网络到底能承多少——因为网络不会直接告诉你“现在还能发多少”。它能依靠的,只有“丢没丢包”这个间接信号。

  于是,发送方只能一边发,一边试探。

一个“拥塞窗口”

  发送方额外维护一个拥塞窗口(congestion window),代表“我估计网络还能承受的在途数据量”。

  实际能发多少,要同时看两个限制:接收方通告的窗口,和这个拥塞窗口。取两者中较小的那个——一个管端点,一个管网络。

慢启动:从小步到大步

  连接刚开始时,谁也不知道网络能承多少,所以从很小的窗口起步,这叫慢启动

  “慢”只是起点小,增长却很快:每收到一个确认,窗口就翻倍。于是 1、2、4、8……呈指数增长,迅速逼近网络的承受能力。

  为什么要指数增长?因为如果不先快速试探,一条高带宽链路可能很久都用不满;指数上升能让发送方尽快找到“大概能发多少”。

撞墙就减半

  一旦探测到丢包(通常意味着网络开始拥塞),发送方立即把窗口减半,然后改为线性增长——每经过一个往返,只增加一点点,小心翼翼地往上爬。

  这套组合叫 AIMD(加性增、乘性减):

  • 顺畅时,一点一点加(加性增)
  • 拥塞时,直接砍一半(乘性减)

  为什么要“慢慢加、砍一半”?因为多个发送方都在这么做时,它们会围绕网络容量上下波动,且谁也不会长期独占:加得太猛的那个先撞墙、先减半,其他人就能分到更多。最终,带宽被大致公平地分享。

  这又是一次局部规则产生全局秩序的精彩例子:每个发送方只顾自己试探,整张网络却呈现出有序与公平。

思考题 1

  慢启动阶段窗口为什么要指数增长,而不是一开始就发得很快?

思考题 2

  “加性增、乘性减”为什么有助于多个发送方公平地分享带宽?

小结

知识点

  • 发送方用拥塞窗口试探网络承载能力
  • 实际速率取接收窗口与拥塞窗口的较小值
  • 慢启动阶段指数增长,拥塞时减半
  • AIMD:加性增、乘性减,促成公平分享

参考资料

  1. Wikipedia(zh):拥塞控制:避免网络过载的发送速率调节
  2. Wikipedia(zh):TCP拥塞控制:慢启动、拥塞避免与快速恢复

思考题答案(仅供参考)

思考题 1

  因为一开始并不知道网络能承受多少,发太猛容易立刻造成拥塞。从小窗口起步、指数上升,既能快速试探出大致容量,又不至于一上来就把网络压垮,是“谨慎起步、快速试探”的平衡。

思考题 2

  因为加性增让各方慢慢往上探,谁先撞墙谁先减半,乘性减又让过载的一方显著退让。多轮下来,各方的速率会围绕容量彼此靠近,谁也无法长期独占,从而形成大致的公平。

协议

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

封面图

设计师 | 南国微雪