Summary. The paper states a design principle called the end-to-end argument and provides several examples of where the principle can be used. Regarding an applications functionality, the end-to-end argument states that:
Identifying the ends. It is not always easy to identify the ends. In other words, the level at which error detection is placed can vary from system to system. For example, in a real-time voice transmission (phone call), the end would be the humans as doing guaranteed error recovery at the network level would most likely induce unacceptable delays. In a non-real time voice transmission, however, error recovery may be desirable. In airline reservation systems, the human will check that the reservation was confirmed through system crashes, etc.. End-to-end examples: reliable tape subsystem (humans, machines unreliable) and RISC chips (no use trying to guess the user's needs).
Open Operating System: In an operating system, functions shouldn't be permanent parts of lower level module. Rather, they should be replaceable. This way, those apps that need to can implement their own functionality.
Careful file transfer. When doing file transfer, errors can come up in any level. The error checking at the app level can be done by computing a checksum at each end and comparing.
Delivery guarantees. An app might really want to know if host acted on message rather than that the message arrived. So, can have the end app send a reply message stating what action was taken. Could try to avoid this by having the host guarantee to act but the host might refuse to act. This also won't work for two-phase commit transactions as all involved nodes must communicate before knowing to commit.
Secure transmission of Data. May be necessary at network level to ensure that misbehaving app doesn't send private data out without encrypting, but the encryption algorithm for this level is much sophisticated than that required by app: no user keys, all hosts can use same key & change frequently.
In-order delivery. Although many protocols guarantee in-order delivery, it cannot detect out of order messages in a distributed application environment.
Transaction management. MIT built a storage system called SWALLOW that sent with each message an object id to read/write, read/write mode and the version of the object. SWALLOW sends a write request reponse saying that the data written safely. Because SWALLOW can detect duplicates using the object ID and versions, no duplicate suppression is necessary. Also, no acknowledgement is needed at the network level since SWALLOW sends a high-level acknowledgement.