13.2.4 PHP 机制
在下图中,R1、R2、R3均是LSR且激活了LDP,其中R3直连着3.3.3.0/24网段。R3在本地给3.3.3.0/24分配标签1027,并通告给R2。R2收到后将标签存储到本地,在本地为3.3.3.0/24分配一个标签1025,并将标签通告给R1。
这时有个R1收到了一个去往3.3.3.3的IP报文,通过查询自己的ILM表项和NHLFE表项,R1将标签1025压入标签头部,并将报文发送给R2。R2收到后,查询ILM和NHLFE表项后,将标签置换为1027并发给R3。R3收到后,发现查询ILM表时发现Tunnel ID为0x00,动作为弹出,又读取BoS字段发现1027标签就是标签栈的栈底,所以要将标签报文转成IP报文,读取报文中IP头部,发现目的地址为3.3.3.3,读取FIB表发现匹配项,然后将IP报文路由到正确的下一跳设备。
在以上的转发过程可以进一步优化,在R2接收到标签头部是1025的标签报文时,如果直接移除标签头部,将转换得到的IP报文直接发给R3,那么整个转发过程中将会少一次标签值换的操作,提升了转发效率。
PHP(Penultimate Hop Poppoing,次末跳弹出)为解决这个问题而生的。PHP指的就是在次末跳LSR上率先弹出标签头部,将里面的报文转发给出站LSR。典型的PHP机制就是,最后一跳LSR在向倒数第二跳通告标签时,将标签值设置为3。在MPLS中,标签值3含有特殊意义,被称为隐式空标签(Implicit Null Label)。如果LSR发现该报文的入站标签对应的出站标签为3,它将会将报文的标签头部弹出,并将里面所封装的报文转发给最后一跳设备。
如下图所示,激活了PHP后,标签报文的转发动作将发生改变,华为路由器默认激活了PHP机制。