《計算機網絡自頂向下方法》(3) 網絡層

網絡層

因特網的網絡層負責將名爲數據報(datagram) 的網絡層分組從一臺主機移動到另一臺主機。

網絡層有兩種重要的功能:

  • 轉發。當一個分組到達路由器的一條輸入鏈路時,路由器必須根據將該分組移動到適當的輸出鏈路。

  • 路由選擇。當分組從發送方流向接收方時,網絡層必須決定這些分組所採用的路由或路徑。

轉發是指將分組從一個輸入鏈路接口轉移到適當的輸出鏈路接口的路由器本地動作。路由選擇是指網絡範圍的過程,以決定分組從源到目的地所採取的端到端路徑。

4.2 虛電路和數據報網絡

虛電路網絡

虛電路網絡在網絡層使用名爲虛電路(VC)的連接。一條虛電路需要的資源有:源和目的主機之間的路徑(即一系列鏈路和路由器)、沿着該路徑的每段鏈路的一個 VC 號、沿着該路徑的每臺路由器中的轉發表表項。

屬於一條虛電路的分組將在它的首部攜帶一個 VC 號。一條虛電路在每條鏈路上可能具有不同的 VC 號,原因是逐鏈路替換能夠減少 VC 號字段的長度,並能夠簡化虛電路的建立(避免了大量的協商報文)。因此,每臺路由器必須根據它的轉發表爲正在轉發的分組替換其首部中的 VC 號。

在虛電路網絡中,該網絡的路由器必須爲進行中的連接維持連接狀態信息。特別是,每當跨越一臺路由器創建一個新連接,必須在該路由器的轉發表中增加一個新的連接項;每當釋放一個連接,必須從該表中刪除該項。值得注意的是,即使沒有 VC 號轉換,仍有必要維持連接狀態信息,該信息將 VC 號與輸出接口號聯繫起來。因此,對於一個虛電路網絡,沿兩個端系統之間路徑上的路由器都要參與虛電路的建立,且每臺路由器都完全知道經過它的所有虛電路。

數據報網絡

數據報網絡不維護任何連接。

在數據報網絡中,每臺路由器有一個將目的地址映射到鏈路接口的轉發表。當分組到達路由器時,路由器使用該分組的目的地址與轉發表各表項進行最長前綴匹配,然後將該分組向匹配項中的輸出鏈路接口轉發。

因爲在數據報網絡中路由器的轉發表隨時可能修改,從一個端系統到另一個端系統發送的一系列分組,也就可能在通過網絡時走不同的路徑,並可能無序到達。

4.3 路由器工作原理

在這裏插入圖片描述

路由轉發平面:路由器的輸入端口、輸出端口和交換結構通過硬件實現了轉發功能。

路由控制平面:路由選擇算法(運行在路由選擇處理器上)通過軟件實現了路由選擇功能。

輸入端口

輸入端口接收分組,需要依次承擔物理層功能(將路由器與物理鏈路相連接)、鏈路層功能(與位於入鏈路遠端的數據鏈路層交互)和網絡層功能(查找轉發表爲分組選擇相應的輸出端口)。

每個輸入端口擁有轉發表的一份影子副本,避免了集中式處理的瓶頸。

交換結構

交換結構將輸入端口與輸出端口相連。有三種交換方式:

  • 經內存交換。交換以 I/O 的形式在 CPU 的控制下進行。因爲經過共享系統總線一次僅能執行一個內存讀/寫,所以不能同時轉發兩個分組,即使它們有不同的端口號。如果內存帶寬爲每秒可寫進內存或從內存讀出 B 個分組,則總的轉發吞吐量必然小於 B/2。
  • 經總線交換。分組經一根共享總線直接到達輸出端口,一次只有一個分組能夠跨越總線。
  • 經互聯網絡交換。縱橫式網絡由 2N 條總線互聯而成,能夠並行轉發多個分組(最多 N 個)。然而,如果來自兩個不同輸入端口的兩個分組其目的地爲相同的輸出端口,則一個分組必須在輸入端等待,因爲在某個時刻經給定總線僅有一個分組能夠發送。

在這裏插入圖片描述

何處出現排隊

在輸入端口和輸出端口處都能形成分組隊列,隨着隊列的增長,路由器的緩存空間最終將會耗盡,並且當無內存可用於存儲到達的分組時將會出現丟包

4.4 網絡協議:因特網中的轉發和編址

IPv4 數據報格式

在這裏插入圖片描述

  • 首部長度:4 比特,IPv4 數據報是可變長的(通過包含選項),需要指示數據部分實際從哪裏開始。通常,數據報不包含選項,所以,數據報首部的典型值是 20 字節。
  • 服務類型:8 比特,用來指示不同的服務類型。
  • 數據報長度:16 比特,數據報的總長度(首部 + 數據)。數據報長度理論最大值爲 65535 字節,但實際一般不超過 1500 字節。
  • 標識、標誌、片偏移:共 32 比特,與 IP 分片有關,討論見後。
  • 壽命(TTL):8 比特,每經過一臺路由器,該字段的值便減一,以確保數據報不會永遠在網絡中循環(當遇到路由環路時)。
  • 協議:8 比特,用來指示目的主機該將該數據報交由哪個運輸層協議,其中 6 代表 TCP,17 代表 UDP。協議號是將網絡層與運輸層綁定到一起的粘合劑,類似的,端口號是將運輸層和應用層綁定到一起的粘合劑。
  • 首部檢驗和:16 比特,用於首部的差錯檢測,計算方式與 UDP 一致。路由器一般會丟棄檢測出錯誤的數據報。注意到由於 TTL 字段的存在以及可能的選項字段的改變,每臺路由器上必須重新計算檢驗和並再次存放到原處。爲什麼 TCP/IP 在運輸層與網絡層都執行差錯檢測?首先,IP 只對 IP 首部計算檢驗和,而 TCP/UDP 對整個報文段計算;其次,TCP/UDP 與 IP 不一定都必須屬於同一個協議棧。
IP 數據報分片

一個鏈路層幀能承載的最大數據量稱爲最大傳送單元(MTU),典型值爲 1500 字節。發送方與目的地路徑上的每段鏈路可能使用不同的鏈路層協議,且每種協議可能具有不同的 MTU。MTU 限制了 IP 數據報的長度,因此,在必要的時候,路由器需要將數據分成兩個或多個較小的 IP 數據報,以適應較小的 MTU,這些經分片而成的較小的數據報稱爲片。需要注意的是,每個片都有自己的報頭(前面說了,通常爲 20 字節),所以,實際能夠承載的數據是 MTU-20 字節。

爲堅持網絡內核保持簡單的原則,重新組裝片的任務被安排到了端系統中。接收方利用標識、標誌和片偏移字段來判斷一個數據報是否是片,以及片是否收集齊。

  • 標識號:16 比特,用來標識一個數據報,發送方通常將爲它發送的每個數據報的標識號加 1(不同於 TCP 的字節流序號)。於是,接收方檢查數據報的標識號以確定哪些數據報實際上是同一較大數據報的片。
  • 片偏移:13 比特,片有可能丟失,爲了讓目的主機確定是否丟失了一個片(且能按正確的順序重新組裝片),使用偏移字段指定該片應放在初始 IP 數據報的哪個位置。偏移字段的單位是 8 字節。
  • 標誌:爲了讓目的主機相信它已收到了初始數據報的最後一個片,最後一個片的標誌比特被設爲 0,而其他片的標誌比特被設爲 1。

在這裏插入圖片描述

分片是有開銷的,它使路由器和端系統更爲複雜,同時,能夠被用於生成致命的 DoS 攻擊。

IPv4 編址

IP 地址長度爲 32 比特(4 字節),採用點分十進制記法書寫,即每個字節用它的十進制形式書寫,各字節間以點隔開,如 11000001 00100000 11011000 00001001 的點分十進制記法爲 193.32.216.9。

一個 IP 地址技術上是與一個接口相關聯的,而不是與包括該接口的主機或路由器相關聯的。

子網

IP 地址可以分爲網絡號(高位比特)和主機號(低位比特)。具有相同網絡號的(一般情況下),且不跨越路由器(第三層及以上網絡設備)可以彼此互聯的設備接口,構成了一個子網

IP 地址本身並不提供子網的信息,要指示一個子網的網絡號,就需要用到子網掩碼。子網掩碼是這樣一類虛擬 IP 地址,對應的子網的網絡號的位在子網掩碼上就取 1;主機號的位,就取 0。如一個子網的網絡號爲高 8 位,那麼它的子網掩碼就爲 255.0.0.0。

子網掩碼不能單獨存在,它與對應的 IP 地址成對出現。通過將 IP 地址與子網掩碼按位與,能夠提取出該 IP 地址的子網地址。進一步的,將另一個 IP 地址與當前 IP 地址的子網掩碼按位與,就能判斷出這個 IP 地址是否與當前 IP 地址處於同一個子網中。

網絡號用來標識網絡(子網),主機號用來標識該網絡中的設備接口。其中,子網內有一些特殊的 IP 地址,用於特殊的用途,不能被分配給設備接口:

  • 主機號全 0 的 IP 地址,是子網地址,代表該子網的網段。
  • 主機號全 1 的 IP 地址,是廣播地址,指向該子網內所有的主機。

因此,記主機號長度爲 h,一個子網內的地址數爲 2h2^h ,可用的地址數爲 2h22^h-2。如

子網地址 172.32.0.0,子網掩碼 255.255.254.0

其地址範圍爲 172.32.0.0 ~ 172.32.1.255

可分配的地址範圍爲 172.32.0.1 ~ 172.32.1.254

廣播地址爲 172.32.1.255

編碼方案:分類編址

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

編碼方案:CIDR

無類別域間路由選擇(CIDR)不同於分類編址,對於網絡號長度,沒有特定的限制。CIDR 編址的形式爲 a.b.c.d/x,其中 x 指示了該地址網絡號(或說前綴)的比特數,剩餘的 32-x 比特是主機號。同時,x 也指示了該網絡的子網掩碼,即高 x 位均爲 1,剩餘 32-x 位均爲 0。

有了 CIDR,就可以使用路由聚合:將多個網絡的最長公共前綴作爲轉發表中的項。如,有三個子網:200.23.16.0/23、200.23.20.0/23、200.23.30.0/23,將它們聚合,就是 200.23.16.0/20,因爲它們的最長公共前綴爲 200.23.16.0,且該前綴的長度爲 20。由於路由器在轉發表中查找匹配項時採用的是最長公共前綴算法,目的地址是這三個子網中的任意一個時,都能通過聚合後的地址轉發到正確的輸出端口,然後經過下一級路由更精細地轉發。這樣,就能利用單個網絡前綴通告多個網絡,減小轉發表的規模,縮短路由查找的時間。

獲取主機地址:DHCP

子網劃分完畢後,在一個網絡內,各個接口如何獲得地址?一種方案是硬編碼,通過手動靜態配置,但缺陷可想而知。更常用的方案是使用**動態主機配置協議(DHCP)**通過網絡動態獲取一個臨時的 IP 地址,以及相應的子網掩碼、第一跳路由器地址(默認網關)與本地 DNS 服務器地址。通過動態分配 IP 地址,可以達成地址的重用。

DHCP 包括四個步驟:

  1. DHCP 服務器發現。首先,主機需要發送一個 DHCP 發現報文(由 UDP 承載,端口號爲 67),來發現能夠使其獲得 IP 地址的 DHCP 服務器。此時,由於主機尚未擁有 IP 地址,發送的報文中攜帶的源地址就使用代表 ”本主機“ 的源地址 0.0.0.0;由於尚未知道 DHCP 服務器的地址,目的地址就使用廣播目的地址 255.255.255.255。
  2. DHCP 服務器提供。當該網絡內的 DHCP 服務器收到一個 DHCP 發現報文時,響應以 DHCP 提供報文。該報文仍使用廣播(實踐中,也會有使用單播的情況),攜帶有向客戶推薦的 IP 地址、子網掩碼和地址租借期等。
  3. DHCP 請求。網絡內可能存在多個 DHCP 服務器,主機就在收到的 DHCP 提供報文中選擇一個地址,然後響應以 DHCP 請求報文,這個報文仍是廣播。
  4. DHCP 確認。被選中的地址提供服務器響應以 DHCP ACK 報文,該報文采用廣播(實踐中,也會有使用單播的情況)。
網絡地址轉換:NAT

私有網絡地址空間 10.0.0.0/24 專用於家庭網絡等本地網絡,僅對特定網絡內的設備有意義。一旦數據報需要離開本地網絡,它就需要一個因特網地址。這時,就需要用到網絡地址轉換(NAT),NAT 使能路由器將所有離開本地網絡的數據報的源目的地址置換爲相同的 NAT IP 地址以及不同的端口號。

實現 NAT,需要使用在 NAT 路由器上的 NAT 轉換表,表項中記錄了(NAT IP 地址,NAT 端口號,本地 IP 地址,本地端口號)四元組。每當有外出數據報需要轉發,NAT 路由器替換其源 IP 地址和源端口號,並記錄下表項。NAT 路由器通過 NAT 端口號來區分不同的(本地 IP 地址,本地端口號),由於端口號長度爲 16 比特,所以可以支持超過 60000 個並行連接。

NAT 的優點在於:

  • 擴充能夠聯網的主機數,解決 IP 短缺的問題
  • 本地網絡設備 IP 地址的變更,無需通告外界網絡
  • 變更 ISP 時,無需修改內部網絡設備編址
  • 內部網絡設備對外界網絡不可見,提高安全性

NAT 的爭議在於:

  • 端口號應當用於進程編址,而不是主機編址

  • 路由器應當最高只處理第三層的分組

  • 違反端到端原則

  • 地址短缺應由 IPv6 解決

  • 妨礙 P2P 應用程序

因特網控制報文協議:ICMP

ICMP 被主機和路由器用來彼此溝通網絡層的信息,典型用途是差錯報告。ICMP 報文由 IP 數據報承載,它有一個類型字段和一個編碼字段,並且包含引起該 ICMP 報文首次生成的 IP 數據報的首部和前 8 字節內容(以便發送方能確定引發該差錯的數據報)。

  • ping 的實現

ping 程序向指定主機發送一個 ICMP 回顯請求(類型 8 編碼 0)報文,目的主機將會發回一個 ICMP 回顯回答(類型 0 編碼 0)。

  • tracert 的實現

要實現一個 Tracert 工具,核心思想就是 TTL 的設置和 ICMP 協議。Tracert 向目的主機發送一系列的 數據報,第一個的 TTL 爲 1,第二個的爲2,第三個的爲 3…以此類推,併爲每個數據報計時,計算 RTT。這樣,第 n 個數據報到達路由路徑的第 n 個路由器時,就剛好會過期,那麼此時,路由器就會丟 棄該數據報,並向源主機發送一個 ICMP 報文,這個報文裏包含了路由器的名字和 IP 地址。Tracert 一 旦收到 ICMP 報文,就可以記錄路由器信息和 RTT 了。Tracert 一值發送數據報,直到數據報的 TTL 足 夠剛好到達目的主機。這時,由於這些數據報攜帶 UDP 報文段,並且其目的端口是 UDP 不可達的,那 麼,當目的主機收到該數據報時,發現其端口不可達,就向源主機發送一個 ICMP 報文。源主機的 Tracert 程序一旦收到目的主機發送來的 ICMP 報文,就停止發送分組了,此時得到的 RTT 就是到目標 主機的往返時延。

IPv6

IPv6 的變化主要有:擴大的地址容量、簡化高效的 40 字節首部以及流標籤與優先級。同時,IPv6 不允許中間路由器進行分片與重組,只能在端到端執行。

4.5 路由選擇算法

與主節直接相連的路由器稱爲該主機的默認路由器(或第一跳路由器),默認路由器的地址就是該主機的默認網關。路由選擇的工作是,在源路由器到目的路由器選擇合適的路徑(路由),這可以轉化爲圖論的最短路問題。

在這裏插入圖片描述

對路由選擇的算法的分類,主要是以全局式分散式來區分。全局式路由選擇算法用完整的、全局性的網絡知識計算出從源到目的地之間的最低費用路徑,如鏈路狀態(LS)算法。分散式路由選擇算法以迭代、分佈式的方式計算出最低費用路徑,如距離向量(DV)算法。

鏈路狀態路由選擇算法(LS)

在鏈路狀態算法中,網絡拓撲和所有的鏈路費用都是已知的,也就是說可以用作 LS 算法的輸入。實踐中,每個節點向網絡中所有其他結點,使用鏈路狀態廣播算法廣播鏈路狀態分組,分組中包含它所連接的鏈路的特徵和費用。結點廣播的結果是所有結點具有了該網絡的等同的、完整的視圖。於是每個結點都能夠像其他結點一樣,運行 LS 算法並計算出相同的最低費用路徑集合。

LS 算法可以採用 Dijkstra 算法,非常簡單。

在這裏插入圖片描述

用上面的網絡作爲例子就是

在這裏插入圖片描述

於是,可以得到關於點 u 到其他各點的最短路徑以及位於點 u 的路由器的轉發表

在這裏插入圖片描述

上述的 LS 算法的圖模型是一個非常簡單的無向圖,當鏈路費用等於鏈路上承載的負載時,這意味着要運用這個圖模型要保證鏈路費用是對稱的(即 c(u, v)=c(v, u)),然而現實常常並非如此,這就要求我們採用有向圖模型。問題在於,一旦使用有向圖模型,LS 算法就可能出現路由振盪:路由器以爲自己找到了更好的路徑,其實只是在固定的幾條道路上輾轉反覆。要解決路由震盪,一種不可接受的方案是強制鏈路費用不依賴於所承載的流量,因爲路由選擇的目標之一就是要避開高度擁塞的鏈路。另一種方案是讓每臺路由器發送鏈路通告的時間隨機化。

距離向量路由選擇算法(DV)

DV 算法是分佈式的,因爲每個結點都要從一個或多個直連鄰居接收信息,執行計算,然後將結果分發給鄰居;也是迭代的,因爲此過程要一直持續到鄰居之間無更多信息要交換爲止(算法會自我終止);還是異步的,因爲它不要求所有結點相互之間步伐一致地操作。

DV 算法根據 Bellman-Ford 方程 dx(y)=minv{c(x,v)+dv(y)}d_x(y) = min_v\{c(x, v) + d_v(y)\} 得來,其中,x 是起始點,y 是終點,v 是 x 的鄰居。這個方程的正確性很顯然。路由器據此得出使得 dx(y)d_x(y) 最小的鄰居 vv^*,並將它作爲轉發表中目的地爲 y 的數據報的下一跳地址。

DV 算法的思路是,每個結點 x 估計它自己到 N 中所有其他結點的最短路徑,得到一個距離向量 Dx=[Dx(y):yN]D_x = [D_x(y): y \in N] ,然後與它的鄰居交換彼此的向量,並將交換得到的向量帶入 Bellman-Ford 方程中,試圖更新自己的距離向量。如果從鄰居獲得的距離向量使得自己的距離向量得到更新,或直連鏈路費用發生變化導致自己的距離向量得到更新,那麼結點 x 會向每個鄰居發送更新後的距離向量。重複執行直到收斂。

因此,每個結點 x 維護下列路由選擇信息:

  • 結點 x 到每個鄰居 v 的費用 c(x, v)
  • 結點 x 的距離向量,包含了 x 到N 中所有目的地 y 的費用的估計值
  • 結點 x 的每個鄰居的距離向量,即對 x 的每個鄰居 v,有 Dv=[Dv(y):yN]D_v = [D_v(y): y \in N]

在這裏插入圖片描述

總的來說,只要每個結點的距離向量發生變化,就向鄰居發送自己的向量,並用從鄰居接收到的向量更新自己的向量。重複這個過程,所有結點的向量就會趨向收斂。最終所有結點都不再發送自己的向量,算法自我終止。

在這裏插入圖片描述

DV 算法同樣有缺陷。假設鏈路費用改變,若是由高費用轉爲低費用,那麼結點很容易更新它自己的距離向量,並分發給鄰居,鄰居很快也能更新自己的向量,找到最低費用。若是由低費用轉爲高費用,事情就不一樣了。

在這裏插入圖片描述

以上圖爲例,假設我們只關注 y 與 z 到達目的地 x 的情況,初始時,dy(x)=4,dy(z)=1,dz(x)=1,dz(x)=5d_y(x)=4, d_y(z)=1, d_z(x)=1, d_z(x)=5,此爲已收斂的狀態。某一時刻,y 到 x 的鏈路費用由 4 變爲 60,y 探測到了該變化,並用此更新自己的向量。此時,y 的向量告訴它,經過 z 能以 5 費用到達 x,加上 y 到達 z 的費用 1,那麼 y 經過 z 到達 x 的費用爲 6。y 將 60 與 6 相比,毫不猶豫地選擇了 6,也就是選擇了下一跳爲 z,並將更新告知 z。但這顯然是錯誤的,因爲 z 到達 x 費用爲 5 的前提是,z 經過 y 到達 x,並且是以 y 到 x 的鏈路費用爲 4,即未發生變化。然而, 變化已經發生。接下來,z 收到 y 的向量,得知 y 到達 x 的費用更新了,變成了 6。z 將 z 到 y 的費用與 y 到 x 的費用相加得到 7,與 50 相比,選擇了 7,也就是選擇了下一跳爲 y。

就這樣,產生了路由環路。y 與 z 反覆相互選擇,費用以每次更新加 1 的速度增長,直到 z 發現經過 y 到達 x 所需的費用超過了 z 直連 x 的費用。於是,z 選擇直連,也就是選擇了以費用 50 到達 x。此時,y 和 z 的向量都不再更新,而費用更新的次數高達 50-4=46 次。可以看出,當鏈路費用增長時,要收斂到正確的最低費用,需要的時間是非常漫長的。甚至,當出現特定的費用改變(如 c(y, x) 變爲 10000,c(z, x) 變爲 9999),還會產生無窮計數問題。

要解決這個特定的路由環路問題,可以採用毒性逆轉,即如果 z 選擇通過 y 到達目的地 x,則 z 將通告 y,z 到 x 的距離是無窮大,這樣 y 和 z 就不會相互選擇了。需要注意的是,毒性逆轉只能解決上述特定的問題,對涉及三個或更多的結點的環路無能爲力。

LS 與 DV 的比較
  • 報文複雜性。LS 要求每個結點都知道網絡中每條鏈路的費用,所以共需發送 O(NE)O(NE) 個報文;DV 只有在結點自身的距離向量發生改變後纔會發送報文。
  • 收斂速度。LS 的 Dijkstra 版本複雜度爲 O(n2)O(n^2) ,經優化後可達到 O(nlogn)O(n\log n);DV 收斂速度較慢,還有路由環路、無窮計數問題。
  • 健壯性。LS 的每個結點都相對獨立地計算自己的轉發表,部分路由器故障不會導致整個系統失效,具有一定的健壯性;DV 的每個結點都要與鄰居交互,所以一旦一個路由器發生故障,就會將出錯的數據傳播到整個網絡中,導致網絡癱瘓。

4.6 因特網中的路由選擇

層次路由選擇

隨着路由器的數目增多,在大規模範圍內執行 LS 算法變得不切實際。同時,各個組織希望能夠對各自的路由器實現管理自治。基於以上理由,出現了自治系統(AS),即一組處在相同管理控制下的路由器。在一個 AS 內運行的路由選擇算法稱爲自治系統內部路由選擇協議(如 RIP、OSPF),在 AS 間運行的使得相鄰 AS 能夠交換可達性信息的路由選擇算法稱爲自治系統間路由選擇協議(如 BGP4)。

因特網中自治系統內部的路由選擇:RIP

路由選擇信息協議(RIP)是一種距離向量協議,使用跳數作爲其費用測度,即每條鏈路的費用爲 1。與通常的跳概念不一樣,RIP 中的一跳意味着一個子網到另一個子網,而非一臺路由器到另一臺路由器。一條路徑的最大跳數被限制爲 15,限定了 RIP 只能使用在網絡直徑不超過 15 跳的 AS 中。

在這裏插入圖片描述

RIP 中的路由器維護一張路由選擇表,使用 RIP 響應報文(或稱爲 RIP 通告)來交換彼此到達 AS 內各子網的最短路徑的估計值,以更新各自的路由選擇表,大約每 30 秒交換一次。一臺路由器一旦超過 180 秒沒有從鄰居收到報文,則該鄰居被認爲是不可達的。然後,路由器修改本地路由選擇表,並向其他鄰居通告該信息。路由器也可通過 RIP 請求報文,請求其鄰居到指定目的地的費用,該報文使用 UDP 承載,端口號爲 520。

因特網中自治系統內部的路由選擇:OSPF

開放最短路優先(OSPF)的核心是一個使用洪泛鏈路狀態信息的鏈路狀態協議和一個 Dijkstra 最短路算法。也就是說,每個路由器構造了一棵以自身爲根結點到所有子網的最短路徑樹。OSPF 的鏈路費用是由網絡管理員配置的,因此,可以選擇不同的機制。

OSPF 中的路由器在感知到鏈路狀態變化時(如費用變化或連接狀態變化),便會向所有其他路由器廣播路由選擇信息。即使鏈路狀態未發生變化,它也要週期性(至少每隔 30 分鐘一次)廣播鏈路狀態,以提高健壯性。OSPF 通告包含在 OSPF 報文中,直接由 IP 承載,對上層協議的值爲 89。

OSPF 還能夠在單個 AS 內組織起層次結構,劃分的每個區域都執行自己的 OSPF 算法。在一個區域內,一臺或多臺區域邊界路由器負責爲流向該區域以外的分組提供路由選擇,這些區域邊界路由器(有時包括一些非邊界路由器)組成了唯一的 OSPF 主幹區域,爲 AS 內其他區域之間的流量提供路由選擇。於是,一個 AS 內跨 OSPF 區域的分組需要首先被路由到區域邊界路由器,通過主幹區域路由到目的區域的區域邊界路由器,最終到達目的地。

OSPF 更爲安全,能爲每臺路由器配置相同的口令(明文的或 MD5 加密的),以鑑別分組是否來自 AS 內部。

自治系統間的路由選擇:BGP

邊界網關協議(BGP)是當今因特網域間路由選擇協議的標準。BGP 主要的工作有

  • eBGP 會話:從相鄰 AS 處獲得子網可達性信息
  • iBGP 會話:向本 AS 內部的所有路由器傳播這些可達性信息
  • 基於可達性信息和 AS 策略,決定到達子網的 “好” 路由

在 BGP 中,路由器對通過使用 179 端口的半永久 TCP 連接來交換路由選擇信息,在 AS 內部構成一個完全圖,在 AS 間由網關路由器將不同 AS 相連。

BGP 使得每個 AS 知道經過其相鄰 AS 可達哪些目的地,這些目的地並非主機,而是 CDIR 化的前綴,也就是子網或子網的集合(路由聚合的結果)。這個過程通過不同 AS 的網關路由器間的 eBGP 會話完成。接下來,這個學習到的前綴會通過 iBGP 會話傳播給 AS 內部的其他路由器。於是,路由器可以在轉發表爲之創建一個表項。

BGP 會話所通告的路由,除了前綴還包括一些屬性,較爲重要的是 AS-PATH 和 NEXT-HOP。

  • AS-PATH:記錄該通告已經通過的 AS 所構成的路徑(AS 由自治系統號 ASN 標識)。每當通告傳播到一個新的 AS,AS 就將自己的 ASN 加入到 AS-PATH 中,以預防循環通告。
  • NEXT-HOP:記錄通告 AS 到被通告 AS 的網關路由器的接口的 IP。(說實話,我覺得本書寫作/翻譯最爛的部分就是 NEXT-HOP 的講解,巨爛無比)

路由器添加轉發表項時,可能面臨多條到達相同目的地的路由通告,這時,就需要依次選擇:

  1. 本地偏好值高的路由

  2. AS-PATH 路徑短的路由

  3. NEXT-HOP 最近的路由

4.7 廣播和多播路由選擇

廣播

廣播即是從源點向網絡中所有其他節點發送分組的服務。要實現廣播,最 naïve 的想法就是用 N 次單播,但它除了簡單以外一無是處:效率低(冗餘副本)、預設發送方全知(所有接收方地址)。要得到可靠的實現方案,我們需要再次訴諸圖論。

  1. 無控制洪泛

第二 naïve 的想法就是洪泛,即源結點和接收到廣播分組的結點向其所有鄰居發送分組的副本。它看起來簡單優雅,實際暗藏殺機:它既容易導致路由環路,也容易導致無休無止的廣播風暴。

  1. 受控洪泛

洪泛需要受到控制,網絡才能不受其反噬。

序號控制洪泛中,地址和廣播序號被填入廣播分組,並且每個結點維護它已收到的、複製的和轉發的分組源地址及其廣播序號。當收到一個廣播分組時,結點僅轉發未被記錄的分組,而丟棄已被記錄的分組。簡單來說,就是結點僅轉發它沒轉發過的廣播分組。

反向路徑轉發(RPF)中,當收到一個廣播分組時,結點僅轉發從自身到源結點的最短路徑上來的分組,而丟棄其他路徑上來的分組。思想很簡單。於是,每個結點需要知道它到源結點的單播最短路上的下一個鄰居結點,以此來決定分組的轉發或丟棄。

在這裏插入圖片描述

  1. 生成樹廣播

雖然受控洪泛避免了廣播風暴,但仍不能完全避免冗餘分組。要解決冗餘分組的問題,理想情況下,每個結點應當僅接收廣播分組的一個副本。這很容易讓我們想到最小生成樹:一棵最小生成樹擁有連通一個圖的最少的邊(如果我們把邊權視爲相同的話)。

於是,爲網絡對應的圖構造一棵最小生成樹,當有結點想要廣播分組時,只向所有與自身相連的、屬於生成樹的鏈路發送分組(當然,不會向分組副本的發送方回送)。生成樹不僅消除了冗餘分組,還能夠爲整個網絡所應用。

要構造一棵最小生成樹,一種簡單方法是基於中心的方法:首先定義一箇中心結點(屬於生成樹的第一個結點),其他結點向中心結點單播加入樹報文,當已經被納入生成樹的結點接收到一個加入樹報文時,該加入樹報文所經過的結點一併加入該生成樹中,直到所有屬於該網絡的結點都已加入生成樹。

多播

不搞了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章