Appendix F. Implementation Recommendations (实现建议)
Appendix F. Implementation Recommendations (实现建议)
本节提供一些实现建议。
Appendix F.1. Multiple Networks Per Message (每条消息中的多个网络)
BGP 协议允许在一条消息中指定具有相同路径属性的多个地址前缀。强烈建议使用此功能。每条消息只有一个地址前缀会大大增加接收方的开销。不仅由于接收多条消息而使系统开销增加, 而且扫描路由表以更新 BGP 对等体和其他路由协议 (并发送相关消息) 的开销也会多次产生。
从未按每个路径属性集组织的路由表构建每个路径属性集包含许多地址前缀的消息的一种方法是在扫描路由表时构建许多消息。当处理每个地址前缀时, 如果不存在相关路径属性集的消息, 则分配该消息, 并将新地址前缀添加到其中。如果存在这样的消息, 则将新地址前缀附加到其中。如果消息缺少容纳新地址前缀的空间, 则传输该消息, 分配新消息, 并将新地址前缀插入新消息中。当整个路由表被扫描后, 所有分配的消息都被发送, 并释放它们的资源。当地址前缀覆盖的所有目标共享一组公共路径属性时, 可以实现最大压缩, 从而可以在一条 4096 字节的消息中发送许多地址前缀。
当与不将多个地址前缀压缩到一条消息中的 BGP 实现进行对等时, 可能需要采取措施来减少在获取对等体或发生重大网络拓扑变化时从接收的数据洪流产生的开销。一种方法是限制更新速率。这将消除对路由表的冗余扫描, 以便为 BGP 对等体和其他路由协议提供快速更新。这种方法的缺点是它会增加路由信息的传播延迟。通过选择不比处理多条消息所需时间长得多的最小快速更新间隔, 应该可以最小化这种延迟。更好的方法是在发送更新之前读取所有接收到的消息。
Appendix F.2. Reducing Route Flapping (减少路由抖动)
为了避免过度的路由抖动, 需要撤回目标并发送有关更特定或更不特定路由的更新的 BGP 发言者应该将它们组合到同一个 UPDATE 消息中。
Appendix F.3. Path Attribute Ordering (路径属性排序)
组合更新消息 (如上面第 6.1 节所述) 的实现可能更喜欢看到所有路径属性以已知顺序呈现。这允许它们快速识别来自不同更新消息的语义相同的属性集。为了便于这一点, 根据类型代码对路径属性进行排序是一个有用的优化。这种优化完全是可选的。
Appendix F.4. AS_SET Sorting (AS_SET 排序)
可以进行的另一个有用的优化来简化这种情况是对 AS_SET 中找到的 AS 编号进行排序。这种优化完全是可选的。
Appendix F.5. Control Over Version Negotiation (版本协商控制)
由于 BGP-4 能够承载无法在 BGP-3 中正确表示的聚合路由, 因此支持 BGP-4 和另一个 BGP 版本的实现应该提供在每个对等体基础上仅说 BGP-4 的能力。
Appendix F.6. Complex AS_PATH Aggregation (复杂的 AS_PATH 聚合)
选择提供保留大量路径信息的路径聚合算法的实现可能希望使用以下过程:
为了聚合两个路由的 AS_PATH 属性, 我们将每个 AS 建模为一个元组 <type, value>, 其中 "type" 标识 AS 所属的路径段的类型 (例如, AS_SEQUENCE, AS_SET), "value" 是 AS 编号。如果两个 AS 的相应 <type, value> 元组相同, 则称它们相同。
聚合两个 AS_PATH 属性的算法工作如下:
a) 识别每个 AS_PATH 属性中在两个 AS_PATH 属性中具有相同相对顺序的相同 AS (如上所定义)。如果满足以下任一条件, 则称两个 AS (X 和 Y) 具有相同的顺序:
- X 在两个 AS_PATH 属性中都在 Y 之前, 或
- Y 在两个 AS_PATH 属性中都在 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 编号的除最后一个实例 (最右边的出现) 之外的所有实例。