互連網IP路由的逐跳全域最佳化原則-Dijkstra演算法證明,路由-dijkstra
把周末寫了一半的東西繼續補齊了,實現了完美的一天。
我們知道的一個事實就是IP地址實在太多了,根本就不可能統一的管理起來,無論從資料平面還是從控制/管理平面上說都是這樣。所以,IP協議被設計出來就是可擴充的。對於IP路由來講,路由計算是逐跳進行的,當然也支援“源路由”選項,源路由就是說資料在出發前就已經把路線規劃好了,逐跳路由是IP路由的標準形式,也就是說,IP資料包是在路上即時規劃路線的。
我比較喜歡IP路由是因為這也是我旅行的方式,我喜歡旅行,但是我不喜歡事先訂酒店,事先規劃路線,導航等,我的方式是在路上看路牌前行,到了臨時停下的地方之後背著行囊找住處,然後走到哪算哪,這是一種說走就走且沒有目的地的遊盪...當然,IP資料包是有目的地的。
逐跳全域最佳化IP路由是在每一台路由器上逐跳路由的,那麼就產生了一個問題,偌大一個互連網,該怎麼相信這麼多逐跳路由拼接起來的一條完整的路徑確實是最佳化的呢?答案顯然是確定的,問題是怎麼證明它。
路由演算法書上講,路由演算法基本分為距離向量演算法和鏈路狀態演算法,各自的協議代表作就是RIP和OSPF(我就是靠著這兩個找到的第一份工作),確實是這樣,但是從這些演算法的正確性的證明過程中,你就會發現,確實是“逐跳的最佳化路由真的就是全域的最佳化路由”。本文中我僅僅給出基於鏈路狀態路由協議的Dijkstra演算法的證明,因為全網每台裝置的鏈路狀態資料庫都是相同的,所以它是很好理解的。
Dijkstra演算法正確性證明首先要給出Dijkstra演算法正確性的證明,才能進行後續的。畢竟,Dijkstra演算法本身只是指導了step by step的操作步驟,並沒沒能證明這麼折騰一圈得到的最短路徑樹中的每一條路徑確實是最短的。而要想證明逐跳全域最佳化原則,需要這個事實。
下面的給出了Dijkstra演算法正確性的簡單證明,詳細完備的數學證明可以參照這個思路:
逐跳全域最佳化的問題下面的點名了逐跳全域最佳化的問題所在:
逐跳全域最佳化的證明下面的給出了逐跳全域最佳化的簡單證明,證明方式多種多樣,我這裡給出的僅僅是其中一種:
附:Dijkstra演算法的貪心模型如果我們在地上倒上一杯水,觀察水攤開滲透的痕迹,就會理解Dijkstra演算法,它確實是不證自明的。大自然是懶惰的,總是用最省力的方式行事,水分子在落地那個點開始,在崎嶇不平的地上由於重力(暫時不考慮其它分子力)沿著一定的路徑到達一系列點,這些路徑一定是最短路徑。我們可以把地面的崎嶇程度視為路徑的權值,這不就和Dijkstra演算法模型一模一樣嗎?