4. MP-BGP协议基础与IPv6扩展
BGP-4 最初设计时,报文里承载网络层可达信息的字段是固定的:NLRI 只表达 IPv4 前缀,NEXT_HOP 只表达 IPv4 下一跳。当网络需要承载 IPv6、VPNv4、组播甚至 EVPN 等不同地址族的路由时,如果为每种地址族都定义一套新协议,代价极高。MP-BGP(Multiprotocol BGP)的思路是:保留 BGP-4 的报文框架、状态机和对等体协商机制,把“地址族相关”的部分抽出来,用两个新的可选非传递路径属性承载,从而让同一个 BGP 会话可以同时传递多种地址族的路由。
理解 MP-BGP,关键要抓住三个对象:AFI/SAFI 标识的地址族、MP_REACH_NLRI 属性和MP_UNREACH_NLRI 属性。AFI(Address Family Identifier)标识网络层协议,IPv4 为 1,IPv6 为 2;SAFI(Subsequent Address Family Identifier)标识子地址族,单播为 1,带标签的单播为 4(用于 VPN 场景),组播为 2。AFI=2、SAFI=1 就代表“IPv6 单播”这一地址族。BGP 对等体在建立会话后,通过 OPEN 报文中的 Multiprotocol Extensions Capability(能力码 1)声明自己支持哪些 AFI/SAFI 组合,只有双方都声明的地址族才能交换路由。
MP_REACH_NLRI 与 MP_UNREACH_NLRI 的字段含义
MP_REACH_NLRI 是类型码 14 的可选非传递属性,用于通告某个地址族的可达路由。它的 TLV 结构依次包含:2 字节 AFI、1 字节 SAFI、1 字节下一跳长度、变长下一跳地址、1 字节保留位(SNPA 数量,通常为 0),最后是 NLRI 前缀列表。以 IPv6 单播为例,AFI=2、SAFI=1,下一跳长度为 16 或 32(32 表示同时携带全局地址和链路本地地址),NLRI 部分则是“前缀长度 + 前缀字节”的序列。例如通告 2001:db8:100::/48,前缀长度为 48,前缀字节为 2001:0db8:0100 共 6 字节。
MP_UNREACH_NLRI 是类型码 15 的可选非传递属性,用于撤销某个地址族的路由。它的结构更简单:AFI、SAFI,然后直接是待撤销的 NLRI 前缀列表,没有下一跳字段。当 R1 需要撤销 2001:db8:200::/48 时,就在 UPDATE 中携带 MP_UNREACH_NLRI,AFI=2、SAFI=1,NLRI 中列出该前缀。接收方据此从 IPv6 单播 RIB 中删除对应条目。
这两个属性都是“可选非传递”的。这意味着:如果对端不支持 MP-BGP,收到这类属性后不会继续向它的其他对等体传递,也不会因此重置会话,从而保证了向后兼容性。IPv4 单播路由仍然使用传统的 NLRI 字段,不放入 MP_REACH/MP_UNREACH,因此 IPv4 与 IPv6 路由可以在同一个会话中并行传递。
IPv6 地址族能力协商的实际过程
下面以两台路由器建立同时承载 IPv4 和 IPv6 单播的 BGP 会话为例,说明协商与报文交互的关键环节。假设 R1 的 Router-ID 为 1.1.1.1,R2 的 Router-ID 为 2.2.2.2,二者通过 IPv4 直连地址 10.0.0.1/30 与 10.0.0.2/30 建立对等体,同时希望交换 IPv6 路由。
! R1 关键配置片段(示例)
router bgp 65001
bgp router-id 1.1.1.1
neighbor 10.0.0.2 remote-as 65002
address-family ipv4 unicast
neighbor 10.0.0.2 activate
exit-address-family
address-family ipv6 unicast
neighbor 10.0.0.2 activate
network 2001:db8:100::/48
exit-address-family
配置中 address-family ipv6 unicast 下的 neighbor 10.0.0.2 activate 是核心动作:它让 R1 在向 10.0.0.2 发送的 OPEN 报文中携带 AFI=2、SAFI=1 的 Multiprotocol Extensions Capability。R2 若同样在 IPv6 单播地址族下激活该邻居,也会在 OPEN 中声明 AFI=2、SAFI=1。双方能力交集包含 IPv6 单播,协商成功,此后该会话可以交换 IPv6 路由。
协商成功后,R1 通过 network 2001:db8:100::/48 将本地 IPv6 前缀引入 BGP。R1 向 R2 发送 UPDATE 报文,其中路径属性包含 MP_REACH_NLRI:AFI=2、SAFI=1、下一跳为 R1 的 IPv6 地址(例如 2001:db8::1)、NLRI 为 2001:db8:100::/48。R2 收到后,将该前缀安装到 IPv6 单播 BGP 表中,并参与最佳路径选择。
结果观察与判断依据
在 R2 上执行 show bgp ipv6 unicast summary,应看到邻居 10.0.0.2(或对应 IPv6 邻居)状态为 Established,且地址族列显示 IPv6 单播已激活。执行 show bgp ipv6 unicast,应看到 2001:db8:100::/48 条目,下一跳为 R1 的 IPv6 地址,路径属性中包含 AS_PATH 65001。若在 R1 上撤销该前缀,R2 会收到携带 MP_UNREACH_NLRI 的 UPDATE,对应条目从 BGP 表中消失。
show bgp ipv6 unicast summary 中该邻居的 State/PfxRcd 列有前缀计数或处于可接收状态。若邻居建立但 IPv6 路由为空,优先检查是否只有一端激活了 IPv6 地址族。常见问题与排查要点
- 邻居 Established 但无 IPv6 路由:检查两端是否都在
address-family ipv6 unicast下激活邻居。只有一端激活时,OPEN 能力交集为空,IPv6 地址族不会交换路由。 - 下一跳不可达:MP_REACH_NLRI 中的 IPv6 下一跳必须在接收方路由表中可达。若通过 IPv4 会话传递 IPv6 路由,下一跳通常是发送方的 IPv6 地址,需要确保该地址可被对端解析。
- 前缀未通告:确认
network命令宣告的前缀在本地 IPv6 路由表中存在且为最佳路径,否则 BGP 不会将其放入 UPDATE。 - 能力协商失败:若对端设备较旧不支持 MP-BGP,OPEN 中不会包含 Multiprotocol Extensions Capability,此时 IPv6 地址族无法激活,但 IPv4 会话仍可正常建立。
MP-BGP 的价值在于用一套会话框架承载多种地址族。掌握 AFI/SAFI 的含义、MP_REACH_NLRI 与 MP_UNREACH_NLRI 的字段结构,以及 address-family 下的激活动作,就能理解 IPv6 路由是如何在 BGP 会话中被通告和撤销的。后续在 VPN、EVPN 等场景中,这套机制会以不同的 AFI/SAFI 组合反复出现。