拥塞控制(进阶)
复习
- 网络为什么会拥塞:太多数据涌入有限网络
- 滑动窗口:窗口大小决定在途的数据量
- 流量控制:接收方限制发送速率
本章为进阶内容,零基础读者可以跳过,不影响后续阅读。
TL;DR
- 拥塞控制让发送方自己试探网络的承载能力
- 慢启动从小窗口开始,快速上升
- 遇到拥塞就把窗口减半,之后逐步恢复
- 核心思路:加性增、乘性减
正文
上一章说,拥塞需要发送方主动收敛。可发送方并不知道网络到底能承多少——因为网络不会直接告诉你“现在还能发多少”。它能依靠的,只有“丢没丢包”这个间接信号。
于是,发送方只能一边发,一边试探。
一个“拥塞窗口”
发送方额外维护一个拥塞窗口(congestion window),代表“我估计网络还能承受的在途数据量”。
实际能发多少,要同时看两个限制:接收方通告的窗口,和这个拥塞窗口。取两者中较小的那个——一个管端点,一个管网络。
慢启动:从小步到大步
连接刚开始时,谁也不知道网络能承多少,所以从很小的窗口起步,这叫慢启动。
“慢”只是起点小,增长却很快:每收到一个确认,窗口就翻倍。于是 1、2、4、8……呈指数增长,迅速逼近网络的承受能力。
为什么要指数增长?因为如果不先快速试探,一条高带宽链路可能很久都用不满;指数上升能让发送方尽快找到“大概能发多少”。
撞墙就减半
一旦探测到丢包(通常意味着网络开始拥塞),发送方立即把窗口减半,然后改为线性增长——每经过一个往返,只增加一点点,小心翼翼地往上爬。
这套组合叫 AIMD(加性增、乘性减):
- 顺畅时,一点一点加(加性增)
- 拥塞时,直接砍一半(乘性减)
为什么要“慢慢加、砍一半”?因为多个发送方都在这么做时,它们会围绕网络容量上下波动,且谁也不会长期独占:加得太猛的那个先撞墙、先减半,其他人就能分到更多。最终,带宽被大致公平地分享。
这又是一次局部规则产生全局秩序的精彩例子:每个发送方只顾自己试探,整张网络却呈现出有序与公平。
思考题 1
慢启动阶段窗口为什么要指数增长,而不是一开始就发得很快?
思考题 2
“加性增、乘性减”为什么有助于多个发送方公平地分享带宽?
小结
知识点
- 发送方用拥塞窗口试探网络承载能力
- 实际速率取接收窗口与拥塞窗口的较小值
- 慢启动阶段指数增长,拥塞时减半
- AIMD:加性增、乘性减,促成公平分享
参考资料
- Wikipedia(zh):拥塞控制:避免网络过载的发送速率调节
- Wikipedia(zh):TCP拥塞控制:慢启动、拥塞避免与快速恢复
思考题答案(仅供参考)
思考题 1
因为一开始并不知道网络能承受多少,发太猛容易立刻造成拥塞。从小窗口起步、指数上升,既能快速试探出大致容量,又不至于一上来就把网络压垮,是“谨慎起步、快速试探”的平衡。
思考题 2
因为加性增让各方慢慢往上探,谁先撞墙谁先减半,乘性减又让过载的一方显著退让。多轮下来,各方的速率会围绕容量彼此靠近,谁也无法长期独占,从而形成大致的公平。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪