CS PAPERS DEEP-READ · PAPER 45

Congestion Avoidance and Control

Van Jacobson & Michael Karels · SIGCOMM 1988

中文 →

What did this paper do?

In 1988, Van Jacobson patched the internet's transport protocol, TCP, so the whole network wouldn't jam and seize up when traffic surged. Every time you stream a video, download a file, or open a page today, it is quietly working the gas and the brake for you — deciding how fast to send at each moment. Without it, the internet would have buckled more than thirty years ago.

A strange thing first

In the fall of 1986, two machines a few hundred meters apart, just three hops away, saw their speed crash from about 32,000 bits per second to 40 bits per second — nearly a thousand times slower. Nobody pulled a cable, nobody attacked it; everyone just sent as hard as they could, and then nobody could get through. It's like a highway at rush hour: past a certain point, more cars don't mean slower — the whole road locks up and barely moves. Engineers named it congestion collapse.

The idea

There is no central traffic controller on the internet telling each machine how fast to send. Jacobson's key call was: since no one is in charge, let each sender feel out whether the road is jammed and voluntarily hold back. But the network won't announce "I'm congested" — so what does the sender feel with? A humble signal: dropped packets. On a decent link, packets almost never vanish from errors; they vanish because some junction's queue overflowed and threw them away. So "my packet didn't arrive" = "it's jammed ahead." That's the network talking to you.

How it actually pulls this off

Three small moves add up to self-discipline:

Send at the rhythm of the echoes. Every packet you send, the other side answers with an "got it" (an ACK). Jacobson lets the sender release a new packet only when it hears an echo come back — like pouring water into a funnel only as fast as it drains, so the network never overflows. Those returning echoes become a metronome keeping time for you.

Speed up slowly, cut back hard. While all is well, each round nudges the sending rate up just a hair (a cautious probe upward); the instant a packet is lost, halve the rate at once (slam the brakes). Gentle up, brutal down — that asymmetry is exactly what lets everyone settle into a fair share of the road instead of all piling in.

Start by testing, don't floor it. At the start you don't know how wide the road is, so begin with one packet and double each round until you first feel resistance, then switch to the slow nudging — like easing into an unfamiliar road rather than gunning it.

send rate time → double at start nudge up ↗ halve on any loss ↓
Fig · Nudge the rate up while things go well, halve it the moment a packet drops — a "sawtooth" that makes everyone converge to a fair, un-jammed speed.

What it brought

These moves went into the operating systems of the day and became TCP's standard behavior; the internet never suffered another large-scale congestion collapse, and only then could it carry its later explosive growth. To this day, every connection on your phone still runs this "nudge up, halve down" at its core. One honest cost: it treats every lost packet as "jammed" — but on wireless, packets are often lost to interference with no jam at all, and it will still needlessly cut the rate in half. That's its old sore spot in the Wi-Fi and cellular era.

Remember it in one line

With no central dispatcher, let each sender pace its packets to the returning echoes, nudge up while things go well, halve on any loss, and double gently at startup. Through this shared self-discipline of "nudge up, halve down," the internet stops jamming itself even though no one is in charge. It is the invisible driver behind every network connection today.

Want the collapse curve, the ACK-clock, and the mechanics of AIMD and timeout estimation? → Switch to the deep read