路由演算法(routing algorithm)
想像你要規劃一趟橫跨全國的公路旅行,這個國家有上千個城鎮與道路。在開車出發前,你需要一張地圖,以及一套決定走哪些道路才能便宜地抵達各個目的地的方法。路由演算法(routing algorithm)正是網路裡的這個規劃步驟:它是路由器用來在資料真正傳輸之前,算出從網路某處到另一處良好路徑的程序。
把兩件聽起來相似但其實不同的工作分開會有幫助。轉送(forwarding)是路由器對每個抵達封包採取的快速、本地動作:看目的位址、查一張表、把封包推往正確的連接埠。路由(routing)則是較慢、涵蓋全網的思考,正是它先把那張表填好——算出哪個下一跳通往各個目的地。路由演算法是大腦(控制平面),轉送是反射動作(資料平面)。演算法偶爾才執行一次,在連結變動時跑;轉送則對每一個封包都發生。
路由演算法吃進一份網路的描述——通常是由路由器、連結與連結成本構成的圖——然後為每台路由器產生通往每個目的地的最低成本路徑。兩大經典家族是連結狀態(每台路由器學到整張地圖,自己用 Dijkstra 演算法算路徑)與距離向量(路由器只靠和鄰居互相交換距離估計來學習,也就是 Bellman-Ford 的想法)。OSPF、RIP 這些真實協定就是這些想法的具體實作。
一個誠實的提醒:『良好』的路徑未必真的是最短的。網管人員會替連結指派成本來反映頻寬、金錢或政策,所以演算法最佳化的是那些數字所說的東西——而在單一網路內部,這通常是為了效率;至於網路之間的路由(BGP)則由商業政策主導,而非單純的最短路徑。
某網路有路由器 A、B、C、D。直接連結:A-B 成本 1、B-C 成本 1、A-C 成本 5、C-D 成本 1。路由演算法算出 A 到 D 最便宜的路徑是 A -> B -> C -> D(成本 3),而不是 A -> C -> D(成本 6),即便 A-C 是一條單一的直接連結。
較少的跳數不等於較低的成本——演算法最小化的是連結總成本,而非跳數。
路由負責算路徑,轉送則照著走。人們常把兩者混為一談,但它們運作在不同的時間尺度——路徑只在拓樸改變時才重算,而轉送對每個封包都發生。