網絡是怎樣鏈接的-IP與以太網的包收發操做(二)

2.5.3 生成包含接收方 IP 地址的 IP 頭部

IP頭部包含的內容瀏覽器

IP 模塊接受 TCP 模塊的委託負責包的收發工做,它會生成 IP 頭部並附加在 TCP 頭部前面。緩存

IP 頭部包含的內容如表 2.2 所示,其中最重要的內容就是 IP 地址,它表示這個包應該發到哪裏去。網絡

接受方IP地址:應用程序告知TCP,TCP告知IP模塊spa

這個地址是由 TCP 模塊告知的,而 TCP 又是在執行鏈接操做時從應用程序那裏得到這個地址的,所以這個地址的最初來源就是應用程序。操作系統

IP 不會自行判斷包的目的地,而是將包發往應用程序指定的接收方,即使應用程序指定了錯誤的 IP 地址,IP 模塊也只能照作。設計

固然,這樣作確定會出錯,但這個責任應該由應用程序來承擔。對象

在鏈接操做中發送第一個 SYN 包時就可能發生這樣的狀況,一旦 TCP 鏈接完畢,就已經確認可以正常和對方進行包的收發,這時就不會發生這樣的狀況了。blog

發送方的IP地址來自使用的網卡對應的IP地址接口

IP 頭部的「接收方 IP 地址」填寫通訊對象的 IP 地址。內存

發送方 IP 地址須要判斷髮送所使用的網卡,並填寫該網卡的 IP地址。

如何判斷把包交給哪塊網卡

和路由器使用 IP 表判斷下一個路由器位置的操做是同樣的。

由於協議棧的 IP 模塊與路由器中負責包收發的部分都是根據 IP 協議規則來進行包收發操做的,因此它們也都用相同的方法來判斷把包發送給誰。

查看路由表

這個「IP 表」叫做路由表,咱們將在第 3 章探索路由器時詳細介紹它的用法,這裏先簡單講個大概。

如圖 2.18 所示,咱們能夠經過 route print命令來顯示路由表。

Network Destination 網絡目標列

例如TCP 模塊告知的目標 IP 地址爲 192.168.1.21,那麼就和第 6 行的 192.168.1 的部分相匹配。

Interface 網絡接口列

表示網卡等網絡接口,這些網絡接口能夠將包發送給通訊對象。

Gateway 網關列

表示下一個路由器的 IP 地址,將包發給這個 IP 地址,該地址對應的路由器就會將包轉發到目標地址。

默認網關

路由表的第 1 行中,目標地址和子網掩碼都是 0.0.0.0,這表示默認網關,若是其餘全部條目都沒法匹配,就會自動匹配這一行。 

這樣一來,咱們就能夠判斷出應該使用哪塊網卡來發送包了,而後就能夠在 IP 頭部的發送方 IP 地址中填上這塊網卡對應的 IP 地址。

TCP/UDP協議號

接下來還須要填寫協議號,它表示包的內容是來自哪一個模塊的。

例如,若是是 TCP 模塊委託的內容,則設置爲 06(十六進制),若是是 UDP 模塊委託的內容,則設置爲 17(十六進制),這些值都是按照規則來設置的。

在如今咱們使用的瀏覽器中,HTTP 請求消息都是經過 TCP 來傳輸的,所以這裏就會填寫表示 TCP 的 06(十六進制)。

其餘字段內也須要填寫相應的值,但對大局沒什麼影響,咱們會在第3 章進行介紹,這裏就先省略了。

註釋

①Gateway(網關)在 TCP/IP 的世界裏就是路由器的意思。

②若是 Gateway 和 Interface 列的 IP 地址相同,就表示不須要路由器進行轉發,能夠直接將包發給接收方的 IP 地址。咱們將在第 3 章詳細介紹。

 

2.5.4 生成以太網用的 MAC 頭部

MAC頭的做用

生成了 IP 頭部以後,接下來 IP 模塊還須要在 IP 頭部的前面加上MAC 頭部(表 2.3)。

IP 頭部中的接收方 IP 地址表示網絡包的目的地,通這個地址咱們就能夠判斷要將包發到哪裏,但在以太網的世界中,TCP/IP 的這個思路是行不通的。

以太網在判斷網絡包目的地時和 TCP/IP 的方式不一樣,所以必須採用相匹配的方式才能在以太網中將包發往目的地,而MAC 頭部就是幹這個用的。

IP 模塊在生成 IP 頭部以後,會在它前面再加上 MAC 頭部。

MAC 頭部是以太網使用的頭部,它包含了接收方和發送方的 MAC 地址等信息。

MAC頭的結構

MAC 頭部的開頭是接收方和發送方的 MAC 地址,和 IP 頭部中的接收方和發送方 IP 地址的功能差很少,只不過 IP 地址的長度爲 32 比特,而 MAC 地址爲 48 比特。

IP 地址是相似多少弄多少號這種現實中地址的層次化的結構,而 MAC 地址中的 48 比特能夠看做是一個總體。

從表示接收方和發送方的意義上來講,MAC 地址和 IP 地址是沒有區別的。

以太類型字段和 IP 頭部中的協議號相似。在 IP 中,協議號表示 IP 頭部後面的包內容的類型,以太類型就表示後面內容的類型。

以太網包的內容能夠是 IP、ARP等協議的包,它們都有對應的值,這也是根據規則來肯定的。

以太類型

這裏填寫表示 IP 協議的值 0800(十六進制)。

發送方MAC地址

這裏填寫網卡自己的 MAC 地址。MAC 地址是在網卡生產時寫入 ROM 裏的,只要將這個值讀取出來寫入 MAC 頭部就能夠了。

對於多塊網卡的狀況,相似設置發送方 IP 地址的方法。

設置發送方 IP 地址時,咱們已經判斷出了從哪塊網卡發送這個包,那麼如今只要將這塊網卡對應的 MAC 地址填進去就行了。

注意

實際上,只有在操做系統啓動過程當中對網卡進行初始化的時候纔會讀取MAC 地址,讀取出來以後會存放在內存中,每次執行收發操做時實際上使用的是內存中的值。

此外,讀取 MAC 地址的操做是由網卡驅動程序來完成的,所以網卡驅動程序也能夠不從網卡 ROM 中讀取地址,而是將配置文件中設定的 MAC 地址拿出來放到內存中並用於設定 MAC 頭部,或者也能夠經過命令輸入 MAC 地址。

接收方 MAC 地址

只要告訴以太網對方的 MAC 的地址,以太網就會幫咱們把包發送過去,那麼很顯然這裏應該填寫對方的 MAC 地址。

此時咱們尚未把包發送出去,因此先得搞清楚應該把包發給誰,這個只要查一下路由表就知道了。

在路由表中找到相匹配的條目,而後把包發給 Gateway 列中的IP 地址就能夠了。

既然已經知道了包應該發給誰,那麼只要將對方的 MAC 地址填上去就行了,但到這裏爲止根本沒有出現對方的 MAC 地址,也就是說咱們如今根本不知道對方的 MAC 地址是什麼。

所以,咱們還須要執行根據 IP 地址查詢 MAC 地址的操做。

 

2.5.5 經過 ARP 查詢目標路由器的 MAC 地址

這裏咱們須要使用 ARP ,它其實很是簡單。在以太網中,有一種叫做廣播的方法,能夠把包發給鏈接在同一以太網中的全部設備。

ARP:Address Resolution Protocol,地址解析協議。

ARP 就是利用廣播對全部設備提問:「×× 這個 IP 地址是誰的?請把你的 MAC 地址告訴我。」

而後就會有人回答:「這個 IP 地址是個人,個人 MAC 地址是××××。」

不是這個 IP 地址的設備會忽略廣播,什麼都不回答。

若是對方和本身處於同一個子網中,那麼經過上面的操做就能夠獲得對方的 MAC 地址。

而後,咱們將這個 MAC 地址寫入 MAC 頭部,MAC頭部就完成了。

若是路由表的設置正確,那麼對方應該在同一子網,不然對方沒法做出ARP 響應,這時只能認爲對方不存在,包的發送操做就會失敗。

ARP緩存

不過,若是每次發送包都要這樣查詢一次,網絡中就會增長不少 ARP包,所以咱們會將查詢結果放到一塊叫做 ARP 緩存的內存空間中留着之後用。

在發送包時,先查詢一下 ARP 緩存,若是其中已經保存了對方的 MAC 地址,就不須要發送 ARP 查詢,直接使用 ARP 緩存中的地址。而當 ARP 緩存中不存在對方 MAC 地址時,則發送 ARP 查詢。

顯示 ARP 緩存的方法和 MAC 地址的寫法如圖 2.20 和圖 2.21 所示,供你們參考。

 

 

ARP緩存會定時刪除

若是老是使用 ARP緩存中保存的地址會產生問題。

例如當 IP 地址發生變化時,ARP 緩存的內容就會和現實發生差別。

爲了防止這種問題的發生,ARP 緩存中的值在通過一段時間後會被刪除,通常這個時間在幾分鐘左右。

這個刪除的操做很是簡單粗暴,無論 ARP 緩存中的內容是否有效,只要通過幾分鐘就所有刪掉,這樣就不會出問題了。

當地址從 ARP 緩存中刪除後,只要從新執行一次 ARP 查詢就能夠再次得到地址了。

上面這個策略可以在幾分鐘後消除緩存和現實的差別,但 IP 地址剛剛發生改變的時候,ARP 緩存中依然會保留老的地址,這時就會發生通訊的異常。

 

將打包工做交給IP模塊的利處

將 MAC 頭部加在 IP 頭部的前面,整個包就完成了。到這裏爲止,整個打包的工做是由 IP 模塊負責的。

有人認爲,MAC 頭部是以太網須要的內容,並不屬於 IP 的職責範圍,但從現實來看,讓 IP 負責整個打包工做是有利的。

若是在交給網卡以前,IP 模塊可以完成整個打包工做,那麼網卡只要將打好的包發送出去就能夠了。

對於除 IP 之外的其餘類型的包也是同樣,若是在交給網卡以前完成打包,那麼對於網卡來講,發送的操做和發送 IP 包是徹底相同的。

這樣一來,同一塊網卡就能夠支持各類類型的包。

至於接收操做,咱們到後面會講,但若是接收的包能夠原封不動直接交給 IP 模塊來處理,網卡就只要負責接收就能夠了。

這樣一來,一塊網卡也就能支持各類類型的包了。

與其機械地設計模塊和設備之間的分工,致使網卡只能支持 IP 包,不如將分工設計得現實一些,讓網卡可以靈活支持各類類型的包。

相關文章
相關標籤/搜索