深研《TCP/IP詳解卷一》第二篇——網絡層(上)

 

某一天,當我被很多世俗規則限制住自己的行爲而不能去做很多正常人能做的事時,於是突然間感覺到:人,本不該來到這個世上!自從我們呱呱墜地那一刻起就註定我們這輩子要承受很多痛苦。。。打破規則和循規蹈矩間永遠也找不到合適的平衡點。想起電影《刺客聯盟》(又名通緝令)中女殺手fox最終以結束所有刺客(include herself)生命來繼續維持規則的正序那撼動人心的行爲,我會依舊選擇墨守陳規。或許哪天運氣好能找到這個平衡點!但那得看老天哪天心情好賜給我這個運氣了。However,我依然有很多該做的事情要做,continue!

卷一中對於IP,ARP,RARP協議分三章來寫,但至於我自己這種筆記性質的博文來說,沒必要扣住每一點都說個詳詳細細。但我儘量會最短的術語來闡述所有的知識點。對於這三種協議我在這一篇博文中會都涉及,因爲它們在TCP/IP協議中同屬網絡層協議。

IP協議概述

如同卷一中所說那樣,IP協議是TCP/IP中最爲核心的協議,因爲所有的TCP,UDP,ICMP以及IGMP協議都以IP數據報進行數據傳輸。IP常被稱爲不可靠,無連接的協議。對於不可靠和無連接這兩個術語也曾經迷惑過我很長時間,因爲但從字面意思來看,不可靠好像是指IP協議經常傳些錯誤的消息,無連接好像是指IP傳輸可以沒有網絡連接就可以完成。這種理解錯的是一塌糊塗,其實我更糾結緣何當初要把這兩個術語的原英文unreliable和connectionless要翻譯成這麼容易讓人產生歧義理解的不可靠和無連接。其實翻譯成“不保證成功傳達”和“不保證數據傳輸的持續性”或許會更好一點。令人不得不懷疑當初第一位翻譯者純粹是爲了翻譯而翻譯。因爲這兩個詞在國內很多大學課堂裏也總是被老師不斷的進行解釋以防學生歧義理解。至此,也該解釋下這兩個詞的本意了:不可靠是指IP協議傳輸並不保證每一個數據報都能傳達到目的地;無連接是指IP協議傳輸並不保證數據報傳輸的持續性,即很可能出現先傳送的後達到這種場景。

IP地址和MAC地址

IP地址也被成爲邏輯地址,因爲它的出現只是爲了封裝底層物理地址的繁雜性。而每臺主機的物理地址其實是被固定在硬件網卡的ROM中的。由於在鏈路層的數據幀(也被稱爲MAC幀)中,經常用物理地址當作數據傳輸的目的地址和源地址,因此也將物理地址稱爲MAC地址。

地址解析協議ARP協議

在網絡層及其以上的協議棧中,從來都是使用IP地址的,而數據的傳輸最終還是要靠物理地址來識別其具體位置,這就存在了每臺主機中物理地址和IP地址的映射關係的建立。對於一臺主機來說,得到其自己的IP地址和MAC地址比較容易,但如何得和管理到局域網中其它主機的IP地址和MAC地址的映射關係便成了棘手問題。事實上,每臺主機設有它自己的ARP高速緩存,保存與其相連的局域網中其它主機的IP地址和MAC地址的映射關係。當IP數據報從鏈路層發往其它主機時候,會:

1.先查看ARP高速緩存中有無此IP地址對應的MAC地址,若有,則發送,若沒有,則2:

2.ARP進程會在本局域網上以廣播的形式發送一個ARP請求分組,其內容爲此IP地址,MAC地址,和要查詢的IP地址,如下(此圖源自卷一);

clip_image002[4]

3.局域網中其它的主機ARP進程都會接收此請求,然後查看此請求中的查詢IP地址是不是自己的IP地址,若是,則保存此請求中的IP地址和MAC地址到自己的ARP緩存中,以待後用,同時將自己的地址信息回傳給發送端,若不是,則不響應。

如此便得到了要發送的IP數據報的硬件地址且正常發送內容;可以看得出,ARP請求分組是以廣播形式發送,以單播形式迴應。這一切過程一般由硬件地址解析(網卡或路由器)自動進行,用戶進程並不知道這些也無法知道其過程。每個MAC映射地址的保存期一般都被設爲10——20分鐘,即超過這個時間區間不用此映射,ARP進程回自動刪掉此映射。以下是我的計算機中的ARP緩存信息:

clip_image004[4]

逆地址解析協議RARP

RARP協議在國內教科書中基本都是一筆帶過,在卷一中寫的相對多一些。它層在過去起到比較重要的作用,而現在基本沒人會單獨的使用此協議了,其原理與ARP差不多,只是需要特殊的數據幀來封裝和響應。早期一些無盤系統通過此協議得到自己的IP地址。現在的DHCP協議(應用層協議)就包含此協議。

IP數據報首部

IP數據報首部一般爲20字節,其大概信息如下(圖源自卷一):

clip_image006[4]

每個字段信息如下:

4位版本:用來標識IP協議版本,版本相同才能進行通訊,一般都標識爲IPV4;

4位首部長度:表示IP數據報首部長度,最大值爲15,首部長度爲即15個32位字長(60字節);

16位總長度:IP數據報總長度,理論上最大長度爲65535,而實際上很少有超過1500字節的;

16位標識:IP協議的實現在存儲器中維護一個count值,每產生一個新的IP數據報,count就加1,如一個數據報長度超過鏈路層MTU值(見第一篇鏈路層)時,就會將此數據報的標識字段複製到所有被分片的數據幀中,以此便可以使得接受端在接受到數據報後正確的組裝一個IP數據報;

3位標誌:此字段在卷一中沒有詳細說明,事實上,其只有第二位和第三位被使用,第二位標識是否允許分片,第三位標識此IP數據報是否位最後一個數據報;

8位生存時間(TTL):這個值比較重要,用來指定此IP數據報能經過的最大路由器個數,當經過路由器的個數超過此值還未被傳達,則丟棄此數據報;

8位協議:用來標識此IP數據報是屬於何種協議,以下爲指定表(圖源自國內教科書):

clip_image008[4]

16位首部檢驗和:類似鏈路層中的CRC校驗碼,用來檢測此數據報是否在傳輸過程中發生差錯變化;

對於IP數據報的首部說明,至此也就差不多了;

IP路由選擇

當IP層將一幀封裝完後,剩下的工作便是進行傳輸了。將一個IP數據報發送到目的主機最直接的情況是目的主機與源主機直接相連(同一個令牌環網或以太網),則只需要直接發送就行了,更爲一般的情況是目的主機與源主機不在統一個網絡,如此便需要進行很多路由器後才能傳達。對於如何選擇下一個路由器便成了主要的焦點。每臺主機的IP層協議實現都會在內存中有一個IP路由表,如果目的主機與源主機不在同一個網絡,則進行路由表搜索,以發送到下一個路由器,路由表的結構通常是目的主機所在網絡號,和下一跳地址組成的KEY-VALUE對。當一個數據報在發送前都會檢測其TTL是否爲0,若爲0,則丟棄,否則,進行路由表搜索,搜索過程一般如下:

1.在路由表中搜索目的IP地址,如果存在,則將IP數據報直接發送到此地址,否則,進行(2);

2.搜索目的網絡所對應的子網地址(子網尋址,後面會講到),如果存在,則將IP數據報發送到此子網號對應的下一跳地址,否則,進行(3);

3.搜索目的網絡所對應的網絡號,如果存在,則將IP數據報發送到此網絡號對應的下一跳,否則,進行(4);

4.查找默認路由地址,若存在,則將IP數據報發送到此默認路由地址,否則(5);

5.丟棄此IP數據報;

子網尋址

現在基本上所有的路由器都支持子網尋址。事實上,A類地址和B類地址都分配了太多空間給主機號(2^24和2^16),這使得可用的網絡號有限,而可用的主機號則得到浪費,於是便將主機號又劃分位子網號和主機號。例如一個B類地址將之前的16位主機號中的前8位劃分給子網號,後8位劃分給主機號,於是得到的子網有2^8,可分配的主機號有2^8(255)這麼多。

爲了識別一個劃分子網後的IP地址的網絡號和主機號,便出現了子網掩碼。例如我所在的計算機的子網掩碼爲255.255.255.0,IP地址爲192.168.1.105;將子網掩碼與IP地址逐位相與後所得到的結果192.168.1.0就是我的網絡號,主機號就是105了。此IP地址爲一個C類地址,它的主機號默認位8位,105作爲主機號後,就沒有可用的子網號了,於是我的計算機沒有進行子網劃分。而若我的IP地址爲128.96.32.32,這是一個B類地址,其主機號在沒劃分子網時有2^16這麼多,得到的網絡號是128.96.32.0;主機號就是最後的32了,而B類地址默認的網絡號是前16位,即128.96.0.0,現在卻成了192.96.32.0了,那麼多出的32部分就是子網號了。

在RFC 950出來後,路由器在與相鄰路由器進行消息轉發時,必須發送自己的子網掩碼給對方,而若一個主機未劃分子網號,則發送默認子掩碼號給相鄰路由器,各類地址的默認子網掩碼如下(事實上是將未劃分子網時的網絡號全賦爲1的結果):

A類:255.0.0.0;

B類:255.255.0.0;

C類:255.255.255.0;

如此,將IP地址與這些子網掩碼相與後,所得到的結果正是未劃分子網時的網絡號。

netstat命令和ifconfig命令

看下我所在計算機的IP,子網掩碼,硬件地址信息(使用ifconfig -a得出的結果)

clip_image010[4]

eth0是個多播地址(後續章節會講到),lo是本地環回地址(在第一篇中有介紹),wlan是接入廣域網中的地址;

下圖是我的計算機的路由表(使用netstat -r得出):

clip_image012[4]

若目的地址是192.168.1.0和本地環回地址,則直接發送,否則發送到默認網關192.168.1.1,此地址爲局域網中的路由器,通過它發送到wlan中去。

 

 

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