- Simplicity versus Flexibility versus Optimality
- Knowing the Problem You're Trying to Solve
- Overhead and Scaling
- Operation Above Capacity
- Compact IDs versus Object Identifiers
- Optimizing for the Most Common or Important Case
- Forward Compatibility
- Migration: Routing Algorithms and Addressing
- Making Multiprotocol Operation Possible
- Running over Layer 3 versus Layer 2
- Determinism versus Stability
- Performance for Correctness
- In Closing
Sometimes in order to be "correct" an implementation must meet certain performance constraints. An example is the bridge spanning tree algorithm. Loops in a bridged network can be disastrous because packets can proliferate exponentially while they are looping. The spanning tree algorithm depends on receipt of spanning tree messages to keep a link from forwarding. If temporary congestion caused a bridge to throw away packets before processing them, the bridge might be throwing away spanning tree messages. Links that should be in hot-standby would forward traffic, creating loops and exponentially more congestion. It is likely that a bridged topology might not recover from such an event. Therefore, it is highly desirable that bridges operate at wire speed.
A lot of denial of service attacks (such as the TCP SYN attack) are possible because nodes are not capable of processing every received packet at wire speeds.