同一個目的地,好幾份報價
在上一篇你看到,邊界閘道協定是一種路徑向量協定:一個網路廣告的不是成本,而是一整條 AS 路徑——封包為了抵達某個字首(prefix)會穿越的自治系統清單。問題在於,真實的路由器通常會從不只一個鄰居那裡聽到同一個字首。你的上游供應商給你一條通往 10.0.0.0/8 的路,交換中心的對等夥伴也給你一條,第二家供應商也給你一條。一個目的地,三份報價。BGP 的核心工作,就是恰好挑出其中一條來使用、並(也許)轉發出去。
接下來這個想法,會讓每個剛從內部路由走過來的人都嚇一跳。在單一網路內部,像 OSPF 這樣的內部閘道協定會挑最低成本路徑,也就是貨真價實最短的那條。但在網路之間,BGP 經常根本不挑最短的 AS 路徑。它挑的是對生意最有利的那條路,只把路徑長度當作一個很晚才登場的平手判定。原因正是這一級前幾篇講過的一切:經過客戶的路會賺錢,經過對等夥伴的路免費,而經過供應商的路要花錢。里程很便宜;錯誤的關係卻很昂貴。
決策階梯,由上而下
BGP 是靠著走下一張有序的比較清單來選路的,像是一連串愈來愈細的平手判定。它從最頂端、最強力、最帶政治意味的屬性開始,只有在當前規則讓兩條以上的路由打平時,才會往下掉到下一條規則。第一條能把競爭者分出高下的規則就決定了勝者,後面的規則甚至不會被翻看。這個由上而下的結構,正是政策得勝的全部祕密:生意上的操縱桿坐在階梯頂端,而那些比較像最短路徑的規則則靠近底部。
BGP best-path selection (simplified, per prefix)
1. Highest LOCAL PREFERENCE <- our own policy knob (business)
2. Shortest AS_PATH <- fewest ASes to cross (distance-ish)
3. Lowest ORIGIN type
4. Lowest MED <- neighbour's hint, only vs same neighbour
5. eBGP over iBGP <- learned externally beats internally
6. Lowest IGP cost to next hop ("hot-potato": leave our net fast)
7. Lowest router-ID <- final arbitrary tie-break
Walk down. The FIRST rule that breaks the tie wins; stop there.請注意這個順序並不是隨意的行銷話術。規則 1 是你網路本地的、反映你想要什麼。規則 2 是最接近「距離」的東西——穿越的 AS 數最少——而它只是第二個平手判定,不是第一個。等你走到規則 6 時,你是在一些政策、長度、來源都已相同的路由之間做選擇,於是網路退而求其次,回到單純的內部成本。著名的「燙手山芋路由(hot-potato routing)」就住在這裡:在一些同樣好的出口之中,盡可能快地把封包推出你自己的網路,好讓別人去走那段長路。
本地偏好:坐在頂端的生意操縱桿
最重要的屬性是本地偏好,這是一個網路貼在進來的路由上的數字,等於在說「我有多喜歡你這條」。數字高者勝。關鍵在於它純粹是內部的:它由你在路由抵達時設定,並只透過 iBGP 在你自己的路由器之間分享,永遠不會送給其他網路。因為它坐在階梯的最頂端,它會完全壓過 AS 路徑長度。一條本地偏好為 200、AS 路徑有五段的路由,會打敗一條本地偏好為 100、AS 路徑只有一段的路由——即使後者明明更短。
這正是營運者把這一級前面講過的關係經濟學編碼進去的方式。標準配方是:給從客戶學來的路由最高的本地偏好、給對等夥伴的路由一個中等值、給供應商的路由最低值。如此一來,決策階梯就會永遠偏好把流量從客戶送出去(你收到錢)、其次走對等夥伴(免費)、只有萬不得已才走供應商(你付錢)——無論哪條路看起來最短。這一個操縱桿,就把抽象的供應商-客戶關係變成了具體的路由行為。
AS 路徑長度,與它底下那些較弱的暗示
當本地偏好打平時,BGP 終於看向距離,但是一種很粗的距離:AS 路徑裡的 AS 數量——不是跳數、不是延遲、不是頻寬。一條穿越三個自治系統的路徑,會勝過穿越五個的,即使那三個是橫跨大陸的龐然大物、而那五個又小又快。這是一個刻意粗鈍的量度,但它同時兼任防迴圈:一台路由器若在收到的路徑裡看見自己的 AS 號碼,就會當場拒絕那條路由,因為那意味著封包繞了一圈又經過自己。
營運者反過來利用這條規則。他們在自己廣告出去的路徑裡刻意重複自己的 AS 號碼,這叫 AS 路徑預先添加(prepending),讓一條路由看起來更長、因而對所有下游都更不吸引人,藉此溫和地把入向流量推往另一條鏈路。這是一個暗示,不是命令:任何一個鄰居,只要他的本地偏好偏愛那條被加長的路徑,仍然會用它——因為偏好在階梯上坐在路徑長度之上。這就是跨網域路由反覆出現的主題:你能影響你的鄰居,卻無法號令他們。
再往下坐著的是多重出口判別器(MED),所有工具裡最溫柔的一個。當兩個網路在好幾個點相連時,其中一方可以在每條路由上貼一個 MED,等於在說:「如果你要把流量送來我這裡,請走 MED 較低的那條鏈路。」但它只在「同一個鄰近 AS 學來的路由之間」打破平手,而且你的鄰居完全可以無視它——因為 MED 在階梯上坐得很低,遠在本地偏好與 AS 路徑長度之下。它是最客氣的一種建議,任何人的政策都能輕易地把它駁回。
把它們拼起來:一個實作選擇與更大的圖像
讓我們追蹤一個決策。你網路裡的一台路由器,握有三條通往字首 10.0.0.0/8 的路由。路由 A 來自客戶,AS 路徑長度 4。路由 B 來自對等夥伴,AS 路徑長度 2。路由 C 來自供應商,AS 路徑長度 1,是所有當中最短的。哪一條勝出?你的政策把本地偏好設為:客戶路由 200、對等夥伴 100、供應商 50。於是階梯根本走不到 AS 路徑長度那一步。
- 規則 1,最高本地偏好:A 是 200、B 是 100、C 是 50。A 直接勝出。停。
- 最短的那條路由 C(走供應商)被否決了,即使它只穿越一個 AS,因為「從客戶鏈路賺到收入」勝過「把距離縮到最小」。
- 路由 A 被裝進轉送表並向外再廣告;B 與 C 留在記憶體裡當備援。萬一 A 被撤回,階梯會重跑一次,由 B(次高偏好)接手。
現在把鏡頭拉遠。為整個網際網路跑這個決策、握著大約一百萬個字首的路由、且沒有任何後備預設路由的那些路由器,住在無預設路由區:那是核心地帶,「我不知道,丟給上游吧」這個選項不存在,因為那裡根本沒有上游。那個區裡的每個營運者,都跑著自己私房版本的階梯、用著自己的路由政策,所以你的封包走的那條路,是成千上萬個獨立生意決策湧現出來的結果,而不是任何人規劃出來的全域最佳解。
這正是為什麼 BGP 既強大又脆弱,也是下一篇的主題。讓每個網路得以把自己的經濟學編碼進去的那份彈性,同時也意味著:一份單一的、出於錯誤或惡意的廣告——一條「通往你其實並不擁有的字首、卻更吸引人」的路由——可能在任何人察覺之前,就被階梯接受並擴散開來。政策凌駕距離賦予了網際網路它在真實世界裡的形狀;它同時也賦予了路由洩漏(route leak)與劫持(hijack)。牢牢抓住這道階梯,第 5 篇裡那些走錯的彎就會完全說得通。