網路層:路由

貝爾曼-福特演算法(Bellman-Ford algorithm)

/ BEL-mun FORD /

假設你又想要到某目的地最便宜的路線,但你手上沒有整張地圖,只知道踏到每個直接鄰居的成本,並且你信任每個鄰居對自己離目的地多遠的估計。那麼你的最佳成本就只是:在所有鄰居之中,(抵達那個鄰居的成本)加上(那個鄰居到目的地的成本)的最小值。這一句直覺的話,就是 Bellman-Ford 方程,也是距離向量路由的核心。

寫出來,x 到目的地 y 的最低成本是 d_x(y) = 在所有鄰居 v 之中取 [ c(x, v) + d_v(y) ] 的最小值,其中 c(x, v) 是直接連結的成本,d_v(y) 是 v 自己到 y 的最低成本。在網路裡,路由器不是在完整的圖上算一次;而是以分散式的方式反覆套用這個方程:每台路由器保有它當前的距離估計,聽鄰居的估計,重算最小值,若有任何改變就重新通告。給足夠的回合與穩定的連結,估計就會收斂到真正的最低成本距離——而沒有任何路由器需要全域拓樸。

為什麼重要:Bellman-Ford 正是讓距離向量路由得以成立的關鍵,因為它只要求路由器把本地連結成本與鄰居通告的數字結合起來。它也和 Dijkstra 不同,在集中式版本中能應付負的邊權重(理論上有用,雖然網路連結成本是非負的)。RIP 本質上就是在跳數上跑的分散式 Bellman-Ford。

一個誠實的提醒:分散式版本的長處——依賴鄰居的估計——也是它的詛咒。當某個目的地變得無法抵達,路由器們可能持續餵給彼此略大一點的過時數字,朝無窮遞增而非快速收斂。這就是計數至無窮問題,水平分割與毒性逆轉也只能部分防範。

x 只能經由鄰居 a 與 b 抵達 y。c(x,a)=2 而 a 回報 d_a(y)=4;c(x,b)=6 而 b 回報 d_b(y)=1。Bellman-Ford 得出 d_x(y) = min(2+4, 6+1) = 6,選擇穿過 a 的路徑。

Bellman-Ford 方程把一個本地連結成本與每個鄰居自己的距離估計結合起來,再取最小值。

分散式 Bellman-Ford 從不見到完整拓樸,這正是它會繞圈並計數至無窮的原因。Dijkstra 則靠要求整張地圖來避開這點。

又称
distributed Bellman-FordBellman-Ford equation貝爾曼-福特方程