BGP-4 提供了一套新的机制来支持无类域间路由 (Classless Inter-Domain Routing,CIDR) [RFC1518, RFC1519]。这些机制包括支持将一组目的地作为 IP 前缀进行通告,并消除 BGP 中网络“类”的概念。BGP-4 还引入了允许聚合路由的机制,包括 AS 路径的聚合。
ATOMIC_AGGREGATE
ATOMIC_AGGREGATE的路径属性的类性值为6,是一个众所周知的长度为 0 的任意属性。
当 BGP 发言者为了向特定对等体通告的目的而聚合多个路由时,聚合路由的 AS_PATH 通常包括一个 AS_SET,该 AS_SET 由形成聚合的 AS 集合形成。在许多情况下,网络管理员可以确定是否可以在没有 AS_SET 且不形成路由环路的情况下安全地通告聚合。
如果聚合排除了由于丢弃 AS_SET 而聚合的路由的 AS_PATH 中存在的至少一些 AS 编号,则聚合路由在通告给对等体时,应该包括 ATOMIC_AGGREGATE 属性。
接收具有 ATOMIC_AGGREGATE 属性的路由的 BGP 发言者在将路由传播到其他发言者时不应删除该属性。
接收具有 ATOMIC_AGGREGATE 属性的路由的 BGP 发言者在向其他 BGP 发言者通告此路由时,不得使该路由的任何 NLRI 更具体。
接收具有 ATOMIC_AGGREGATE 属性的路由的 BGP 发言者需要了解这样一个事实,即到达目的地的实际路径(如路由的 NLRI 中指定的那样)虽然具有无环属性,但可能不是在路由的 AS_PATH 属性。
AGGREGATOR
AGGREGATOR的路径属性的类性值为7,是一个长度为 6 的可选传递属性。
该属性包含形成聚合路由的最后一个 AS 编号(编码为 2 个八位字节),后跟形成聚合路由的 BGP 发言者的 IP 地址(编码为 4 个八位字节)。这应该与用于发言者的 BGP 标识符的地址相同。
它可以包含在由聚合形成的更新中。执行路由聚合的 BGP 发言者可以添加 AGGREGATOR 属性,该属性应包含其自己的 AS 编号和 IP 地址。IP 地址应该与发言者的 BGP 标识符相同。
如果 BGP 发言者接收到重叠路由,决策过程必须根据配置的接受策略考虑两条路由。如果一个更少和更具体的路由都被接受,那么决策过程必须在 Loc-RIB 中安装更少和更具体的路由,或者聚合这两个路由并在 Loc-RIB 中安装聚合的路由,前提是两条路由具有相同的 NEXT_HOP 属性值。
如果 BGP 发言者选择聚合,那么它应该在 AS_SET 中包含所有用于形成聚合的 AS,或者将 ATOMIC_AGGREGATE 属性添加到路由中。这个属性现在主要是信息性的。随着不支持无类路由的 IP 路由协议的消除,以及不支持无类路由的路由器和主机实现的消除,不再需要去聚合。路由不应该被取消聚合。特别是,携带 ATOMIC_AGGREGATE 属性的路由绝不能去聚合。也就是说,这条路由的 NLRI 不能再具体了。沿着这样的路由转发并不能保证 IP 数据包实际上只会遍历路由的 AS_PATH 属性中列出的 AS。
路由信息的高效组织
在选择了它要通告的路由信息后,BGP 发言者可以利用多种方法以有效的方式组织该信息。
信息缩减
信息缩减可能意味着策略控制粒度的减少——信息缩减后,相同的策略将应用于等价类中的所有目的地和路径。
决策过程可以通过以下任何一种方法选择性地减少将放置在 Adj-RIBs-Out 中的信息量:
a) 网络层可达性信息(Network Layer Reachability Information,NLRI):
目标 IP 地址可以表示为 IP 地址前缀。在地址结构与自治系统管理员控制的系统之间存在对应关系的情况下,可以减小 UPDATE 消息中携带的 NLRI 的大小。
b) AS_PATHs:
AS 路径信息可以表示为有序的 AS_SEQUENCE 或无序的 AS_SET。AS_SET 用于上一节中描述的路由聚合算法。它们通过仅列出每个 AS 编号一次来减少 AS_PATH 信息的大小,而不管它可能在聚合的多个 AS_PATH 中出现了多少次。
AS_SET 意味着 NLRI 中列出的目的地可以通过穿过至少一些组成自治系统的路径到达。AS_SET 提供了足够的信息来避免路由信息环路;但是,它们的使用可能会修剪潜在的可行路径,因为这些路径不再以 AS_SEQUENCE 的形式单独列出。在实践中,这不太可能成为问题,因为一旦 IP 数据包到达一组自治系统的边缘,BGP 发言者可能拥有更详细的路径信息,并且可以区分各个路径与目的地。
聚合路由信息
聚合是将多个不同路由的特征组合在一起的过程,从而可以发布单个路由。聚合可以作为决策过程的一部分发生,以减少将放置在 Adj-RIBs-Out 中的路由信息量。
聚合减少了 BGP 发言者必须存储和与其他 BGP 发言者交换的信息量。可以通过将以下过程分别应用于相同类型的路径属性和网络层可达性信息来聚合路由。
不应聚合具有不同 MULTI_EXIT_DISC 属性的路由。
如果聚合路由有一个 AS_SET 作为其 AS_PATH 属性中的第一个元素,则发起该路由的路由器不应使用该路由通告 MULTI_EXIT_DISC 属性。
具有不同类型代码的路径属性不能聚合在一起。同类型代码的路径属性可以按照以下规则进行聚合:
NEXT_HOP:当聚合具有不同 NEXT_HOP 属性的路由时,聚合路由的 NEXT_HOP 属性应标识执行聚合的 BGP 发言者上的接口。
ORIGIN属性:如果聚合路由中的至少一条路由具有值为 INCOMPLETE 的 ORIGIN,则聚合路由必须具有值为 INCOMPLETE 的 ORIGIN 属性。否则,如果聚合路由中的至少一条路由具有值为 EGP 的 ORIGIN,则聚合路由必须具有值为 EGP 的 ORIGIN 属性。在所有其他情况下,聚合路由的 ORIGIN 属性的值为 IGP。
AS_PATH 属性:如果要聚合的路由具有相同的 AS_PATH 属性,则聚合路由与每个单独的路由具有相同的 AS_PATH 属性。
为了聚合 AS_PATH 属性,我们将 AS_PATH 属性中的每个 AS 建模为元组 <type, value>,其中“type”标识 AS 所属的路径段的类型(例如,AS_SEQUENCE、AS_SET),并且“ value”标识 AS 编号。如果要聚合的路由具有不同的 AS_PATH 属性,则聚合的 AS_PATH 属性应满足以下所有条件:
- 聚合的 AS_PATH 中的所有 AS_SEQUENCE 类型的元组应出现在要聚合的初始路由集中的所有 AS_PATH 中。
- 聚合 AS_PATH 中所有类型为 AS_SET 的元组应出现在初始集合中的至少一个 AS_PATH 中(它们可能出现为 AS_SET 或 AS_SEQUENCE 类型)。
- 对于聚合 AS_PATH 中任何类型为 AS_SEQUENCE 的元组 X,它在聚合 AS_PATH 中的元组 Y 之前,在包含 Y 的初始集合中的每个 AS_PATH 中,X 在 Y 之前,无论 Y 的类型如何。
- 具有相同值的 AS_SET 类型的元组不得在聚合的 AS_PATH 中出现多次。
- 只有当与另一个相同类型和值的元组相邻时,具有相同值的多个 AS_SEQUENCE 类型的元组才会出现在聚合的 AS_PATH 中。
实现可以选择符合这些规则的任何算法。至少,符合要求的实现应能够执行满足上述所有条件的以下算法:
- 确定要聚合的路由的所有 AS_PATH 属性共有的最长前导元组序列(如上定义)。将此序列作为聚合 AS_PATH 属性的前导序列。
- 从要聚合的路由的 AS_PATH 属性中将其余元组的类型设置为 AS_SET,并将它们附加到聚合的 AS_PATH 属性中。
- 如果聚合的 AS_PATH 具有多个具有相同值的元组(无论元组的类型如何),则通过从聚合的 AS_PATH 属性中删除类型为 AS_SET 的元组来消除除一个之外的所有元组。
- 对于聚合的 AS_PATH 中的每一对相邻的元组,如果两个元组具有相同的类型,则将它们合并在一起,只要这样做不会导致生成长度大于 255 的段。
ATOMIC_AGGREGATE:如果要聚合的至少一条路由具有 ATOMIC_AGGREGATE 路径属性,则聚合路由也应具有此属性。
AGGREGATOR:来自要聚合的路由的任何 AGGREGATOR 属性不得包含在聚合路由中。执行路由聚合的 BGP 发言者可以附加一个新的 AGGREGATOR 属性。
与 RFC 1267相比,RFC4271引入了一个新属性 LOCAL_PREF,它有助于路由选择过程以及简化配置。还引入了一个新属性 ATOMIC_AGGREGATE 以确保某些聚合不会被取消聚合。另一个新属性 AGGREGATOR 可以添加到聚合路由中,以通告哪个 AS 以及该 AS 内的哪个 BGP 发言者配置了聚合。
为确保保持定时器是对称的,现在基于每个连接协商保持定时器。现在支持零保持计时器。
附录:复杂的 AS_PATH 聚合
选择提供保留大量路径信息的路径聚合算法的实现可能希望使用以下过程:
为了聚合两个路由的 AS_PATH 属性,我们将每个 AS 建模为一个元组 <type, value>,其中“type”标识该 AS 所属的路径段的类型(例如,AS_SEQUENCE,AS_SET),“value " 是 AS 编号。如果两个 AS 对应的 <type, value> 元组相同,则称它们相同。
聚合两个 AS_PATH 属性的算法工作如下:
a) 在每个 AS_PATH 属性中标识相同的 AS(如上定义),它们在两个 AS_PATH 属性中具有相同的相对顺序。如果满足以下任一条件,则称两个 AS X 和 Y 具有相同的顺序:
- 在两个 AS_PATH 属性中 X 在 Y 之前,或者
- 在两个 AS_PATH 属性中 Y 在 X 之前。
b) 聚合的 AS_PATH 属性由 (a) 中标识的 AS 组成,其顺序与它们在要聚合的 AS_PATH 属性中出现的顺序完全相同。如果 (a) 中标识的两个连续 AS 在要聚合的两个 AS_PATH 属性中没有立即相互跟随,则将两个属性中的中间 AS(位于两个相同的连续 AS 之间的 AS)组合成一个AS_SET 路径段,由来自两个 AS_PATH 属性的中间 AS 组成。然后将该段放置在聚合属性的 (a) 中标识的两个连续 AS 之间。如果在 (a) 中标识的两个连续 AS 在一个属性中立即彼此跟随,但在另一个属性中不跟随,则后者的中间 AS 组合成一个 AS_SET 路径段。然后将该段放置在聚合属性的 (a) 中标识的两个连续 AS 之间。
c) 对于聚合 AS_PATH 中的每一对相邻元组,如果两个元组具有相同的类型,则将它们合并在一起,如果这样做不会导致生成长度大于 255 的段。
如果作为上述过程的结果,给定的 AS 编号在聚合的 AS_PATH 属性中出现多次,则应从聚合的 AS_PATH 属性中删除该 AS 编号的最后一个实例(最右边的出现)之外的所有实例。