End-to-End Principle

The end-to-end principle is one of the most influential design ideas in computer networking. It was articulated by Jerome H. Saltzer, David P. Reed, and David D. Clark in their paper “End-to-End Arguments in System Design,” published in ACM Transactions on Computer Systems, volume 2, number 4, in November 1984 (pages 277 to 288). The paper offers, in its own words, a rationale “for moving function upward in a layered system, closer to the application that uses the function.”

The core argument is that many functions can only be completely and correctly implemented with knowledge that exists at the endpoints of a communication, so implementing them in the lower levels of the network is often unnecessary and sometimes counterproductive. The authors’ canonical example is reliable file transfer: even if every individual link guarantees error-free delivery, errors can still occur in host memory, on disk, or in the software between the network and the file, so the application must check the result end to end anyway. Once the endpoints perform that final check, duplicating the same guarantee inside the network adds cost while providing only a performance optimization, not correctness.

This reasoning explains why the internet’s lower layers were deliberately kept simple. The Internet Protocol makes only a best effort to deliver datagrams and offers no reliability, leaving ordered, reliable delivery to TCP running in the hosts. Keeping the network simple and pushing intelligence to the edges made the internet easy to extend: new applications could be deployed at the endpoints without changing the routers in the middle.

The end-to-end principle shaped both the technical architecture and later debates about how networks should evolve, including arguments about network neutrality and where new features should live. It remains a touchstone for system designers deciding which functions belong in shared infrastructure and which belong in the applications that use it.