CS PAPERS DEEP-READ · PAPER 39

End-to-End Arguments in System Design

Saltzer, Reed & Clark · MIT · 1984

中文 →

What did this paper do?

In 1984, three MIT researchers (Saltzer, Reed, Clark) wrote a short paper answering a question every system designer runs into: should a given function be built into the network for everyone to share, or left to the programs at the two ends to do themselves? Their answer shaped the entire internet — it's why the network itself is a "dumb pipe" while the real cleverness (TCP that guarantees delivery, HTTPS that encrypts) lives in your computer and the server, not in the routers in between.

An analogy first

You need to mail an important contract. The courier swears the package "will never be lost or damaged in transit." But even if they keep that promise perfectly — you might have left a page out before sealing the envelope, and the recipient might drop it next to a shredder after opening it. A reliable courier can't control what happens outside the envelope. So the only truly dependable approach is this: the recipient checks the received document against a checklist, and if a page is missing, asks you to resend.

What has this got to do with networks?

To move a file from one computer to another, the data travels: disk → memory → cables and routers → back into memory → written to disk again. The instinct is: just make the network responsible for "guaranteeing no errors" and we're done, right? But the stretch after the data leaves the network and before it's written to disk is invisible to the network — a bit flipping in memory, a byte written wrong to disk: the network can't touch those, and doesn't even know. It can only guarantee "the leg that runs over the wire."

The plain but deep judgment

So the three proposed: some functions can only be implemented completely and correctly by the programs actually sending and receiving the data at the two ends; if the network in the middle rushes to do the same thing, it does it incompletely AND slows everyone down. So — leave those functions to the ends, and keep the network simple. This is the "end-to-end argument."

For file transfer specifically, the dependable method is for each end to compute a "fingerprint": the sender computes a short checksum of the original file, the receiver computes another one of the file it received and wrote to disk, and compares. If they differ, resend. This "check at both ends" catches an error in any link of the whole chain — including the ones the network can never see. Since the ends have to do this check anyway, the network additionally guaranteeing "no loss, no errors" is redundant for the question of whether the file is actually correct (at best it saves a few resends — a performance convenience, not a correctness necessity).

What did it bring about?

This principle became the internet's skeletal philosophy — "dumb network, smart ends." The network core just does its best to fling packets toward the target; it guarantees neither delivery nor order. Real reliable transport, encryption, and identity checks all live in your computer and the server, the two ends. The payoff: the network is simple and general, and anyone can run new tricks on top of it — web pages, video, live streaming, blockchains — without changing the network itself. That today's internet grew the way it did is, to a large degree, because it was built to this sentence.

But it isn't an iron law: if one stretch of the path is especially bad (say, the poor-signal wireless links of the early days), having the lower layer patch errors first is genuinely worth it — which functions to push to the ends and which to keep in the network still takes engineering judgment.

Remember this

Some things can only be gotten right by the two ends themselves (like confirming a file arrived byte-for-byte); the network in the middle can't do them completely and drags everyone down trying — so leave the clever work to the ends and keep the network simple. The internet's "dumb pipes + smart endpoints" comes straight from this.

Want the full file-transfer threat model, how the end-to-end check runs, and why it's the philosophical foundation of TCP/IP? → Switch to the deep read