計算機網路: 網路層(Control Plane)
網路層裡分為兩層: Control Plane 和 Data Plane,之前我有篇部落格是寫 Data Plane 的,這篇就寫寫 Control Plane 吧。先來說說這兩個 Plane 是啥。
- Data Plane 一般用來將路由器裡的包從 Input 送到 Output,這個過程叫做 Forwarding。
- Control Plane 用於將包從一個路由器發到另一個路由器,這個過程叫做 Routing。
而如何去管理,構建 Control Plane 是個非常重要的問題,因為它牽涉到如何將包從一個路由器發到另一個路由器,這也是本篇文章的重點內容。
Per-Router 構建法
什麼是 Per-Router 呢?就是在每個路由器裡都算出路由表,以此作為基礎發信息。比如從要從北京發到廣州,其中要經過杭州,上海,廈門,那麼這些城市都要自己去算一張跌幅表。資訊從這些“中間”城市經過時就會去看這個路由表,來確定下一站要去哪。

但這種方法有個大問題,2,3個路由器好說,全球幾十億個路由器,每個路由器都要存一張到所有路由器的表那不是存資料存爆炸了?還有啊,每個路由器之間是要互相交換資訊的,如果資料要共享那交換資料就跟下載 4K 視訊差不多了。
要解決這個問題,我們可以想想一個國家是怎麼治理地區的——分治法!想想新疆和西藏這些自治區,都是自己管理自己的。所以網路世界多了一個名詞——Autonomous System,簡寫為 AS。
我們將路由器分在不同的 AS 裡,每個 AS 去管理自己的路由器,那麼路由器存的資料也就是 AS 裡所有路由器的資料了,資料量一下子就減少了很多!
Autonomous System
每個 Autonomous System 都會有自己的 ID,也叫做 ASN (Autonomous System Number),一般為 16~32 位。下面就是 AS 的一個例子。

先來介紹一下 AS 裡的術語:
- Local Traffic: 起點路由器到終點路由器的資訊傳輸。
- Transit Traffic: 這種傳輸會被別的 AS 傳遞到下一個 AS。
- Transit AS: 這種 AS 可以傳遞 Transit Traffic 到下一個 AS。
- Stub AS: Stub 英文就是根,所以這種型別的 AS 一般是葉子節點,一般只和一個 AS 有連線,而且只有 Local Traffic。
- Multihomed Stub AS: 這種 AS 會連線多個 AS,但是隻能有 Local Trafic。
上面的圖中 AS1 是 Multi-homed stub,AS3 和 AS4 是 Transit AS,AS2 和 AS5 是 Stub AS。
AS 相關協議
AS 就相當於將大堆路由器分成很多小堆,所以 AS 之間溝通本質上也是路由器在溝通,不同的是溝通的路由器在不同的 AS 裡。這些路由器就像是外交大使一樣,而外交大使一般要求會別國的語言吧,這些“別國的語言”在這裡就是協議。
AS 的協議分成兩種:
- Interior Gateway Protocol: 簡寫成 IGP,其實是一系列協議的統稱,如 RIP,OSPF 等,這些協議主要是用來告訴 AS 裡面路由器如何將包發到別的 AS,或者其他 AS 的資訊。
- Exterior Gateway Protocol: 簡寫成 EGP,這也是一系列協議的統稱,在這些協議中 BGP (Border Gateway Protocol) 是用的最多的。這個是解決 AS 之間如何交流問題的。

路由協議
上面說到的 RIP,OSPF 和 BGP 都是路由協議,後面還會介紹,不過現在我們要理解為什麼要這些協議。上面我只是模糊地說這些協議都是用來告知“資訊”的,那到底是什麼資訊呢?還記得剛開始說 Control Plane 的作用麼?就是用來 Routing 的,那怎麼做 Routing 呢?用 Routing Table 呀。Routing Table 怎麼造起來呢?這些“資訊”就是用來造 Routing Table 的。
所以現在我先介紹路由協議是什麼(其實就是路由演算法),再去講這三個協議,其實他們都是路由協議的實現方式而已。
組成部分
路由協議重要的點有下面三個:
- 要有一種方式讓路由器知道和別的路由器到底能不能通訊。
- 要有一種方式讓路由器知道要走哪條最短的路可以到達別的路由器。
- 要有一種方式使得改了網路結構後,上面兩點會自動更新。
Link State 演算法
- 每個路由器都會知道相鄰路由器的資訊
- 距離資訊會廣播到每個路由器,相當於是全域性資訊
- 每個路由器會使用自己的演算法去計算 Routing Table
關鍵詞:動態更新,使用區域性資料
Distance Vector 演算法
- 每個路由器都會知道相鄰路由器的資訊(沒看錯和上面的一樣)
- 每個路由器會週期性地將自己的資訊發給相鄰的路由器
- 如果網路結構改變了,那麼會更新相鄰的路由器,最終整個網路都會完成更新
關鍵詞:全域性一波更新,使用全域性資料
還是路由協議
下面開始講對上面兩種演算法的應用,也就是上面提到的 RIP,OSPF 和 BGP。
RIP
RIP 也叫做 Routing Information Protocol。 先說明,這個協議是屬於內部 Routing 的也就是屬於 IGP。
- 使用 Distance Vector 演算法
- 每個路由器都知道相鄰路由器的 Link 權重
- Link 的權重通常都是按 Hop 來算的
- 將自己 Routing Table 廣播到相鄰路由器
- 使用 Bellman-Ford 演算法來計算 Routing Table
- 路由器會以下資訊發給自己鄰居
- 通過 UDP 傳送 RIP 資訊
- Routing Table
這個怎麼感覺和上面的講的 Distance Vector 演算法差不多呀?哎,你有這感覺就對了。所以說這些協議就是上面演算法的實現而已。我們來看個例子吧。

A 將自己的 Routing Table 發給 B,B 就會更新自己的 Routing Table,就是這麼簡單!
不過呢,這個協議也有自己的缺點:
- 特別依賴鄰居的資訊,如果不設定一個值,路由器之間會不斷髮自己的 Routing Table 給對方,嚴重一點還會出現迴圈發包情況。所以一般會設定一個 Counter 值來看這個資訊已經經過多少個路由器了。
- 因為每個路由器更新資訊都依賴於相鄰的人,所以當網路結構變了後,要一個一個傳來更新,更新速度比較慢。
- 要關鍵的是,這個協議已經不用了,Rest In Peace.
OSPF
OSPF 也叫做 Open Shortest Path First。這個協議也是屬於 IGP 的。下面是它的實現。
- 使用 Link-State 演算法
- 每個路由器都會存放一個完整的 AS 網路結構
- 會將 Link State 資訊發給每個路由器
- 使用 Dijkstra 演算法
- OSPF 會在整個 AS 裡將資訊廣播到全部路由器
- 使用 IP 層來完成
既然要存放全域性資訊就要存在大容量資料結構裡,而不是一張小表格,所以這些資料存放在資料庫裡,其中包含了 LSDB (Link State Database) 和存放整個網路拓撲結構的資料庫。流程如下

當 AS 的網路結構發生變化後,會產生 LSA (Link State Announcement) 來通過所有路由器去完成資料庫的更新。每個 LSA 會有一個 ID ,路由器以此來判斷是否已經接收過這個 LSA 了。

這些 LSA 有下面幾種型別
- hello:用於與相鄰 router 構建連線的,並用來選出 Designated Router (DR) and BackupDesignated Router (BDR )
- database description (DBD, DD), 包含了簡短的資料庫資訊,用於檢測是否和本地資料庫一樣,不一樣就更新
- link-state request: router 用於獲取資料庫資訊
- link-state update: 用於迴應 LSR,還有更新最新資訊
- link-state acknowledge (LSACK):告知已經收到了 LSU
再來說說 OSPF 的特點
- 安全:所有的 OSPF 都會有鑑權,會更安全
- 在相同總權重數下允許多條路
- 可以在同一個 domain 下分層

這上面的分層過程中,要注意下面幾個點
- 雙層結構
- LSA 只會在同一個 area 出現
- 每個節點都會有完整的 area 資訊
- 只從 border router 裡知道到別的 area 最短路徑
- Area Border Router
- 知道到別的網路最短路徑
- Backbone Router
- Route 會受限於 Backbone Router
- Boundary Router (Gateway) 會連線到別的 AS
BGP
OSPF 說了很多,因為這是比較主流的,下面說一個用於 EGP 的主流協議——BGP (Border Gateway Protocol)。
BGP 又可以分成下面兩個
- eBGP (external Border Gateway Protocol): Border Router 從相鄰的 AS 裡獲取子網的 reachability
- iBGP (internal Border Gateway Protocol): 將別的 AS 的 reachability 傳給 AS 裡的路由器
看起來 iBGP 屬於內部 Routing 呀,不對,因為這個主要是用來告知該 AS 路由器裡別的 AS 的情況,所以屬於外部 Routing。
AS 之間交換 BGP 流程如下
- AS1 和 AS 2 構建 TCP 連線
- 交換 BGP 資訊
- 只要是還有連線,那麼就會週期性地更新資訊
其實 BGP 到這裡就沒有了,BGP 就是傳遞其他 AS 的資訊的,不是說好要造一個 Routing Table,然後用 XXX 演算法來實現麼?這就要扯到 Policy 了。
AS 之間的互動
現在要解決的是 AS 之間的互動,就是剛剛說的外部 Routing。我們先想一個簡單的思路:求 AS 的最短路徑來完成 Routing,好,我給下面的例子

如果用最短路徑,左邊路徑是 3 個 hop,右邊是 1 個 hop,難道我就要走右邊了麼?不見得吧,那有 4 個 Router 呢。所以外部 Routing 要比我們想像得要複雜,不能簡簡單單地用演算法解決,而是應該在不同悅下用不同的方式去做 Routing,這裡的 “不同方式” 就是所說的 Policy。流程如下

選擇 route
主流怎麼選擇最“好”路徑可以參考下面的標準
- Local preference
- Shortest AS-PATH
- Closest NEXT-HOP
- 額外的標準