網絡層
將運輸層報文從發送主機送到接收主機,在發送側將報文段封裝成網絡層分組,在接收側將報文解出交給運輸層。網絡層協議位於每個主機和路由器上,路由器檢查經過它的所有的IP數據包的頭部字段。
|| 關鍵功能———選路、轉發
選路:
建立路由表(路由算法),決定分組從源到目的地所走的路徑。(就像規劃一個從源到目的地的旅行路線的過程)
轉發:
查路由表,將分組從路由器的輸入端口轉送到合適的輸出端口。(就像通過一箇中轉站,如機場、車站的過程)
、、
|| 路由算法分類——靜態 / 動態,全局 / 分佈式
靜態 VS 動態:
靜態路徑變化很慢;動態路徑變化比較快,週期性更新,反映鏈路費用變化。
全局 VS 分佈式:
全局:所有的路由器持有完整的網絡拓撲和鏈路費用的信息,“鏈路狀態”算法(L-S);
分佈式:路由器知道它與物理上相連的鄰居以及與鄰居間鏈路的費用,僅與鄰居交換信息,迭代計算路由,距離向量算法(D-V)。
@ D-V 路由算法:
異步的、迭代的:
引起每次迭代的條件: 本地鏈路費用發生變化,收到鄰居的DV。
分佈式的:
只有DV改變時才通知鄰居節點。
自停止的:
當計算DV不變時就停止通告。
Bellman-Ford 算例:
基本思想:
鏈路耗費變化:
X是目的節點哦~
- good news travels fast
(1) 當Y檢測到鏈路費用變化時,更新Dy(x) = 1, Dy(z) = 1;
(2) 通知Z更新: Dz(y) = 1, Dz(x) = 1+1 = 2.
(3) Z更新後通知Y更新:Dy(x) = 1, Dy(z) = 1;
(4) 發現不變後,停止通告。
- bad news travels slow
此時Y檢測到它到X的路徑費用由4增加到了60。此時節點Z的距離向量爲:Dz(x) = 5, Dz(y) = 1 。
(1) Y在更新向量時發現,咦,Z到X的距離只有5誒,那可以先到Z再到X,於是Y的距離向量更新爲:Dy(x) = 5 + 1 = 6, Dy(z) = 1。[ 注: 我們可以發現,這個邏輯顯然是錯誤的,因爲Z到X的距離爲5的前提是要經過Y,但Y更新後的路徑又要經過Z,這就形成了一個選路環路(routing-loop)問題。因爲Y的距離向量更新了(雖然是錯誤的),但它還是向Z發送了更新報文。]
(2) Z收到更新報文後,比較了下鄰居們到X的距離,發現經過Y的路徑距離爲1 + 6 = 7,小於直接到X的距離,於是Z也更新的自己的距離向量,Dz(y) = 1, Dz(x) = Dz(y) + Dy(x) =7。
(3) Z將更新後的距離向量發給Y。 Y收到後又更新向量Dy(x) = Dy(z) + Dz(x) = 8。
(4) 然後再發給Z…
解決方案——毒性逆轉方法:
基本思想:
如果Z的最短路徑要通過鄰居Y,那麼它將告訴Y自己到目的節點的距離是∞。這樣,Z向Y撒了一個善意的謊言,使得只要Z經過Y選路到X,它就會一直持續講述這個謊言,這樣Y也就永遠不會嘗試從Z選路到X了,也就避免了環路問題。(可見,有時善意的謊言也不是件壞事,也是爲了你好啊T^T)
實例解釋:
起初:Dz(x) = 5, Dz(y) = 1 ,Z到X是經過Y的。
(1)Y在更新自己的距離向量時,發現Z到X的距離是∞,於是它將Dy(x)無奈地更新爲60,並向Z發送了更新報文。
(2)Z收到報文後更新自己的Dz(x)爲50(直接選路到X),併發給Y更新報文(此時因爲Z不需要經過Y進行選路,因此將告訴Y自己到X的距離爲50)。
(3)Y在接收到Z的報文後,重新將距離更新爲Dy(x) = Dy(z) + Dz(x) = 1 + 50 = 51,並告訴Z自己到X的距離是∞(實際是51,y的最小路徑已經經過了z,這麼做是避免z再次選到y)。
(4)Z收到報文後,發現最低耗費並沒有改變,因此算法進入靜止狀態。
@ L-S 路由算法:
基本思想:
所有的節點都知道網絡拓撲和鏈路費用:通過鏈路狀態廣播實現,所有節點具有相同的信息。
以一個節點作爲“源”,計算到其他所有節點的最短路徑,Dijkstra算法,算出該節點的路由表。
Dijkstra 算法:
❤ L-S 與 D-V 的對比:
|| 相應協議:
@ RIP : 選路信息協議
- 採用D-V算法,距離度量最大15跳。
- RIP通告:RIP響應報文,每隔30秒鄰居之間交換一次;
通告報文內容:到達AS內部最多25個目的子網的距離 - 示例:
- 鏈路故障與恢復:
- 報文格式:
@ OSPF(Open Shortest Path First)