RFC8277:使用BGP通告路由和标签的绑定
1. 介绍
即使现在很多设备都已实现了RFC 3107机制,但是还是存在很多问题导致在过去和已知的未来会对互操作有影响。这主要表现在:
● 在RFC 3107中定义了,在单个BGP update消息中,一条prefix可以binding多个标签,但是没有为这多个标签规定语法语义。
● 现在多数的厂家设备实现RFC 3107时都只实现了一条prefix只binding一个标签,如果收到一条prefix绑定多个标签时都不能正确的处理。这样在不同厂家设备就会出现不能正确交互的问题。
● 对于撤销prefix和label的binding时的说明也不明白
● RFC 3107里定义的一个可选的特性:通告多条路由到同一目的,该特性从来就没有被实
现。并且,通告多路由的功能可以使用RFC 7911里定义的规程来实现,因此这个可选特性这次就废弃了。
● BGP或许同时从不同邻居收到到同一目的的路由,但是一条含有标签,另一条没有标签。RFC 3107没有说明针对这样的情况,哪条路由更优先而需要被通告给其他邻居。
● RFC 3107没有说明当在VPN-IPv[RFC 4364]和VPN-IPv6[RFC4659]用时该如何处理
RFC 8277定义了一个新的BGP Capability,可以用在binding多个标签的时候。该能力一定程度上也解决了互操作的问题。
R梦想就在前方FC 8277同时去除了关于通告多路径的能力,而是定义了如何使用RFC 7911来实现这样的功能。
RFC 7911主要内容就是定义了如何唯一的确定BGP update消息中的前缀/路由。通常,只使用NLRI中的Prefix来确定不同的前缀/路由,两个Update消息中NLRI/MP_REACH_NLRI字段的prefix如果一样的话,就认为是对相同路由的更新。RFC 7911重新定义了一个路径属性——Path Identifier(PI,路径标识符:4字节)——来和Prefix一起来唯一的确定一条前缀的更新。如果prefix相同,但是PI不相同,则认为这是两条不同的前缀/路由更新消息。PI是由本地定义的,BGP好车牌号在向邻居通告学习到的含有PI属性的前缀/路由时,需要使用本地定义的PI策略来替代学习到的PI。 |
|
另外,也说明了当遇到收到多条同样的路由但是有的有标签有的没有标签时,如何选择的问题。但是,为了兼容性,对这些的路由的选择都是基于本地策略进行。
靠近一点点歌词2. 1条路由绑定1个或多个标签
BGP会通告为一条前缀/路由绑定一个或多个连续的标签。这时BGP update 消息中使用MP_REACH_NLRI属性,前缀和标签的绑定信息在NLRI字段内说明。根据NLRI的prefix/前缀的类型,可以有下面的不同:
☞ 如果NLRI的prefix的是IPv4或VPN-IPv4,则MP_REACH_NLRI的AFI为1。如果NLRI的prefix是IPv6或VPN-IPv6,则MP_REACH_NLRI的AFI为2.
☞ 如果前缀是IPv4或是IPv6,则SAFI需要设置为4.如果前缀是VPN-IPv4或者VPN-IPv6,则SAFI需要设置为128.
关于BGP update消息中Next Hop地址的内容,在[RFC4364], [RFC4659], [RFC4798], [RFC5549]等文档中都已经详细规定了。
Table 1 相关RFC
RFC 4364 | BGP MPLS IP Virtual Private Networks (VPNs) |
RFC 4659 | BGP-MPLS IP Virtual Private Network (VPN) Extension for IPv6 VPN |
RFC4798 | Connecting IPv6 Islands over IPv4 MPLS Using IPv6 Provider Edge Routers (6PE) |
RFC5549 | Advertising IPv4 Network Layer Reachability Information with an IPv6 Next Hop |
| |
已经有多个应用使用BGP通告标签和前缀的绑定的方法来实现的,比如[RFC7432 BGP MPLS-Bad Ethernet VPN],[RFC6514 BGP Encodings and Procedures for Multicast in MPLS/BGP IP VPNs],[TUNNEL-ENCAPS,The BGP Tunnel Encapsulation Attribute]中定义的应用。其中TUNNEL-ENCAPS 目前还处于草案阶段,草案文档:draft-ietf-idr-tunnel-encaps-10
因此,RFC8277并没有声称这是唯一使用BGP通告标签和前缀进行绑定的标准。
约定,若BGP update消息中MP_REACH_NLRI的SAFI是4,我们用“SAFI-4 UPDATE”来指代该Update消息黑蒜的做法。
本RFC定义了一个新的BGP可选能力:Multiple Labels Capability。
2.1. Multiple Labels Capability
在RFC 5492中定义了一个"Capabilities Optional Parameter",BGP用来在OPEN消息中携带自己支持的扩展能力,和邻居协商。这个能力可选参数包括3部分:1字节的Capability Code、1字节的Capability length、一个变长的Capability Value字段。
Multiple Labels Capability的code字段值为8.
Value字段如下所示:
Figure 1 value field of the Multiple Labels Capability
value由一个或多个三元组组成,每个三元组由4字节:2字节的AFI、1字节的SAFI和1字节的Count。Count是BGP能处理的一条前缀/路由所绑定的最大的标签数量。若Count=255,则说明没有限制。如果有多个这样的三元组的AFI/SAFI相同,但是Count不同,则只认为第一个三元组是正确的,其他都要忽略。另外,Count也不能是0或者1,当Count是0或者1时也要忽略。
双瓜糖安胶囊同样,如果收到一个邻居的多个OPEN消息,每个OPEN消息都有Multiple Labels Capabilit
y,则只接受第一个OPEN消息中的参数。
| BGP邻居对Multiple Labels Capability可选能力的协商是双向的,通过OPEN消息进行协商。如果本端路由器没有发送含有Multiple Labels Capability的OPEN消息,或者没有接收到对端设备发送的含有的Multiple Labels Capability 的OPEN消息,则BGP不能在UPDATE消息中将一条prefix绑定多个标签,只能进行1对1的前缀/路由和标签的绑定。 |
| |
Multiple Labels Capability的Length必须是4的倍数,如果不是,则就认为是畸形的或者错误的。
Multiple Labels Capability对开启了GR的BGP要求如下操作:BGP开启了GR功能,但是BGP会话遭遇了fail,然后BGP ssion重新建立。如果BGP邻居在遭遇fail前已经通告了Multiple Labels Capability能力,但是,BGP ssion重新建立后没有通告Multiple Labels Capability能力,则之前保持的路由就要全部显式的撤销。或者,重新建立后通告的Multiple Labels Capability的Count有了变化,则保持的路由中,标签数大于该Count的路由也必须被显式的撤销。
2.2. 当没有启用Multiple Labels Capability的NLRI格式
没有启用Multiple Labels Capability时,BGP Update中的NLRI只会出现一个标签,即一条prefix只和一个标签进行绑定。
Figure 2 NLRI with One Label
Length
1个字节。以bit来表示NLRI整个字段除length字段外剩下字段全部的长度。
Label
20bits。
Rsrv
保留,必须为0
S
必须被设置为1
如果发送路由和标签绑定的BGP路由器同时也启用了RFC 7911,则NLRI中会在Length字段前再增加一个Path identifier字段。
北大哲学系2.3. 当启用了Multiple Labels Capability的NLRI格式
Figure 3 NLRI with Multiple Labels
Length
做一个战士1个字节。以bit来表示NLRI整个字段除length字段外剩下字段全部的长度。
Label
20bits。
Label
20bits。
Rsrv
南洋艺术学院保留,必须为0
S
如果S后面的字段是Prefix,则S需要设置为1,否则,S需要被设置为0.
同样的,如果发送路由和标签绑定的BGP路由器同时也启用了RFC 7911,则NLRI中会在Length字段前再增加一个Path identifier字段。
2.4. 显式撤销路由和标签的绑定
当使用MP_UNREACH_NLRI显式的撤销路由和标签的绑定时,NLRI字段的格式为:
Figure 4 NLRI for Withdrawal
Compatibility字段必须设置为0x800000,接收端忽略该字段。可以使用该封装格式来撤销为Prefix分配的任何标签。另外,要撤销的路由的AFI/SAFI、Length必须和要实际的路由匹配。
2.5. 更改路由绑定的标签
案例:
BGP speaker [S1]从邻居A接收到一个Update消息[U1],为前缀P绑定了一个标签L1,并且下一跳是N1。然后,S1又从邻居A接收到一个Update消息[U2],U2中为前缀P分配的标签为L2,下一跳还是N1。则:
如果没有Path identifier属性,则认为后面的标签L2是最新的绑定信息,L2会取代L1成为P到N1的标签。这称为隐式的撤销标签绑定信息。
如果有Path identifier属性,U1的PI为I1,U2的PI为I2。
→ 如果I2=I1,则使用标签L2替换L1,L2成为前缀P到下一跳N1的绑定的标签
→ 如果I2≠I1,则认为这是两条不同的路由更新,L2和L1都会保存下来,BGP需要在这两条路由之间进行负载均衡。
另外,如果SAFI-4 或SAFI-128时,如果S1从两个不同的BGP邻居收到了同一个前缀P的
标签绑定信息,一个邻居绑定的标签是L1,另一个邻居绑定的标签是L2,但是两个邻居Update消息中指定的下一跳都是N1,则S1会认为从N1到前缀P都两条不同的路径,S1也会在这两条路由之间进行负载均衡。
如果收到不同邻居到前缀P的多个Update消息中的下一跳不同,则根据一般的选路规则进行。