Time To Live (TTL) Processing in Multi-Protocol Label Switching (MPLS) Networks
updated by
- rfc-5462 — Multiprotocol Label Switching (MPLS) Label Stack Entry: "EXP" Field Renamed to "Traffic Class" Field
updates
- rfc-3032 — MPLS Label Stack Encoding
Extracted elements (18)
RFC 3032 (MPLS-ENCAPS) only covered the Uniform Model and did not address the Pipe Model, Short Pipe Model, hierarchical LSPs, or TTL processing with Penultimate Hop Popping (PHP). This document fills those gaps.
The Pipe Model is introduced to support MPLS LSPs where packets see the tunnel as a single hop regardless of the number of intermediate LSRs, making the MPLS network act like a circuit with only ingress and egress points visible to outside nodes. This formalizes an existing operational practice used in multiple networks.
In the Short Pipe Model with PHP enabled, the TTL of the tunneled packet is unchanged after the PHP operation itself; the egress node performs the final decrement. This differs from non-PHP behavior only in which node performs the second decrement.
Signaling the LSP type (Pipe, Short Pipe, or Uniform Model) is out of scope for this document and is not addressed in current label distribution protocols LDP and RSVP-TE. LSP type is currently configured manually by network operators via CLI or network management interfaces.
Decrementing iTTL by a value larger than 1 SHOULD only be used to compensate for network nodes incapable of decrementing TTL values. Implementers MUST ensure the TTL value does not become negative during decrements.
For PHP operations, the oTTL check MUST be performed regardless of whether oTTL is used to update the outgoing header TTL. For Short Pipe Model PHP, the exposed header TTL is neither checked nor updated; for Uniform Model PHP, the exposed header TTL is set to oTTL.
The oTTL check MUST verify that oTTL is greater than 0; if the check fails, the packet is not forwarded. The oTTL check is only performed when an outgoing TTL (IP or MPLS) is set to oTTL.
When multiple sequential Pop operations are performed, the iTTL computed during the previous Pop is used as the TTL for subsequent labels being popped; the TTL contained in the subsequent label is ignored and replaced with the previously computed iTTL.
At tunnel ingress (Push), each Uniform Model pushed label copies its TTL from the label or IP packet immediately underneath it. Each Pipe Model or Short Pipe Model pushed label has its TTL set to a network-operator-configured value, defaulting to 255 in most implementations.
For IP packet routing, the outgoing IP TTL is set to oTTL (iTTL - 1). For MPLS Swap-only, the swapped label TTL is set to oTTL. For Swap followed by Push, the swap is performed first and pushed label TTLs are determined per section 3.6.
For IP packets, iTTL is the TTL of the incoming IP packet. For MPLS Push/Swap/PHP operations, iTTL is the TTL of the topmost incoming label. For Pop (tunnel termination), iTTL depends on tunnel type: Pipe Model uses the exposed header TTL, Uniform Model uses the TTL of the popped label.
iTTL is the incoming TTL value used for forwarding decisions with no checks performed on it. oTTL is always iTTL minus 1 and is the value used as the outgoing TTL.
The MPLS shim header contains four fields: a 20-bit Label, an 8-bit TTL, a 1-bit Bottom of Stack indicator, and 3 Experimental bits (later redefined by RFC 3270 for DiffServ scheduling/shaping behavior).
This document does not introduce new security issues beyond those in RFC 3032 (MPLS-ENCAPS) and RFC 3270 (MPLS-DS). It does not define a new protocol or expand an existing one. Clarifying TTL handling benefits troubleshooting for service providers and customers.
In the Pipe Model (without PHP only), TTL treatment is identical to the Short Pipe Model without PHP: the outer TTL is independent of the inner, and the tunneled packet TTL is decremented by two across the LSP.
In the Short Pipe Model with PHP, the penultimate node pops the label leaving the tunneled header TTL unchanged, and then the egress node decrements it. The total TTL decrement across the LSP is still two, with or without PHP.
In the Short Pipe Model without PHP, the outer (tunnel) TTL is independent of the tunneled packet TTL. The tunneled packet TTL is decremented by exactly two across the entire LSP (once at ingress Push, once at egress Pop).
In the Uniform Model, inner and outer TTLs are synchronized at tunnel ingress and egress: the outer label TTL is copied from the inner header at Push, decremented at each swap hop, and the inner TTL is set to the final outer TTL value at Pop.