六分鐘看完BGP 協議

2022.07.05
六分鐘看完BGP 協議

在RIP 和OSPF 這些協議中,是由IP 的網絡地址進行路由控制,而BGP 協議則需要通過整個互聯網進行路由控制,範圍要大很多。

之前我們聊RIP 、OSPF 協議都是基於AS 即自治系統內的協議,可以把它們認為是域內路由協議;而下面我們要聊的就是AS 之間的協議了,這也叫做域間路由協議,或者叫做外部網關協議,其最著名的一個協議就是 BGP協議,目前使用最多的協議版本就是BGP 的第四個版本BGP - 4,簡稱為BGP ( Border Gateway Protocol )。

在RIP 和OSPF 這些協議中,是由IP 的網絡地址進行路由控制,而BGP 協議則需要通過整個互聯網進行路由控制,範圍要大很多。

BGP 的環境與RIP、OSPF 的環境不一樣,主要在於互聯網的規模過於龐大, 使得自治系統之間的路由選擇比較困難。互聯網上的路由器對任何IP 地址都能通過路由表找到它的目的網絡。這是一個非常龐大的集合,如果使用鏈路狀態協議RIP 和OSPF 的話,必須要維護一個非常大的了路由集合,一方面路由表檢索起來效率很低,而且如此龐大的數據項也不方便維護。還有一點是每個路由器的metric 不一樣,有可能這個metric 是經過了100 個路由,而那個鏈路到達100 個路由可能就直接報錯了。

而且自治系統間的路由選擇必須考慮策略問題,這些策略需要把政治、地緣、安全或者經濟方面考慮在內。

由於上面這些特殊情況的存在,BGP 協議只是滿足選擇一條到達目的網絡比較好的路由,而非選擇一條最佳路由,BGP 採用了路徑向量路由選擇協議,它與RIP 和OSPF 有很大的差別。

在BGP 協議中,每個AS 自治系統內部都有許多 BGP 邊界路由器,這個BGP 邊界路由器就相當是自治系統內部的發言人。不同AS 之間的BGP 邊界路由器如果要交換路由信息的話,就需要先建立TCP 連接,然後在此連接上交換 BGP 報文以建立BGP 會話,通過TCP 能夠提供可靠的服務。兩個交換報文的BGP 邊界路由器都被稱為彼此的臨站(天使)或者對等站。

下圖是一個使用了BGP 邊界路由器和AS 的關係示意圖:

圖片

BGP 所交換的網絡可達性信息就是要到達某個網絡所要經過的一系列的路由。當各個BGP 邊界路由器一旦交換了可達性信息之後,就會選擇出來一條到達各個AS 比較好的路由路徑。

BGP 支持無分類域間路由選擇CIDR,因此BGP 的路由表也就應當包括當前目的網絡前綴、下一跳路由器,以及到達目的網絡所經過的AS 。

在 BGP 刚刚运行时,BGP 的临站是交换整个 BGP 路由表,以后只要在发生变化时更新有新变化的部分即可。这样对节省网络带宽和减少路由器开销有很大好处,这个特性和 OSPF 非常相似。

BGP - 4 主要有下面几类报文类型:

  • OPEN ( 打开 )报文,用来和相邻的 BGP 区域边界路由器建立关系,进行通信初始化。
  • UPDATE ( 更新 ) 报文,用来通告路由信息,以及列出需要更新的多条路由。
  • KEEPALIVE ( 保活 ) 报文,用来周期性的证实临站的连通性。
  • NOTIFICATION ( 通知 ) 报文,用来发送检测到的差错。

如果两个临站属于两个不同的自治系统,而且其中一个临站打算和其他临站进行路由交换的时候,这时候应当有一个路由商量的过程。商量的过程包括临站路由器是否还能够接受额外的路由信息。因此一开始进行商谈的时候应该要先发送 OPEN 报文,如果临站可以接受这种关系,就用 KEEPALIVE 报文响应。响应完成后,两个临站就算是建立关系了。

关系建立之后,是需要相互维持的,这就和情侣之间确定关系之后,你作为老爷们总不能三天两头不搭理人家吧?俗话说的好,感情是需要维持的,那么这个路由关系也是需要维持的。通信双方中的每一方都需要确信对方是否已经存在,因此两个 BGP 边界路由器需要定期交换 KEEPALIVE 报文,一般这个定期的时间就是 30 s。

BGP 边界路由器可以使用 UPDATE 报文来更新路由:包括撤掉以前通知过的路由和增加新的路由。撤销路由时一次可以撤销多条,但是新增路由一个 UPDATE 报文只能增加一条。

当然在 BGP 中不存在 "好消息传播快坏消息传播慢" 的问题( 感觉 RIP 的这个问题被玩出梗了 )。因为 BGP 边界路由器不只有一个,而且当某个路由器或者链路出现故障时,由于 BGP 边界路由器可以不止从一个临站获得路由信息,因此很容易选出新的路由。

下面是 BGP 的报文格式:

圖片

上面介绍的四种报文类型它们具有通用的报文首部,首部为 19 字节,通用首部主要分为三个字段。

  • 标记 marker 字段为 16 字节长,用来鉴别收到的 BGP 报文,如果不使用鉴别,标记字段要置为全 1。
  • 长度字段指出包括通用首部在内的整个 BGP 报文的长度,以字节为单位,最小值是 19,最大值是 4096.
  • 类型字段的值为 1 到 4,分别对应上面报文的介绍顺序。

OPEN 报文共有 6 个字段,如下图抓包所示:

圖片

圖片

前三个字段是 BGP 通用报文首部,下面的几个字段依次是 Version 版本 ( 1 字节,值为 4  ), My AS 本自治系统号( 2 字节,使用的是全球唯一的 16 位系统号 ) , Hold Time 保持时间 ( 2 字节,以秒计算的保持为临站关系的时间 ),BGP Identifier BGP 标识符 ( 4 字节,路由器的 IP 地址 ),下面是可选长度和可选参数。

KEEPALIVE 报文只有 BGP 19 字节的通用首部。

圖片

UPDATE 报文有五个字段,如下图所示:

圖片

圖片

报文中的 Unfeasible routes length 表示不可行路由长度,后面有个字段报文没有列出来,就是 Withdrawn Routes ,要撤销的路由列表,后面的 Total Path Attribute Length 表示路径属性总长度,后面的 Path attributes 就表示路径属性,最后的 NLRI 标识发出这个报文的网络。

NOTIFICATION 报文有三个字段,如下图所示:

圖片

主要包括差错代码 ( 1 字节 ),差错子代码 ( 1 字节 ) ,后面还有差错数据。