毒性逆轉_電腦網路
來源:互聯網
上載者:User
選路環路(routing loop)和計數到無窮(count-to-infinity)
當某條連結的費用減少時,我們稱之為有一個“好訊息”。在網路中,好訊息的傳遞往往很迅速。 例如,存在這樣一個網路: 某一時刻,Y檢測到它到X的鏈路費用由4減少為1,好訊息當然要告訴大家了,於是它更新了自己的距離向量,並通知了Z。Z在收到Y的更新報文後,也更新了自己的距離向量(由5減為2),並向鄰居們發送更新報文。而後,Y又收到了Z的更新報文,但它發現並沒有改變自己的最低費用,於是保持不變。這樣,僅僅經過了兩次迭代網路就達到了靜止。好訊息通過網路得到了迅速傳播。
但是,當鏈路費用增加(甚至斷開)時,就不會這麼簡單了。 我們看下面這個例子: 還是X、Y、Z三個節點。此時Y檢測到它到X的路徑費用由4增加到了60。此時節點Z的距離向量為:d(X) = 5, d(Y) = 1, d(Z) = 0。於是Y在更新向量時發現,咦,Z到X的距離只有5誒,那可以先到Z再到X,於是Y的距離向量更新為:d(x) = 5 + 1 = 6, d(Y) = 0, d(z) = 1。我們可以發現,這個邏輯顯然是錯誤的,因為Z到X的距離為5的前提是要經過Y,但Y更新後的路徑又要經過Z,這就形成了一個選路環路(routing-loop)問題。因為Y的距離向量更新了(雖然是錯誤的),但它還是向Z發送了更新報文。Z收到更新報文後,比較了下鄰居們到X的距離,發現經過Y的路徑距離為1 + 6 = 7,小於直接到X的距離,於是Z也更新的自己的距離向量,然後又將更新後的距離向量發給Y。Y收到後又更新向量為8,然後再發給Z。。。這樣迴圈往複,更新報文在Y和Z之間傳來傳去,直到第44次迭代後,Z算出它經由Y的路徑費用大於50為止。此時,Z最終確定到X的最短路徑費用是直接到達X的費用50,而Y也得到了最短路徑是經Z到X的費用51。 可以看出,雖然最後還是得到了正確的資訊(最後的50和51是正確的。),但壞訊息的傳播與好訊息相比實在是慢太多了。而且,如果X和Y之間的費用為10000,Z和X的費用是9999時,就會出現計數到無窮(count-to-infinity)的問題。
毒性逆轉方法(The Reverse-Poison(Split-horizon) Hack)
上述的選路環路問題可以通過毒性逆轉的技術加以避免。它的基本思想是:如果Z的最短路徑要通過鄰居Y,那麼它將告訴Y自己到目的節點的距離是∞。這樣,Z向Y撒了一個善意的謊言,使得只要Z經過Y選路到X,它就會一直持續講述這個謊言,這樣Y也就永遠不會嘗試從Z選路到X了,也就避免了環路問題。(可見,有時善意的謊言也不是件壞事,也是為了你好啊T^T) 我們將毒性逆轉技術應用於上例。Y在更新自己的距離向量時,發現Z到X的距離是∞,於是它將d(x)無奈地更新為60,並向Z發送了更新報文。Z收到報文後更新自己的d(X)為50(直接選路到X),並發給Y更新報文(此時因為Z不需要經過Y進行選路,因此將告訴Y自己到X的距離為50)。Y在接收到Z的報文後,重新將距離更新為1 + 50 = 51,並告訴Z自己到X的距離是∞(實際是51)。Z收到報文後,發現最低耗費並沒有改變,因此演算法進入靜止狀態。
但是,當涉及3個或更多節點(而不僅僅是兩個直接相連的鄰居節點)的環路將不能被毒性逆轉技術檢測到,如下例:
當C和D之間的串連斷開時,依次發生如下事件: A收到來自C的壞訊息,然後將選擇從B到達D A向C發送更新報文 C向B發送更新報文 這種問題出現的原因是,A和B無法同時收到來自C的更新報文然後更新自己的距離向量。比如這裡,B與A相比得到的更新報文時間要晚,這就給A造成了“錯覺”,在A看來,雖然從C到不了D,但是選B也可以。然後它又把這個錯誤的好訊息告訴了C,讓C也以為自己又和D團聚了。最後,終於想到忽略了B,又發送了報文給B。這樣,A、B、C都以為自己和D聯絡上了。但實際上D和它們已經隔離了。。。