BGP 用于在不同的自治系统(AS)之间交换路由信息。当两个 AS 需要交换路由信息时,每个 AS 都必须指定一个运行 BGP 的节点,来代表 AS 与其他的 AS 交换路由信息。这个节点可以是一个主机。但通常是路由器来执行 BGP。两个 AS 中利用 BGP 交换信息的路由器也被称为边界网关(Border Gateway)或边界路由器(Border Router)。

由于可能与不同的 AS 相连,在一个 AS 内部可能存在多个运行 BGP 的边界路由器。同一个自治系统(AS)中的两个或多个对等实体之间运行的 BGP 被称为 IBGP(Internal/Interior BGP)。归属不同的 AS 的对等实体之间运行的 BGP 称为 EBGP (External/Exterior BGP)。在 AS 边界上与其他 AS 交换信息的路由器被称作边界路由器(border/edge router)。在互联网操作系统(Cisco IOS)中,IBGP 通告的路由的距离为 200,优先级比 EBGP 和任何内部网关协议(IGP)通告的路由都低。其他的路由器实现中,优先级顺序也是 EBGP 高于 IGP,而 IGP 又高于 IBGP。

BGP 属于外部网关路由协议,可以实现自治系统间无环路的域间路由。BGP 是沟通 Internet 广域网的主用路由协议,例如不同省份、不同国家之间的路由大多要依靠 BGP 协议。BGP 可分为 IBGP(Internal BGP)和 EBGP(External BGP)。BGP 的邻居关系(或称通信对端/对等实体)是通过人工配置实现的,对等实体之间通过 TCP(端口 179)会话交互数据。BGP 路由器会周期地发送 19 字节的保持存活 keep-alive 消息来维护连接(默认周期为 30 秒)。在路由协议中,只有 BGP 使用 TCP 作为传输层协议。

IETF 先后为 BGP 制定了多个建议,分别为:

RFC 4271:当前正使用的 BGP 协议版本,称之为 BGP4。

RFC 1654:BGP4 协议的名列前茅个规范。

RFC 1105、RFC 1163、RFC 1267、RFC1771:BGP4 之前的 BGP 版本。

三、BGP 消息类型及状态转换

BGP 使用如下四种消息类型:

  • Open 消息:Open 消息是 TCP 连接建立后发送的名列前茅个消息,用于建立 BGP 对等体之间的连接关系。
  • Keepalive 消息:BGP 会周期性地向对等体发出 Keepalive 消息,用来保持连接的有效性。
  • Update 消息:Update 消息用于在对等体之间交换路由信息。它既可以发布可达路由信息,也可以撤销不可达路由信息。
  • Notification 消息:当 BGP 检测到错误状态时,就向对等体发出 Notification 消息,之后 BGP 连接会立即中断。

BGP 邻居建立中的状态和过程如下:

  • 空闲(Idle):为初始状态,当协议激活后开始初始化,复位计时器,并发起名列前茅个 TCP 连接,并开始倾听远程对等体所发起的连接,同时转向 Connect 状态。。
  • 连接(Connect):开始 TCP 连接并等待 TCP 连接成功的消息。如果 TCP 连接成功,则进入 OpenSent 状态;如果 TCP 连接失败,进入 Active 状态。
  • 行动(Active):BGP 总是试图建立 TCP 连接,若连接计时器超时,则退回到 Connect 状态,TCP 连接成功就转为 Open sent 状态。
  • OPEN 发送(Open sent):TCP 连接已建立,自己已发送名列前茅个 OPEN 报文,等待接收对方的 Open 报文,并对报文进行检查,若发现错误则发送 Notification 消息报文并退回到 Idle 状态。若检查无误则发送 Keepalive 消息报文,Keepalive 计时器开始计时,并转为 Open confirm 状态。
  • OPEN 证实(Open confirm):BGP 等待 Keepalive 报文,同时复位保持计时器。如果收到了 Keepalive 报文,就转为 Established 状态,邻居关系协商完成。如果系统收到一条更新或 Keepalive 消息,它将重新启动保持计时器;如果收到 Notification 消息,BGP 就退回到空闲状态。
  • 已建立(Established):即建立了邻居(对等体)关系,路由器将和邻居交换 Update 报文,同时复位保持计时器。

四、BGP 路由通告原则

BGP 在进行路由通告的时候,需要遵循以下原则:

多条路径时,BGP Speaker 只选优异的给自己使用(负载均衡和 FRR 除外)。

BGP Speaker 只把自己使用的路由(优异路由)通告给相邻体。

BGP Speaker 从 EBGP 获得的路由会向自己所有 BGP 相邻体通告(包括 EBGP 和 IBGP)。

BGP Speaker 从 IBGP 获得的路由不向自己的 IBGP 相邻体通告(反射器除外)。

BGP Speaker 从 IBGP 获得的路由是否通告给自己的 EBGP 相邻体要根据 IGP 和 BGP 同步的情况来决定。

当收到对端的 refresh 报文并且本端邻居支持 refresh 能力,BGP Speaker 将把自己所 有 BGP 路由通告给对等体。

GR 过程中,主备倒换方在 GR 结束时 BGP Speaker 会把自己所有 BGP 路由通告给对等体。

五、BGP 属性

路由器发送关于目标网络的 BGP 更新消息,更新的度量值被称为路径属性。属性可以是公认的或可选的、强制的或自由决定的、传递的或非传递的。属性也可以是部分的。并非组织的和有组合的都是合法的,路径属性分为 4 类:公认必遵、公认自决、可选过渡、可选非过渡。

公认属性:

是公认所有 BGP 实现都必须识别的属性,这些属性被传递给 BGP 邻居。

公认强制属性必须出现在路由描述中,公认自由决定属性可以不出现在路由描述中。

可选属性:

非公认属性被称为可选的,可选属性可以是传递的或非传递的。

可选属性不要求所有的 BGP 实现都支持。

对于不支持的可选传递属性,路由器将其原封不动的传递给其他 BGP 路由器,在这种情况下,属性被标记为部分的。

对于可选非传递属性,路由器必须将其删除,而不将其传递给其他 BGP 路由器。

(1)公认必遵(Well-Known Mandatory)

ORIGIN(起源):这个属性说明了源路由是怎样放到 BGP 表中的。有三个可能的源 IGP,EGP,以及 INCOMPLETE.路由器在多个路由选择的处理中使用这个信息。路由器选择具有最低 ORIGIN 类型的路径。

AS_PATH(AS 路径):指出包含在 UPDATE 报文中的路由信息所经过的自治系统的序列。

Next_HOP(下一跳)声明路由器所获得的 BGP 路由的下一跳,对 EBGP 会话来说,下一跳就是通告该路由的邻居路由器的源地址。

(2)公认自决(Well-Known Discretionary)

LOCAL_PREF(本地优先级):本地优先级属性是用于告诉自治系统内的路由器在有多条路径的时候,怎样离开自治系统。本地优先级越高,路由优先级越高。

ATOMIC_AGGREGATE(原子聚合):原子聚合属性指出已被丢失了的信息。

(3)可选过渡(Optional Transitive)

AGGREGATOR(聚合者):此属性标明了实施路由聚合的 BGP 路由器 ID 和聚合路由的路由器的 AS 号。

COMMUNITY(团体):此属性指共享一个公共属性的一组路由器。

(4)可选非过渡(Optional Nontransitive)

MED(多出口区分):该属性通知 AS 以外的路由器采用哪一条路径到达 AS,它也被认为是路由的外部度量,低 MED 值表示高的优先级。

ORIGINATOR_ID(起源 ID):路由反射器会附加到这个属性上,它携带本 AS 路由器的路由器 ID,用以防止环路。

CLUSTER_LIST(簇列表):此属性显示了采用的反射路径。

六、协议结构

Marker (16 bytes) Length (2 bytes) Type (1 byte)

Marker – 信息包含信息接收端可预测值。

Length – 包含协议头的信息长度。

Type –信息类型。信息可能是:Open、Update、Notification、Keepalive。

打开(Open)分组,用来与相邻的另一个 BGP 发言人建立联系

更新(Update)分组,用来发送某一路由的信息,以及列出多条要撤销的路由

保活(Keepalive)分组,用来确认打开分组和周期性地证实邻站关系

通知(Notification)分组,用来发送检测到的差错

在传输协议连接建立之后,各端发送的名列前茅个信息是 OPEN 信息。如果 OPEN 信息可以接收,会返回发送确认 OPEN 信息的 KEEPALIVE 信息。一旦 OPEN 信息获得确认,UPDATE、KEEPALIVE 和 NOTIFICATION 信息进行相互交换。