1. 程式人生 > 其它 >網際協議(Ipv4) : 轉發IP資料報

網際協議(Ipv4) : 轉發IP資料報

技術標籤:計算機網路

網際協議(Ipv4) : 轉發IP資料報

引言

在網路的世界裡,資料報轉發可以分為兩種型別:直接交付間接交付

直接交付

直接交付是指把資料報從一臺機器通過物理網路直接傳輸到另外一臺機器,這是所有網際網路通訊的基礎。
只有當兩臺主機位於同一個物理網路時,才會發生直接交付。

當然,還有幾個小問題沒有解決。

Q1: 直接交付具體怎麼交付?
A1:先用ARP協議解析得到目標站點的MAC地址,然後,知道了MAC地址就直接將資料報封裝成幀傳送過去。

Q2:如果每次都用ARP協議解析得到對方MAC地址,會不會效率太低了?
A2:當然,不一定要解析,每一次進行ARP解析之前,都會去檢查ARP快取有沒有以往解析的記錄。若有,直接取出記錄即可傳送。

Q3:如何判斷對方網路是不是跟我處於在一個網段?
A3:直接取出對方IP地址的網路號部分和我方IP地址的網路號進行比對。若網路號相同,則說明處在同一物理網路。

間接交付

簡介交付是指,當兩個主機不處於同一個物理網路,也即兩個主機之間間隔了至少一個路由器時,一臺主機要給另外一個主機發送資料報,則這臺主機會將這個資料報傳送給最近的路由器,通過路由器之間的互相傳遞,最終將資料報交給目標主機。

這個概念在《用TCP/IP進行網際互連》有一段精闢的總結:

TCP/IP網際網路中的路由器形成一個互相協作的互聯結構。資料報從一個路由器傳遞到下一個路由器,直到抵達一個可直接交付的路由器。

表驅動的IP轉發

雖然已經知道了資料報會經過路由器序列一級一級轉發從而到達路由器,但是,還有一個關鍵問題沒有解決:當一個數據報抵達一個路由器時,它是怎麼知道應該轉發到哪一個路由器上的?

為了解決這個問題,需要引入一個數據結構—路由表。路由表又稱網際協議路由表(Internet Protocol Routing table)IP路由表(IP Routing Table)。這個表看成是一個Key-Value的陣列,陣列的每一個元素都是一個鍵值對(Key-Value),其中儲存著可能的IP到路由器出口(路由器至少有兩個IP地址,一個IP地址視為一個出口)的配對資訊。

也許你會想,路由器如果需要儲存所有可能的IP到路由器出口配對資訊,那路由器記憶體豈不是會爆炸(笑)!

這時候IP協議的優越性就體現出來了:路由器連線了多個物理網路,它需要將某一個目的地IP是a.b.c.d(這裡假設a.b.c是網路號部分,d是主機號部分)的資料報轉發出去,那既然每個物理網路的網路號都不同,那麼可以將目的IP地址中的網路號提取出來,與對應的出口配對(a.b.c,出口1)存入路由表就行了!

下次我需要轉發目的地址是a.b.c.e的資料報,那麼我提取網路號出來(a.b.c),在路由表裡查詢到出口是出口1,那麼我就可以直接將這個資料報從出口1轉發出去!

上述轉發過程同樣在《用TCP/IP進行網際互連》也有一段精闢的總結:

為了隱藏資訊,應該保持路由表較小並使轉發決策效率更高,IP轉發軟體儲存的只是有關目的網路地址的資訊,而不是有關個體主機地址的資訊

上述Key-value 的專業術語應該為(N,R),N代表目的網路,R是通往網路N的路徑的“下一個”路由器地址以及對應的網路介面!

通常,可直接交付的路由器之間兩兩相連,若A路由器需要傳送資料報給路由器B,那麼路由器A不僅需要知道路由器B的的IP地址(直接交付的兩個路由器處於同一個物理網路,其IP地址(專指用於路由器之間互相通訊的網路的IP地址)的網路號相同)),還要知道對應的網路介面(路由器可能不止安裝了一個物理介面)。

路由器R稱為下一跳(Next Hop),這種轉發方法稱之為下一跳路由選擇(Next-Hop Routing)下一跳轉發(Next-Hop Forwarding)

此外,儘管我們知道所有的轉發都是基於網路而不是基於特定主機的,但是大多數IP轉發軟體都允許指明某個特定的主機的路由作為特例,這麼做的理由可能有為了安全、為了更好的通訊質量、為了除錯通訊,等等等。

預設路由

如果有一個數據報到來但是上述的轉發表裡面沒有包含這個資料報的IP地址的轉發資訊,且存在一個預設路由,那麼主機就會將這個資料報轉發到預設路由去。預設路由在轉發表裡的目的網路N(網路部分)一般是0.0.0.0/0(假定是Ipv4轉發表),前面的0.0.0.0代表目的網路IP地址,後面的0代表網路號部分長度為0,說明當若前面記錄沒有滿足的跳轉條件而導致掃描到這條記錄時,無論什麼目的IP地址的網路號時什麼都會通過這條記錄轉發出去。

IP轉發演算法

基於上面的討論,我們可以得出IP軟體的轉發演算法的原型演算法的虛擬碼如下:

從資料報中抽取目的IP地址D;
IF 表中含有D的特定主機路由:
	把資料報傳送到表中指明的下一跳,然後退出;
計算地址D的網路字首N;
IF N與任何一個直接相連的網路地址匹配:
	通過該網路把資料報直接交付給目的站D;
ELSE IF 表中包含一個針對網路N的路由:
	把資料報傳送到表中指明的下一跳;
ELSE IF 表中包含一個預設路由:
	把資料報傳送到表中指明的預設路由器;
ELSE 宣告一個轉發出錯;(見ICMP相關內容)

(摘自《用TCP/IP進行網際互連》)

還有說明沒提到?

上述雖然討論了怎麼使用路由表,但是沒有說明系統如何初始化路由表,以及如何根據網路的更新動態更新路由表。這些主題更為複雜,將在之後的文章裡討論。