協議森林03 IP接力賽 (IP, ARP, RIP和BGP協議)

協議森林03 IP接力賽 (IP, ARP, RIP和BGP協議)

作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝!

 

網絡層(network layer)是實現互聯網的最重要的一層。正是在網絡層面上,各個局域網根據IP協議相互連接,最終構成覆蓋全球的Internet。更高層的協議,無論是TCP還是UDP,必須通過網絡層的IP數據包(datagram)來傳遞信息。操作系統也會提供該層的socket,從而允許用戶直接操作IP包。

IP數據包是符合IP協議的信息(也就是0/1序列),我們後面簡稱IP數據包爲IP包。IP包分爲頭部(header)數據(Data)兩部分。數據部分是要傳送的信息,頭部是爲了能夠實現傳輸而附加的信息(這與以太網幀的頭部功能相類似,如果對幀感到陌生,可參看小喇叭一文)。

 

IP包的格式

IP協議可以分爲IPv4和IPv6兩種。IPv6是改進版本,用於在未來取代IPv4協議。出於本文的目的,我們可以暫時忽略兩者的區別,只以IPv4爲例。下面是IPv4的格式

IPv4包 我們按照4 bytes將整個序列摺疊,以便更好的顯示

與幀類似,IP包的頭部也有多個區域。我們將注意力放在紅色的發出地(source address)目的地(destination address)。它們都是IP地址。IPv4的地址爲4 bytes的長度(也就是32位)。我們通常將IPv4的地址分爲四個十進制的數,每個數的範圍爲0-255,比如192.0.0.1就是一個IP地址。填寫在IP包頭部的是該地址的二進制形式。

IP地址是全球地址,它可以識別"社區"(局域網)和"房子"(主機)。這是通過將IP地址分類實現的。

IP class    From          To                Subnet Mask

A           1.0.0.0       126.255.255.255    255.0.0.0

B           128.0.0.0     191.255.255.255    255.255.0.0

C           192.0.0.0     223.255.255.255    255.255.255.0

每個IP地址的32位分爲前後兩部分,第一部分用來區分局域網,第二個部分用來區分該局域網的主機。子網掩碼(Subnet Mask)告訴我們這兩部分的分界線,比如255.0.0.0(也就是8個1和24個0)表示前8位用於區分局域網,後24位用於區分主機。由於A、B、C分類是已經規定好的,所以當一個IP地址屬於B類範圍時,我們就知道它的前16位和後16位分別表示局域網和主機。

 

網卡與路由器

郵差與郵局中說,IP地址是分配給每個房子(計算機)的"郵編"。但這個說法並不精確。IP地址實際上識別的是網卡(NIC, Network Interface Card)。網卡是計算機的一個硬件,它在接收到網路信息之後,將信息交給計算機(處理器/內存)。當計算機需要發送信息的時候,也要通過網卡發送。一臺計算機可以有不只一個網卡,比如筆記本就有一個以太網卡和一個WiFi網卡。計算機在接收或者發送信息的時候,要先決定想要通過哪個網卡。

NIC

 

路由器(router)實際上就是一臺配備有多個網卡的專用電腦。它讓網卡接入到不同的網絡中,這樣,就構成在郵差與郵局中所說的郵局。比如下圖中位於中間位置的路由器有兩個網卡,地址分別爲199.165.145.17和199.165.146.3。它們分別接入到兩個網絡:199.165.145和199.165.146。

 

 

IP包接力

IP包的傳輸要通過路由器的接力。每一個主機和路由中都存有一個路由表(routing table)。路由表根據目的地的IP地址,規定了等待發送的IP包所應該走的路線。就好像下圖的路標,如果地址是“東京”,那麼請轉左;如果地址是“悉尼”,那麼請向右。

A real world routing table

 

比如我們從主機145.17生成發送到146.21的IP包:鋪開信紙,寫好信的開頭(剩下數據部分可以是TCP包,可以是UDP包,也可以是任意亂寫的字,我們暫時不關心),註明目的地IP地址(199.165.146.21)和發出地IP地址(199.165.145.17)。主機145.17隨後參照自己的routing table,裏面有三行記錄:

145.17 routing table (Genmask爲子網掩碼,Iface用於說明使用哪個網卡接口)

Destination        Gateway             Genmask             Iface

199.165.145.0      0.0.0.0             255.255.255.0       eth0

0.0.0.0            199.165.145.17      0.0.0.0             eth0

這裏有兩行記錄。

第一行表示,如果IP目的地是199.165.145.0這個網絡的主機,那麼只需要自己在eth0上的網卡直接傳送(“本地社區”:直接送達),不需要前往router(Gateway 0.0.0.0 = “本地送信”)。

第二行表示所有不符合第一行的IP目的地,都應該送往Gateway 199.165.145.17,也就是中間router接入在eth0的網卡IP地址(郵局在eth0的分支)。

我們的IP包目的地爲199.165.146.21,不符合第一行,所以按照第二行,發送到中間的router。主機145.17會將IP包放入幀的payload,並在幀的頭部寫上199.165.145.17對應的MAC地址,這樣,就可以按照小喇叭中的方法在局域網中傳送了。

 

中間的router在收到IP包之後(實際上是收到以太協議的幀,然後從幀中的payload讀取IP包),提取目的地IP地址,然後對照自己的routing table:

Destination        Gateway             Genmask             Iface

199.165.145.0      0.0.0.0             255.255.255.0       eth0

199.165.146.0      0.0.0.0             255.255.255.0       eth1

0.0.0.0            199.165.146.8       0.0.0.0             eth1

從前兩行我們看到,由於router橫跨eth0和eth1兩個網絡,它可以直接通過eth0和eth1上的網卡直接傳送IP包。

第三行表示,如果是前面兩行之外的IP地址,則需要通過eth1,送往199.165.146.8(右邊的router)。

我們的目的地符合第二行,所以將IP放入一個新的幀中,

在幀的頭部寫上199.165.146.21的MAC地址,直接發往主機146.21。

(在Linux下,可以使用$route -n來查看routing table)

 

IP包可以進一步接力,到達更遠的主機。IP包從主機出發,根據沿途路由器的routing table指導,在router間接力。IP包最終到達某個router,這個router與目標主機位於一個局域網中,可以直接建立連接層的通信。最後,IP包被送到目標主機。這樣一個過程叫做routing(我們就叫IP包接力好了,路由這個詞實在是混合了太多的意思)。
整個過程中,IP包不斷被主機和路由封裝入幀(信封)並拆開,然後藉助連接層,在局域網的各個NIC之間傳送幀。整個過程中,我們的IP包的內容保持完整,沒有發生變化。最終的效果是一個IP包從一個主機傳送到另一個主機。利用IP包,我們不需要去操心底層(比如連接層)發生了什麼。

 

 

ARP協議

在上面的過程中,我們實際上假設了,每一臺主機和路由都能瞭解局域網內的IP地址和MAC地址的對應關係,這是實現IP包封裝(encapsulation)到幀的基本條件。IP地址與MAC地址的對應是通過ARP協議傳播到局域網的每個主機和路由。每一臺主機或路由中都有一個ARP cache,用以存儲局域網內IP地址和MAC地址如何對應。

ARP協議(ARP介於連接層和網絡層之間,ARP包需要包裹在一個幀中)的工作方式如下:主機會發出一個ARP包,該ARP包中包含有自己的IP地址和MAC地址。通過ARP包,主機以廣播的形式詢問局域網上所有的主機和路由:我是IP地址xxxx,我的MAC地址是xxxx,有人知道199.165.146.4的MAC地址嗎?擁有該IP地址的主機會回覆發出請求的主機:哦,我知道,這個IP地址屬於我的一個NIC,它的MAC地址是xxxxxx。由於發送ARP請求的主機採取的是廣播形式,並附帶有自己的IP地址和MAC地址,其他的主機和路由會同時檢查自己的ARP cache,如果不符合,則更新自己的ARP cache。

這樣,經過幾次ARP請求之後,ARP cache會達到穩定。如果局域網上設備發生變動,ARP重複上面過程。

(在Linux下,可以使用$arp命令來查看ARP的過程。ARP協議只用於IPv4。IPv6使用Neighbor Discovery Protocol來替代ARP的功能。)

 

Routing Table的生成

我們還有另一個假設,就是每個主機和路由上都已經有了合理的routing table。這個routint table描述了網絡的拓撲(topology)結構。如果你瞭解自己的網絡連接,可以手寫自己主機的routing table。但是,一個路由器可能有多個出口,所以routing table可能會很長。更重要的是,周圍連接的其他路由器可能發生變動(比如新增路由器或者路由器壞掉),我們就需要routing table能及時將交通導向其他的出口。我們需要一種更加智能的探測周圍的網絡拓撲結構,並自動生成routing table。

我們以北京地鐵爲例子。如果從機場前往朝陽門,那麼可以採取2號航站樓->>三元橋->>東直門->>朝陽門。2號航站樓和朝陽門分別是出發和目的主機。而三元橋和東直門爲中間的兩個router。如果三元橋->>東直門段因爲維修停運,我們需要更改三元橋的routing table,從而給前往朝陽門的乘客(IP包)指示:請走如下路線三元橋->>芍藥居。然後依照芍藥居的routing table前往朝陽門(芍藥居->>東直門->>朝陽門)。

 

 

一種用來生成routing table的協議是RIP(Routing Information Protocol)。它通過距離來決定routing table,所以屬於distance-vector protocol。對於RIP來說,所謂的距離是從出發地到目的地途徑的路由器數目(hop number)。比如上面從機場到朝陽門,按照2號航站樓->>三元橋->>東直門->>朝陽門路線,途徑兩個路由器,距離爲2。我們最初可以手動生成三元橋的routing table。隨後,根據RIP協議,三元橋向周圍的路由器和主機廣播自己前往各個IP的距離(比如到機場=0,團結湖=0,國貿=1,望京西=1,建國門=2)。收到RIP包的路由器和主機根據RIP包自己到發送RIP包的主機的距離,算出自己前往各個IP的距離。東直門與三元橋的距離爲1。東直門收到三元橋的RIP包(到機場的距離爲0),那麼東直門途徑三元橋前往機場的距離爲1+0=1。如果東直門自己的RIP記錄都比這個遠(比如東直門->>芍藥居->>三元橋->>機場 = 2)。那麼東直門更改自己的routing table:前往機場的交通都發往三元橋而不是芍藥居。如果東直門自身的RIP記錄並不差,那麼東直門保持routing table不變。上述過程在各個點不斷重複RIP廣播/計算距離/更新routing table的過程,最終所有的主機和路由器都能生成最合理的路徑(merge)。

(RIP的基本邏輯是:如果A距離B爲6,而我距離A爲1,那麼我途徑A到B的距離爲7)

RIP出於技術上的原因(looping hops),認爲距離超過15的IP不可到達。所以RIP更多用於互聯網的一部分(比如整個中國電信的網絡)。這樣一個互聯網的部分往往屬於同一個ISP或者有同一個管理機構,所以叫做自治系統(AS,autonomous system)。自治系統內部的主機和路由根據通向外部的邊界路由器來和其它的自治系統通信各個邊界路由器之間通過BGP(Border Gateway Protocol)來生成自己前往其它AS的routing table,而自治系統內部則參照邊界路由器,使用RIP來決定routing table。BGP的基本工作過程與RIP類似,但在考慮距離的同時,也權衡比如政策、連接性能等其他因素,再決定交通的走向(routing table)。

 

總結

我們一開始講述了IP包根據routing table進行接力的過程。爲了順利實現接力,我們又進一步深入到ARPRIP/BGP。這三個協議都協助了IP傳輸。ARP讓每臺電腦和路由器知道自己局域網內IP地址和MAC地址的對應關係,從而順利實現IP包到幀的封裝。RIP協議可以生成自治系統內部合理的routing table。BGP協議可以生成自治系統外部的routing table。

在整個過程中,我們都將注意力放在了IP包大的傳輸過程中,而故意忽略一些細節。 而上面的IP接力過程適用於IPv6。

 

歡迎繼續閱讀“協議森林”系列


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