This paper presents a design principle that helps guide placement of functions among the
modules of a distributed computer system. The principle, called the end-to-end argument,
suggests that functions placed at low levels of a system may be redundant or of little
value when compared with the cost of providing them at that low level. Examples
discussed in the paper include bit error recovery, security using encryption, duplicate
message suppression, recovery from system crashes, and delivery acknowledgement. Low
level mechanisms to support these functions are justified only as performance
enhancements