IT 论文精读 · PAPER 45

Congestion Avoidance and Control(TCP 拥塞控制)

Van Jacobson & Michael Karels · SIGCOMM 1988

EN →

这篇论文干了什么?

1988 年,Van Jacobson 给互联网的传输协议 TCP 打了一个补丁,让全网在流量暴涨时不会一起卡死。你今天每一次刷视频、下文件、开网页,背后都有它悄悄在替你「踩油门、踩刹车」——决定这一刻该发多快。没有它,互联网早在三十多年前就撑不下去了。

先说个怪事

1986 年秋天,两台相距几百米、中间只隔三跳的机器之间,网速从每秒 3 万多比特暴跌到每秒 40 比特——慢了将近一千倍。没有人拔线、没有人攻击,就是大家一起拼命发,结果谁也发不动了。这很像高峰期的高速:车一多到某个点,不是慢一点,而是整条路彻底堵死、几乎不动。工程师给这个现象起了个名字:拥塞崩溃

那个点子

互联网上没有一个交通指挥中心告诉每台机器该发多快。Jacobson 的关键判断是:既然没人管,那就让每个发送方自己去「感觉」路堵不堵、然后自觉地收着点发。可网络又不会主动说「我堵了」——那发送方靠什么感觉?靠一个朴素的信号:丢包。在一条好线路上,包很少因为出错而丢,几乎全是因为某个路口排队排爆了、被丢掉。所以「我发的包没到」=「前面堵了」,这就是网络在跟你说话。

它到底怎么做到的

三个小动作,凑成一套自律:

按回音的节奏发。每发出一个包,对方收到会回一声「收到」(ACK)。Jacobson 让发送方只有听到一声回音、才放一个新包进网——就像往漏斗里倒水,只按它漏下去的速度倒,网络自然不会被灌爆。这声声回音,就成了替你打拍子的节拍器。

顺时慢加、堵时猛减。一切顺利时,每过一轮就把发送量悄悄加一点点(小心翼翼往上试探);一旦丢了包,立刻把发送量砍掉一半(急刹车)。慢慢加、狠狠减——正是这种「不对称」让所有人最终稳稳分到一份公平的带宽,而不是一起挤爆。

起步先试探,别一上来就猛冲。刚开始不知道路有多宽,就从发一个包起步、每轮翻倍,直到第一次感到阻力再转成慢加——像进一条陌生的路先探探深浅,而不是一脚油门冲进去。

发送量 时间 → 起步翻倍 慢慢加速 ↗ 一丢包就减半 ↓
图 · 顺时一点点加速、丢包时立刻减半——形成一条「锯齿」,让大家自动收敛到公平又不堵的速度。

带来了什么

这套办法被装进当年的操作系统、成了 TCP 的标准动作,互联网从此再没发生过大范围拥塞崩溃,也才撑得起后来爆炸式的增长。直到今天,你手机上每一条连接,骨子里还在跑它的「慢加猛减」。诚实地说一句代价:它把所有丢包都当成「堵了」——可无线网里,包常常是被干扰弄丢的、路根本没堵,这时它也会白白地把速度减半,这是它在 Wi-Fi、4G 时代被诟病的老毛病。

一句话记住

没有中央调度,就让每个发送方按「对方的回音」打拍子发包、顺利时慢慢加速、一丢包就把速度砍半、起步先翻倍试探——靠这套人人自律的「慢加猛减」,互联网在没人指挥的情况下不再一起堵死。它是今天每一条网络连接的隐形司机。

想看拥塞崩溃曲线、自时钟原理、AIMD 与超时估计的机制? → 切到精读版