邊界閘道協定(Border Gateway Protocol)
/ B-G-P /
在單一網路內部,路由器可以使用像 OSPF 這樣的協定來找最短路徑,因為它們彼此信任、共享完整地圖。但網際網路是由數萬個彼此並不信任、也不願分享內部地圖的獨立網路構成的,它們卻仍需就「如何抵達每個人」達成共識。邊界閘道協定(Border Gateway Protocol,BGP)就是它們全都使用、用來做到這件事的唯一協定。從很實際的意義上說,它就是把網際網路黏合在一起的膠:跨網域路由協定只有一個,那就是 BGP。
BGP 在不同自治系統的邊界路由器之間運作。兩台同意交換路由的路由器會建立一個 BGP 會話(一條 TCP 連線),然後互相告知各自能抵達哪些 IP 前綴、以及經由什麼 AS 路徑。每當有變動——某個前綴變得可達,或某條鏈路斷掉——它們就送出一則增量更新,宣告(advertise)新路由或撤回(withdraw)已失效的路由。關鍵在於:路由器宣告的不是距離或成本,而是封包會穿越的完整自治系統清單,這正是 BGP 被稱為路徑向量(path-vector)協定的原因。收到宣告的 AS 接著套用自己的政策,決定實際採用哪條被宣告的路徑,以及(若有的話)要把哪條再轉告給它的其他鄰居。
BGP 是政策驅動,而非最短路徑。一個 AS 經常會選一條較長的 AS 路徑,只因為它較便宜或合約上較受偏好;它也會依據商業關係過濾要再宣告哪些路由。這份彈性既是 BGP 的優點也是缺點:它讓獨立網路在沒有中央權威的情況下合作,但因為 BGP 大致上信任鄰居所說的話,單一一次設定錯誤或惡意宣告,就可能把網際網路上大量流量導向別處或吞掉。
假設 ISP A 擁有 203.0.113.0/24。它的邊界路由器與鄰居 ISP B 開啟一個 BGP 會話並宣告:「前綴 203.0.113.0/24,AS 路徑 = [A]。」B 接受後,再告訴自己的鄰居 C:「203.0.113.0/24,AS 路徑 = [B, A]。」現在 C 知道,要抵達那個區塊,封包要先經過 B 再經過 A——而 C 可以選擇這條路徑,或選擇它從別處學到的另一條。
BGP 宣告可達的前綴加上完整的 AS 路徑;每個 AS 在再宣告之前都會套用自己的政策。
BGP 找到的是一條符合政策、無迴圈的路徑,而非全域上最短或最快的路徑——AS 路徑很短的路由,仍可能比另一條替代路徑更慢、更壅塞,或在實際里程上更長。