I have often seen that people often confuses between MPLS explicit null and Implicit null label value (I was among those) so in this post will try to ease your confusion on this 🙂
Before starting with these label values, I hope you are aware of MPLS PHP (Penultimate Hop Popping) feature. If you are not let me explain….
Take a look at the below picture, Ingress LSR and Egress LSR are routers which have customer connections on each side and LSRs in figure are inner MPLS routers.
In Normal MPLS operation, IPv4 packet when comes to Egress LSR, will have MPLS Label on the top of IP Header. Egress LSR will do 2 operations and 2 look ups. One in MPLS table and other in IP Routing Table to send the packet to appropriate Customer interface. However these 2 operations increases the memory and CPU consumption on the Egress LSR. To avoid these 2 lookups on Egress, Egress LSR initially send a special label value of 3 to “next-to-last LSR” (called the penultimate LSR). This label 3 is called the IPv4 Implicit Null label. When an LSR receives an MPLS header in which the label is set to 3, it always POPs the header i.e., it removes the top label.
This procedure is called Penultimate Hop Popping (PHP).
So what is Explicit Null?
Ok, when a packet or Ethernet frame is encapsulated in MPLS, you have the option of copying the IP precedence or 802.1p bits to the three CoS bits of the MPLS header i.e. EXP Bits.
If a POP is performed at the penultimate LSR, the EXP bits in the MPLS header are no longer available as a reference for queuing and the packet is queued on the outgoing interface according to the CoS behavior of the underlying payload (in Ipv4 packet, it will be ToS field). An explicit null (Label Value 0 for IPv4), on the other hand, leaves the MPLS header in place until it reaches the egress, preserving the LSP CoS behavior across the entire LSP.
So that’s all for these reserved label values. If you still have any queries, please let me know.