本文档解释为什么Cisco IOS© IPv6提供商边缘路由器(6PE)在数据平面中使用两个多协议标签交换(MPLS)标签。
有关文档规则的详细信息,请参阅 Cisco 技术提示规则。
A.6PE使用两个标签:
顶部标签是传输标签,由标签分发协议(LDP)或MPLS流量工程(TE)逐跳分配。
底部标签是由边界网关协议(BGP)分配并由提供商边缘(PE)路由器之间的内部BGP(iBGP)通告的标签。
当发布6PE时,主要要求是所有MPLS核心路由器(P路由器)都不必须支持IPv6。这一要求促使人们需要在数据层面添加两个标签。6PE需要两个标签的原因有两个。
PHP功能
如果仅使用传输标签,并且使用倒数第二跳跳跃(PHP),则倒数第二跳路由器(P路由器)将需要了解IPv6。
使用PHP时,此倒数第二跳路由器需要删除MPLS标签并将数据包作为IPv6数据包转发。该P路由器需要知道数据包是IPv6,因为P路由器需要对IPv6使用正确的第2层封装类型。(IPv6和IPv4的封装类型不同;例如,对于以太网,IPv6的封装类型是0x86DD,而IPv4的封装类型是0x0800。) 如果倒数第二跳路由器不支持IPv6,则它可能将IPv4的第2层封装类型用于IPv6数据包。出口PE路由器会认为数据包是IPv4。
IPv4和IPv6报头中都存在生存时间(TTL)处理。在IPv6中,该字段称为跳数限制。IPv4和IPv6字段位于报头中的不同位置。此外,还需要更改IPv4报头中的报头校验和;IPv6中没有报头校验和字段。如果倒数第二跳路由器不支持IPv6,则会导致IPv6数据包格式不正确,因为路由器期望在报头中找到TTL字段和报头校验和字段。
由于这些差异,倒数第二跳路由器需要知道它是IPv6数据包。此路由器如何知道数据包是IPv6数据包,因为它没有为IPv6转发等价类(FEC)分配标签,并且MPLS报头中没有封装字段?它可以扫描标签堆栈后的第一个半字节,如果值为6,则确定数据包为IPv6。但是,这意味着倒数第二跳路由器需要支持IPv6。
如果使用显式null标签(因此没有PHP),则此方案可能会起作用。 但是,该决定要求使用PHP。
负载平衡
P路由器上的典型负载均衡遵循此过程。P路由器转到标签堆栈的末尾,通过查看标签堆栈后的第一个半字节来确定它是否是IPv4数据包。
如果半字节的值为4,则MPLS负载为IPv4数据包,P路由器通过散列源和目标IPv4地址来平衡负载。
如果P路由器支持IPv6,而半字节值为6,则P路由器通过散列源和目标IPv6地址来平衡负载。
如果P路由器不支持IPv6,且半字节的值不是4(如果数据包是IPv6数据包,则可能是6),则P路由器会确定它不是IPv4数据包,并根据底部标签做出负载均衡决策。
在6PE场景中,假设有两个出口PE路由器在BGP中向入口PE路由器通告一个IPv6前缀。此IPv6前缀将在BGP中使用两个不同的标签进行通告。因此,在数据平面中,底部标签将是两个标签中的一个。这将允许P路由器在底部标签上按流进行负载均衡。
如果6PE仅使用传输标签来通过MPLS核心传输6PE数据包,则P路由器将无法逐流对这些数据包进行负载均衡,除非P路由器支持IPv6。如果P路由器支持IPv6,它们可以使用源和目的IPv6地址做出负载均衡决策。