路由协议和架构/边界网关协议
边界网关协议 (BGP) 是互联网中常用的域间路由协议。
- 概述
- 它使用 路径向量 (PV) 算法 来记录路径上的 AS 序列,而不会出现路由环路的风险: #路径向量算法;
- 路由器可以 聚合 收到的路由信息,然后再进行传播: #路由聚合;
- 它不会自动发现新邻居路由器的存在,而是需要 手动配置对等会话: #对等会话;
- 它使用 可靠的 TCP 连接 来交换路由更新: #TCP;
- 由于属性的 类型-长度-值 (TLV) 格式,它是一个可扩展的协议: #路径属性;
- 它支持 路由策略: #决策过程.
BGP 交换有关外部路由的域间路由信息,这些路由的格式为网络地址/前缀长度(而不是网络掩码)。
由于路由策略是基于路径定义的,因此 BGP 不能基于 DV 算法,因为仅知道它们的成本是不够的。BGP 选择采用 路径向量 (PV) 算法:每个 AS 构成一个单独的节点,由 2(或 4)字节的数字标识,附加的信息是\ul{穿越的 AS 列表}。
PV 算法更稳定,因为它很容易检测环路
- 如果路由器收到一个已经包含其 AS 号的 PV,它会丢弃该 PV 而不进行传播,因为将要开始一个路由环路;
- 否则,路由器将自己的 AS 号输入到 PV 中,然后将其传播给它的邻居。
BGP 不支持显式的成本度量:与每条路由相关的成本仅仅等于列表中 穿越的 AS 数量 → 最低成本路由可能不是实际最佳路由
- AS 可能有不同的要求,因此它们可能采用彼此不同的度量(例如带宽、传输延迟)→ 很难为所有 AS 计算一致的成本;
- 公布的成本可能与实际网络拓扑不匹配,因为出于经济原因,ISP 可能希望向竞争对手隐藏有关其自身网络的实际信息: B4. 域间路由:互联网中的对等和中转#管理要求.
当边界路由器传播有关接收到的路由的信息时,可以手动配置它以在它的通告消息中包含聚合路由,以减小它们的尺寸:两个路由可以聚合成一条具有它们的网络前缀公共部分的路由。
然而,并非所有已合并到聚合路由中的路由都具有相同的穿越 AS 序列,而可能存在一条更具体的路由,它遵循另一条路径
- 重叠路由:特定路由,以及它不同的穿越 AS 列表,也与聚合路由一起通告 → 信息是完整的,并且“最长前缀匹配”算法将在路由表中选择更具体的路由;
- 不精确路由:仅通告聚合路由 → 信息是近似的,因为穿越 AS 列表与该地址范围内所有目标地址实际遵循的路径不匹配。
两个交换 BGP 消息的边界路由器被称为对等体,TCP 会话被称为对等会话。
与其他路由协议相比,一个关键的区别是,对等体无法自动发现彼此:需要网络管理员进行 手动配置,因为对等体可能不是通过直接连接而是通过其他路由器连接的,而对于这些路由器,BGP 更新是对它们进行转发至目标地址的普通数据包。
路由信息的传输是 可靠的,因为两个对等体通过建立一个TCP 连接来建立对等会话,通过该连接交换所有 BGP 消息
- 重用现有组件,而不是重新定义另一个协议特定的机制;
- BGP 不需要直接处理重传、丢失消息等。
使用 TCP 作为传输协议可以避免定期发送更新:仅在 需要时 发送更新,仅包括已更改的路由,并且仅当消息丢失时才重新发送 → 发送路由所消耗的带宽减少了。
由于通告不是周期性的,因此路由 永远不会过期 → 需要显式通知以前通告的路由已不可达,以便在路由不再有效时撤回路由(类似于 路由毒化 在 DV 算法中)。
但是,TCP 剥夺了应用程序对 时间安排 的控制,因为控制包可能会因 TCP 机制本身而延迟:在发生拥塞的情况下,TCP 会降低传输速率,从而阻止其及时传输 → 可以对 AS 内部的内部路由器配置服务质量,以便优先考虑 BGP 包,因为它们是允许网络操作的服务包。
TCP 协议不提供有关远程对等点是否仍然可达的任何信息 → 需要由 BGP 本身管理的**显式保活机制**。此外,保活消息依赖于 TCP 机制 → 对等点消失或链路故障的反应能力有限,但考虑到这些事件很少发生(例如,边界路由器之间的链路具有很强的冗余性),因此仍然可以接受。
I-BGP 和 E-BGP
[edit | edit source]当两个边界路由器之间建立对等会话时,每个路由器都会通过 OPEN 消息向对方通信其 AS 号,以确定子协议的类型。
- **外部 BGP** (E-BGP):对等点是属于两个不同 AS 的边界路由器,通常通过直接链路连接;
- **内部 BGP** (I-BGP):对等点是属于同一个 AS 的边界路由器,通常通过一系列内部路由器连接。
BGP 消息的处理以及对等会话上通告的路由可能根据对等点所属的 AS 不同而有所不同。
- E-BGP:当边界路由器将 PV 传播到 E-BGP 对等点时,它会在每个已穿越 AS 列表前加上当前 AS 号。
- 外部路由:它们被传播到其他 E-BGP 对等点,但对等点的 AS 位于到达这些目的地的最佳路径上;
- 内部路由:它们被传播到其他 E-BGP 对等点;
- I-BGP:当边界路由器将 PV 传播到 I-BGP 对等点时,它会原样传输该列表,因为 AS 号保持不变。
- 外部路由:它们根据各种方式传播到其他 I-BGP 对等点;
- 内部路由:它们永远不会传播到其他 I-BGP 对等点,但每个边界路由器都通过独立的重新分配过程学习它们。
I-BGP 会话用于交换外部路由。
- 独立于由内部协议交换的路由:对等点之间的直接连接避免了当外部路由的变化不需要重新计算内部路由时,打扰 IGP 协议 → 无瞬态,处理量减少;
- 独立于内部协议:如果边界路由器在从 E-BGP 学习外部路由时,只限于将它们重新分配到 IGP 协议,让 IGP 协议自然地将它们重新分配到其他边界路由器,则 BGP 所需的一些重要信息将会丢失 → 需要特定的 BGP 消息,称为 UPDATE,在它们的属性中包含这些信息。
IGP-BGP 同步
[edit | edit source]中转 AS 中的 BGP 路由器通过 I-BGP 从其他 BGP 路由器学习外部目的地,但跨 AS 的数据包转发(朝向出口 BGP 路由器)依赖于内部路由器,它们的路由表由 IGP 协议填充,而不是由 BGP 填充 → 只有在它们也由 IGP 协议通告之后,外部目的地才能通告到其他 AS 中的边界路由器。
在侧图示例中,路由器 R4 通过 E-BGP 学习目的地 D,并通过 I-BGP 向路由器 R3 通告,但 R3 不能反过来通过 E-BGP 向路由器 R5 通告,直到目的地从 IGP 协议重新分配到 R3,否则如果 R5 尝试发送一个数据包到 D,R3 将把它转发到 AS 内部,内部路由器将丢弃它。
在以下情况下禁用同步可能是有益的
- AS 不是中转 AS;
- AS 中的所有路由器都使用 BGP。
路由循环
[edit | edit source]当边界路由器属于同一个 AS 时,缺乏有关已穿越边界路由器的信息可能是导致路由循环的原因:边界路由器不再能够依靠已穿越 AS 列表来检测经过同一个边界路由器两次的路径。
在侧图示例中,在通告中创建了一个循环
- 路由器 R4 学习到目的地 D 的外部路由;
- R4 将 D 传播到对等点 R3;
- R3 将 D 传播到对等点 R2;
- R2 将 D 传播到对等点 R4,它是最初学习和通告 D 的路由器。
因此,它创建了一种类似于在距离向量算法中触发无穷计数的状况:R4 不能确定 R2 是否可以通过 R4 本身到达 D,或者是否存在一条真正可行的替代路径 → 如果 R4 和 D 所在 AS 的边界路由器之间发生链路故障,R4 将认为仍然可以通过 R2 访问 D。
可以以各种方式将外部路由通告到 I-BGP 对等点:全网状,路由反射器,AS 联盟。
全网状
[edit | edit source]每个边界路由器都与 AS 中的每个其他边界路由器建立 I-BGP 对等会话。
当边界路由器从 E-BGP 学习到外部路由时,它会将它传播到所有其他边界路由器,而其他边界路由器反过来会将它传播到所有边界路由器,依此类推。
在存在两个以上边界路由器的情况下,由于通告中的循环,可能会形成路由循环,如侧图所示。
这种解决方案缺乏灵活性,因为所有对等会话都必须手动配置,尽管对等会话随着时间的推移变化不大,因为边界路由器相当固定且容错能力强。
路由反射器
[edit | edit source]边界路由器中有一个被选为**路由反射器** (RR),所有其他边界路由器只与它建立对等会话,而不会创建封闭路径。
当边界路由器从 E-BGP 学习到外部路由时,它只将它传播到 RR,RR 负责反过来将路由传播到其他边界路由器,避免路由循环。
路由反射器构成一个单点故障。
AS 联盟
[edit | edit source]边界路由器具有 I-BGP 对等会话的全网状(如第一种方式),但 AS 被分成多个迷你 AS,每个迷你 AS 都有一个私有的 AS 号,当边界路由器传播 PV 时,它会在列表中添加自己的私有 AS 号。
当收到通告时,边界路由器可以查看自己的私有 AS 号是否已经在列表中,以便在检测到路由循环时丢弃数据包。
路径属性
[edit | edit source]BGP 关于通告路由的信息(例如已穿越 AS 列表)包含在 UPDATE 数据包中的**路径属性**中。
所有属性都使用**类型-长度-值** (TLV) **格式**编码 → BGP 是一个**可扩展协议**:扩展 RFC 可以定义新的属性,而不会破坏与现有世界的兼容性,如果路由器不支持该属性(无法识别的类型代码),它可以忽略它并跳到下一个属性(由于其长度信息)。
BGP 属性可以是
- 众所周知:它必须被所有实现理解,并且永远不能跳过。
- 必需:它必须存在于所有消息中;
- 可选:它可能不存在于所有消息中;
- 可选:它可能不被所有实现理解,如果它不被支持,可以跳过它。
- 可传递:如果路由器不支持该属性,它必须无论如何传播它,并设置标志 P;
- 不可传递:如果路由器不支持该属性,它不能传播它。
每个属性都具有以下 TLV 格式
1 | 2 | 3 | 4 | 8 | 16 | 24/32 | |
O | T | P | E | 0 | 类型 | 长度 | 值 |
其中字段是
- 可选 (O) 标志 (1 位):它指定属性是可选的还是众所周知的;
- 可传递 (T) 标志 (1 位):它指定属性是可传递的还是不可传递的;
- 部分 (P) 标志 (1 位):它指定路径上的至少一个路由器是否遇到了不支持的可选可传递属性;
- 扩展长度 (E) 标志 (1 位):它指定“长度”字段是使用一个字节还是两个字节编码的;
- 类型 字段 (1 字节):它包含标识属性的类型代码 → 路由器可以在解析其值之前确定它是否支持该属性;
- 长度 字段 (1 或 2 字节):它包含属性值的长度 → 路由器可以通过将该字段指示的字节数向前移动,跳过不支持的属性并跳到下一个属性;
- 值 字段 (可变长度):它包含属性值。
- ORIGIN 属性(类型 1,必选):它定义了路径信息的来源
- IGP:该路由是手动指定的静态路由(bgp network命令);
- EGP:该路由是由 EGP 协议学习到的[1];
- INCOMPLETE:该路由是通过重新分发过程从 IGP 协议学习到的(bgp redistribute命令);
- AS_PATH 属性(类型 2,必选):它包含跨越的 AS 列表,分为路径段
- AS_SEQUENCE:路径段中的 AS 号码按遍历顺序排列,如果数据包中的第一个段按顺序排列,则必须在该段的开头添加一个新的 AS 号码;
- AS_SET:路径段中的 AS 号码不按遍历顺序排列,如果数据包中的第一个段不按顺序排列,则必须在该段之前添加一个新的按顺序排列的段,其中必须插入新的 AS 号码;
- NEXT_HOP 属性(类型 3,必选):当多个路由器属于同一个 LAN 但属于两个不同的 AS 时,它优化路由,因此从一个 AS 到另一个 AS 的流量将始终穿过边界路由器→边界路由器可以宣布将流量发送到另一个 AS 中的下一个跳路由器
- LOCAL_PREF 属性(类型 5,可选):在 I-BGP 中,当外部目的地可以通过两个出口边界路由器到达时,首选具有最高 LOCAL_PREF 的路由;
- ATOMIC_AGGREGATE 属性(类型 6,可选):它表示所宣布的路由是不精确的聚合路由。
- MULTI_EXIT_DISC (MED) 属性(类型 4,非传递):在 E-BGP 中,当两个 AS 通过多个链路连接时,首选 MED 最低的链路,而 MED 较高的链路被视为备份链路;
- AGGREGATOR 属性(类型 7,传递):它包含生成不精确路由的路由器的 AS 号码和 IP 地址;
- COMMUNITIES 属性(类型 8,传递):它指示该路由必须向哪个对等方组宣布(例如,向整个互联网,仅在当前 AS 内,不向任何人);
- MP_UNREACH_NLRI 属性(类型 15,非传递):它通知先前宣布的路由已变得不可到达(路由永远不会过期)。
在每个边界路由器上运行的决策过程负责
- 选择哪些路由向其他 BGP 对等方公布;
- 选择边界路由器本地使用的路由;
- 聚合路由以减少信息。
BGP 必须处理的数据库是
- 路由信息库 (RIB):它由三个不同的部分组成
- 相邻 RIB 进入 (Adj-RIB-In):它包含从某个对等方收到的广告中学习到的所有路由;
- 本地 RIB (Loc-RIB):它包含决策过程选择的路由,以及它们的优先级;
- 相邻 RIB 外出 (Adj-RIB-Out):它包含将在广告中传播到某个对等方的路由;
- 策略信息库 (PIB):它包含通过手动配置定义的路由策略;
- 路由表:它包含数据包转发过程使用的路由。
非常复杂的 路由策略 可以被强加以影响决策过程
- 一个特定的函数通过应用在属性上定义的策略,返回该路由的优先级,应用于 Adj-RIBs-In 中的每个路由。
策略仅根据当前路由的属性定义:优先级的计算不受其他路由的存在、不存在或属性的影响; - 对于每个目的地,选择优先级最高的路由并将其插入 Loc-RIB;
- 其他策略决定从 Loc-RIB 中选择哪些路由插入 Adj-RIBs-Out。