- 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
- Parameters
- Making Multiprotocol Operation Possible
- Running over Layer 3 versus Layer 2
- Robustness
- Determinism versus Stability
- Performance for Correctness
- In Closing
18.5 Compact IDs versus Object Identifiers
Often, a protocol contains a field identifying something, such as a protocol type. If there is a central authority handing out the numbers, the numbers can be compact because they can be handed out sequentially. Most IETF standards have numbers assigned by the IANA. I'll call this approach "IDs."
An alternative to IDs is an "object identifier," as in ASN.1. Object identifiers are very large but because of their hierarchical structure they have the advantage that it is not necessary to obtain one from a central authority.
Another advantage of object identifiers is that you can get one without telling anyone. A company might want to deploy proprietary extensions without letting anyone know that they are doing this. With an ID approach assigned by a central authority, it is common for the central authority to have a policy that you are not allowed to obtain an ID without documentation of the feature. Sometimes there is the additional requirement that such documentation be publicly divulged.
There are several disadvantages to object identifiers.
-
The field is larger and variable-length, and therefore it consumes memory, bandwidth, and CPU.
-
There is no central place to look up all the currently used object identifiers, so it might be difficult to debug a network.
-
Sometimes the same protocol winds up with multiple object identifiers. This is a result of not having central coordination. Two different organizations might define an object identifier for the same protocol. Then it is possible that two implementations might be in theory interoperable, but because the object identifiers assigned differ, the two implementations would be unable to interoperate.