(i) Point of the paper
The paper presents a philosophy for designing systems. It seems to me that this was a very influential paper in molding the existing thought in 1980’s. The paper argues that:
- Application knows best: The application sitting at the topmost layer in the systems hierarchy can decide how important a given functionality or correctness is to itself. Lower layers (below the application) can, at best, come to some general conclusions about the application requirements. This could potentially add overhead to those applications that deviate from the general behavior. Example: Audio/Video transmission can afford to lose some packets, but rather want minimum delay guarantees. Implementing correctness mechanisms at layer 2 will not allow such an application to exploit its unique relaxation.
- Avoid redoing work at multiple layers: If a particular functionality has to be implemented at a higher level anyway, there is no need for it to be implemented at the lower layers as well if the goal is to ensure correctness. Example: Since packet acknowledgments cannot be avoided end-to-end, having acknowledgments for each frame hop-to-hop at layer 2 adds nothing but overhead.
- Decide on layering: The authors do not reject the idea of implementing a functionality at a lower layer if it means improvement in performance. Demarcating the boundaries between the layers is a critically important task. They recommend that the designer should do a careful analysis of the performance gain achieved by a lower layer functionality in trade-off with the cost of implementing it at that layer. Example: If it turns out that the bit-level error is high in the network, it makes sense to have error-checking and retransmission of frames at layer 2; this would reduce the end-to-end retransmission traffic.
(ii) Most glaring problem
Perhaps the most glaring problem I see in this work is the following: I feel the authors have not shown enough appreciation for the importance of performance gain achieved by implementing a function at a lower layer. While it is certainly true that end-to-end implementation would leverage the knowledge of the application requirements, it would fail to exploit the the trust the application places on the lower layers. Let me illustrate this with the paper example of the careful file transfer.
The paper says that after the file block is written to the disk at the destination, it is reloaded into memory, its checksum is calculated and sent across the network to the sender. The sender confirms the checksum, and the transaction gets committed. Now, if the application were to trust the disk writes to happen without bit errors, this unnessary reloading the file into memory and commit protocols could be avoided. It turns out that TCP (a level below the application layer) does exactly this today. The sender computes the checksum and sends with the packet, which is compared at the receiver end. This avoids the performance loss associated with end-to-end argument by placing trust on the local disk writes.
Another example I can think of is a network firewall, which is implemented at layer 3 in practice for performance, though technically it should be placed at layer 7.
(iii) Scope for future research
As the authors point out, the success of any end-to-end implementation lies in identification of the ends. Layering should be done carefully in order to achieve correctness and performance, at a reasonable tradeoff. We need to keep in mind that microkernels did not become popular because of performance loss associated with implementing common functionalities at the upper user level. The OSes like Unix and Windows are popular because they put functions into the kernel level. This shows the need for us to design systems which allow for lightweight applications to be built easily.