GO TO A SECTION

↑ ↓ to navigate · Enter to openExplore all sections →
FDEInterviews logo
ACM Transactions on Computer Systems

End-to-End Arguments in System Design

If only the applications at the ends can verify a function completely, building it into lower layers buys performance at most, never correctness. The 1984 rule behind every agent action.

Breakdown by FDE Interviews · 11 min read · Updated

About the original · 1984
AUTHORS
Saltzer, Reed, Clark
FROM
MIT Laboratory for Computer Science
PUBLISHED
Nov 1984 · ACM Transactions on Computer Systems
CITED BY
2,705Semantic Scholar · Oct 2026
IN THIS BREAKDOWN · 10 SECTIONS

You can read 22% of this breakdown.

01

The paper in one minute

Jerome Saltzer, David Reed and David Clark at MIT wrote down a design argument that engineers had used for years without naming it. It is about where to put a function in a layered system: in the communication subsystem, in the application, or both.

The argument: if a function can be completely and correctly implemented only with the knowledge and help of the application at the end points, then providing it in the communication system is not possible. The application has to implement it anyway. A lower-layer version may still be useful, but only as a performance enhancement.

Their main example is careful file transfer from host A to host B. Things can go wrong everywhere: the disk at A returns bad data, software copying buffers makes a mistake, a processor or memory glitches, the network drops or corrupts or duplicates packets, either host crashes partway. Making the network perfectly reliable fixes only one of these. The approach that covers all of them is end-to-end check and retry: B reads the file back from its own disk, computes a checksum, sends it to A, and A compares it with the original's; only if they match is the transfer committed. Since that check is needed anyway, extra network reliability only reduces how often the end-to-end retry is needed.

A real case at MIT made the point. A network of gateways checksummed each hop. One gateway had a fault that swapped a byte pair about once per million bytes while copying between buffers, where no checksum looked. Operating-system source files were corrupted, and their owners had to compare them against old printouts.

The same reasoning applies to delivery acknowledgements (what matters is whether the target acted, not whether the message arrived), encryption, duplicate suppression, message ordering and transactions. The authors close with a caution: the argument is a guideline, and one must identify the ends correctly.

THE IDEA, VISUALLY
CAREFUL FILE TRANSFER, A TO B host A disk + app gateway copies buffers gateway copies buffers host B disk + app link check link check link check end-to-end: checksum at A, verify at B, retry until equal THREATS (THE PAPER'S LIST) 1 disk returns bad data 2 software copies data wrong 3 processor or memory glitch while buffering 4 network drops, changes or duplicates packets 5 either host crashes partway A link check counters only 4. At MIT, gateways checked every hop while one swapped a byte pair in about every million bytes it copied; source files were corrupted, and owners fell back to comparing against old printouts. Lower-level reliability: a performance choice, not correctness. With 1 packet in 100 lost and whole-file retry, expected work grows exponentially with file length. FUNCTIONS THAT BELONG AT THE ENDS Reliable delivery only the application can verify the whole file Acknowledgement "I did it" from the target app, not delivery Encryption keys and plaintext stay in the application Duplicate suppression apps create their own duplicates on retry Ordering FIFO per circuit misses multi-site actions Transactions SWALLOW: no low-level acks, half the messages IDENTIFYING THE ENDS Live voice call drop late packets; people say "say that again" Voice mail deliver every packet correctly; nobody can ask "Not an absolute rule, but rather a guideline": whether a low-level guarantee helps depends on what the ends need.
A careful file transfer can fail at the disk, in software copies, in memory, on the wire or in a crash. Link checks cover only the wire; the MIT gateway that swapped bytes while copying shows why. Only the applications at the ends can confirm the whole job, so lower-level reliability is a performance choice.
Research notes: the problem, approach and results
1 in 10⁶

bytes in which one MIT gateway swapped a byte pair while copying between buffers, behind per-hop checksums

1 in 100

message loss rate in the paper's example where whole-file retry makes transfer time grow exponentially with file length

½

messages SWALLOW sent after dropping delivery acknowledgements the application did not need

THE PROBLEM

When building a layered system, designers must decide which functions (reliable delivery, encryption, duplicate suppression, acknowledgements) each layer should provide. The temptation is to make lower layers as helpful as possible, without a principle for when that actually helps.

THE IDEA

If a function can be completely and correctly implemented only with the knowledge of the application at the end points, the lower layer cannot provide it. The application must do it anyway; a partial version below is justified only as a performance enhancement, and only if its cost is worth it.

THE RESULT

The argument explains careful file transfer (end-to-end checksum and retry), delivery acknowledgements, encryption, duplicate suppression, ordering and transaction protocols, and the datagram-versus-virtual-circuit debate. Applied to the SWALLOW storage system, dropping low-level acknowledgements halved message count.

02

Why it matters to an FDE

Every agent that takes real actions sits in a layered system: model, tool-calling framework, APIs, queues, databases. The end-to-end argument tells you where the checks have to live.

"The API returned 200" is a delivery receipt, not "I did it". An agent that books, pays or updates a record needs confirmation from the system of record that the action took effect: query it back and compare.

Retries create duplicates only the application can recognize. A network or queue that promises exactly-once delivery cannot stop the agent from retrying after a lost reply. Idempotency keys and request IDs belong in the application.

Guardrails in lower layers are performance aids. Schema validation in the framework, retries in the SDK and filters in the model all reduce failure rates. None of them can replace a check against what the user actually wanted, done where that intent is known.

Identify the ends before choosing. A live voice agent should drop late audio rather than wait for retransmission; a transcription pipeline should get every byte. Same data, different ends, different rules.

THE FULL BREAKDOWN

Understand the mechanism. Try it on a real problem.

Unlock this breakdown and 99 more papers.

Premium opens every paper in full, plus every answer, concept, course and guide on the site. One payment for six months of access.

6 months · One payment · No auto-renewal

Get Premium · ₹2,000 / $25
  • ◇1 architecture diagram
  • </>1 runnable code experiment
  • ▦1 results table
  • ?5 interview questions with answers
  1. 03Key takeaways

    The argument stated precisely, the performance trade-off, each example and the misreadings to avoid

    Free account
  2. 04How it works

    The careful file transfer analysis, the performance argument, and each example in turn

    Premium
  3. 05The numbers that matter

    The few quantities in the paper, what they show, and the history behind the argument

    Premium
  4. 06Try it yourself

    Simulate the MIT gateway, the retry economics and duplicate suppression

    Premium
  5. 07Where it breaks

    Where the argument is misapplied, what it does not decide, and later debates

    Premium
  6. 08Using it on a deployment

    Applying the end-to-end argument to an agent that takes real actions

    Premium
  7. 09Interview angles

    Five questions this paper prepares you for, with answer hints

    Premium
Back to the paper library →