交换机、路由器、网桥和局域网/路由器/BGP
外部网关协议是用于在两个自治系统 (AS) 之间传递路由信息的任何协议,即在不受单个公共管理员控制的网络之间传递路由信息。BGP 目前是互联网上外部路由的事实标准。BGP 的当前版本是 v4,自 1994 年开始使用,所有早期版本现已过时。
当两个自治系统同意交换路由信息时,用于使用 BGP 交换信息的两个路由器被称为 BGP 对等体。当一个使用 BGP 的路由器与另一个位于 AS 边缘附近的 AS 中的对等体进行通信时,这被称为边界网关或边界路由器。
BGP 是一种路径向量协议。与距离向量协议(与 OSPF 等链路状态网络不同)不同,它不尝试映射整个网络。相反,它维护一个数据库,其中包含访问其所知每个子网的成本,并选择成本最低的路由。但是,它不会存储单个成本,而是会保存访问每个网络所使用的整个路径(不是路径上的每个跳,而是路径经过的 AS 列表)。这意味着可以消除路由循环,这在像 RIP 这样的更简单的距离向量协议中可能很难确保,同时仍然允许协议扩展到整个互联网的级别。
参与路由公告的活动类型如下
- 它接收并过滤来自直接相连邻居的路由公告。拒绝包含路由器自身 AS 号的路径的接收路由,以避免创建路由循环。
- 它选择路由。BGP 路由器可能会收到几个到相同目的地的路由公告,并且默认情况下会从它们中选择一条作为首选路由(ECMP 将其扩展到允许流量在具有相等成本的多个路径之间进行负载均衡)。
- 它还会向其邻居发送路由公告。
BGP 最初被指定为仅通告 IPv4 路由,但 BGP 协议版本 4 中的多协议扩展允许通过 BGP 共享其他地址族中的路由。特别是,BGP 可用于共享 IPv6 路由。BGP 对等体用来通信的传输协议通常是 IPv4,但可以是 IPv6,或者实际上是任何其他协议。为了保持分层网络模型,BGP 指定了要交换的数据包,但不依赖于数据包传输方式的任何细节。
BGP 是事实上的外部网关协议,因此将网络连接到互联网的路由器必须使用它。但这并不是故事的结尾。在最简单的情况下,每个 AS 都会有一个边界路由器,它与外部世界共享路由,并且 AS 内部的所有路由都将通过内部协议(OSPF、RIP 等)完成。但是,较大的网络很少会为整个 AS 拥有单个边界路由器。因此,一个边界路由器接收到的路由需要传播到另一个边界路由器,以便与该路由器的对等体共享。
一种方法是将接收到的路由插入现有的内部协议(例如 OSPF),并使用内部协议将它们传播到另一个边界路由器。然后,第二个边界路由器可以将它们重新分发到 BGP 并传播到开放的互联网。但是,这有一些缺点。最严重的是,路由的 AS_PATH 信息会丢失(因为 OSPF 和其他协议不知道如何共享 AS_PATH),因此消除路由循环的主要方法无法运行。此外,内部协议并非旨在处理互联网上的大量路由。
更可扩展的替代方案是在 AS 中的路由器之间使用 _内部 BGP_。这以类似于外部 BGP 的方式在路由器之间传播路由,只是 AS_PATH 没有被附加。
在 AS 中使用 iBGP 的一个问题是,BGP 路由器必须连接到一个完整的网状结构中。也就是说,每个路由器必须连接到 AS 内部的每个其他路由器。原因是,虽然使用 iBGP 的路由器会将其通过 eBGP 学到的路由传递给其对等体,但这些路由只在 AS 内传播一个跳。通过 iBGP 接收到的路由不会通过 iBGP 传递给另一个对等体。这是因为 AS_PATH 信息不能用来消除路由循环。
必须将所有路由器连接到完整的网状结构的原因是不希望这样做,因为当大量路由器运行时,对等体数量会变得非常大: 连接是构建由 个路由器组成的网状结构所需的。每个连接都会占用 CPU、内存和网络带宽资源。
一种替代方法是使用路由反射。这允许 AS 中的一个或多个路由器重新通告 iBGP 路由,并通过对可以重新通告哪些路由施加约束来避免路由循环的可能性。
要使用路由反射,需要指定一个或多个路由器作为路由反射器。每个路由反射器将其对等体划分为客户端对等体和非客户端对等体。路由反射器将在一个组和另一个组之间以及客户端对等体之间反射路由。非客户端对等体必须完全网状连接。
BGP 对等体执行以下三个基本功能
- 初始对等体获取和身份验证:两个对等体建立 TCP 连接并执行消息交换,以保证双方都同意通信。
- 双方发送正向或负向可达性信息:如果一个或多个邻居不再可达,并且没有可用的备份路由,它将通告网络不可达,并将通告相关路由。
- 持续验证:它提供持续验证,以确保对等体及其之间的网络连接正常运行。
BGP 消息类型有以下几种
OPEN | 一旦两个 BGP 对等体建立 TCP 连接,它们就会各自发送一个 OPEN 消息来声明其自治系统编号并建立其他操作参数。OPEN 消息包含建议的保持计时器长度,它是两次连续消息之间可能经过的最大秒数。在接收到 OPEN 消息后,接收方会用 KEEPALIVE 进行回复。 |
---|---|
UPDATE | 在 TCP 连接和发送和接收 OPEN 及确认后,对等体使用 UPDATE 来通告新可达的目标或撤回先前的通告。 |
NOTIFICATION | 此 BGP 消息用于通知对等体已检测到错误或发送方即将关闭 BGP 会话。 |
KEEPALIVE | 这用于测试网络连接并验证两个对等体是否继续正常运行。BGP 使用 TCP 进行传输,而 TCP 不包含用于持续测试连接端点是否可达的机制。双方都会发送 KEEPALIVE,以便知道 TCP 连接是否失败。KEEPALIVE 消息尽可能短,以避免浪费带宽。 |
每个 BGP 数据包都以一个固定大小的消息头开始。
- 标记
- 此字段用于向后兼容。它包含 16 个全为 1 的字节。
- 长度
- 这是一个 2 字节无符号整数,指定数据包的长度。
- 类型
- 这是一个字节,指定消息的类型:OPEN、UPDATE、NOTIFICATION 或 KEEPALIVE。
OPEN 消息是每个路由器在新建的连接对等体上发送给对方的第一个消息。成功的 OPEN 消息会通过发送一个 KEEPALIVE 消息来确认。
BGP 标识符包含在 OPEN 消息中。这是一个 4 字节的数字,必须在网络上唯一标识路由器。它必须是路由器上某个接口的 IPv4 地址。理论上,如果路由器只用于 IPv6,则可能没有 IPv4 地址,但在实践中,这种情况很少见,而且无关紧要,因为可以使用任何唯一的 4 字节值。
OPEN 消息可以包含可选参数。如果它包含任何参数,则可选参数长度字段将被设置为非零值,以指示长度。参数字段中的每个参数都编码为三个值:参数类型(1 字节)、参数长度(1 字节)和用于参数的可变长度(最多 255 字节)字段。
UPDATE 消息从一个对等体发送到另一个对等体,以传递有关网络的新信息:新可用路由和不再可用的路由。
由于 BGP 不依赖于用于在对等体之间传递数据包的传输协议的任何细节,因此它不能利用 TCP 来检测对等体何时变得不可用。因此,协议要求对等体之间定期发送保持活动数据包。每次收到数据包时,保持活动计时器都会重置,如果计时器超时,则连接将关闭。UPDATE 和 NOTIFICATION 数据包也会重置计时器,但是如果未发送其他数据包,则对等体必须发送 KEEPALIVE 数据包。保持活动数据包通常在保持活动时间的三分之一处发送,以在不淹没网络和确保单个丢弃的数据包不会导致连接断开之间取得平衡。
BGP 被设计为可扩展的,因此基本协议允许将可扩展的属性列表附加到路由。BGP 不要求每个 BGP 路由器都理解使用的每个属性,但属性被分为四类,说明它们应该如何处理。
- 众所周知的强制属性
- 每个 BGP 路由器都应该在接收到这些属性时识别和处理它们,并将其通告给邻居。
- 众所周知的可选择属性
- 这些属性不需要通告,但任何 BGP 路由器都应该识别它们。
- 可选可传递属性
- 如果 BGP 路由器不知道如何处理此属性,它将被传递给其 BGP 邻居。
- 可选不可传递属性
- 如果 BGP 路由器不知道如何处理此属性,它将被忽略。
当前支持的属性包括
- ORIGIN
- 路由是否源于 IGP、EGP 或其他地方。
- AS_PATH
- 路由经过的 AS 列表,以到达当前路由器。除其他事项外,这使 BGP 路由器能够拒绝包含其自身 AS 的 AS_PATH 的路由,否则会导致路由循环。
- NEXT_HOP
- 应作为此路由的下一跳使用的路由器的 IP 地址。
- MULTI_EXIT_DISC
- 一个可选属性,如果存在,可以被路由器用来在通往同一 AS 的多个不同入口点之间进行选择。
- LOCAL_PREF
- 此属性仅包含在同一 AS 内的对等体之间的内部通信中。它使 BGP 路由器能够通过使用具有更高 LOCAL_PREF 值的路由来在通往同一子网的外部路由之间进行选择。
- ATOMIC_AGGREGATE
- 当 BGP 路由器将多个路由聚合到一个路由中,并因此省略了 AS_PATH 中的一些 AS 时,使用此属性。
- AGGREGATOR
- BGP 路由器可以添加到路由中的一个可选属性,其中路由器执行了路由聚合。该属性指定执行聚合的路由器的 AS 号和 IP 地址。
- COMMUNITY
- 社区值用于指定可以应用于多个路由的公共属性。一些社区值是标准化的,但其他社区编号可以由任何可以就标准含义达成一致的 BGP AS 组分配。
- ORIGINATOR_ID
- 在使用路由反射的 AS 内,起源 ID 用于防止路由循环。起源 ID 是一个 32 位值,它要么是将路由注入 BGP 的路由器(作为手动配置的 BGP 前缀,或通过从其他协议重新分发),要么是通过 eBGP 接收路由的边界路由器。
- CLUSTER_LIST
- 与起源 ID 一样,它用于在使用路由反射时防止循环。它记录路由经过的集群列表,就像 AS_PATH 记录路由经过的 AS 列表一样。