ip協議是tcp/ip協議族的核心協議,也是socket網路程式設計的基礎之一。
我們將從以下兩個方面較為深入的了解ip協議:
ip資料報的路由和**:ip資料報的路由和**發生在除目標機器之外的所有主機和路由器上。它們決定資料報是否應該**以及如何**
ip協議是tcp/ip協議族的動力,它為上層提供無狀態,無連線,不可靠的服務。
當ip資料報的長度超過幀的mtu時,將被分片傳輸。分片可能發生在傳送端,也可能發生在中轉路由器上,而且可能在傳輸過程中被多次分片,但是只有在最終的目標機器上,這些分片才會被核心中的ip模組重新組裝。
ip頭部中的如下三個欄位給ip的分片重組提供了足夠的資訊:資料報標識,標誌和片偏移。乙個ip資料報的每個分片都具有自己的ip頭部,它們具有相同的資料報標識值,但是具有不同的片偏移,除了最後乙個分片,其它分片都將設定mf標誌,每個分片的ip頭部的總長度欄位將被設定為該分片的長度。
mtu最大值為1500位元組,因此攜帶的ip資料報的資料部分最多1480位元組(ip頭部占用20位元組)。
如下圖,長度位1501位元組的ip資料報被拆分為兩個ip分片,第乙個ip分片長度為1500位元組,第二個ip分片長度為21位元組。每個ip分片都包含自己的ip頭部(20個位元組),且第乙個ip分片的ip頭部設定了mf標誌,而第二個ip分片的頭部則沒有設定該標誌,因為第二個分片已經是最後乙個分片了。原始ip資料報中的icmp頭部全部被複製到第乙個分片,第二個分片不包含icmp頭部資訊。
所以,ip層傳遞給資料鏈路層的資料可能是乙個完整的ip資料報,也可能是乙個ip分片,他們統稱為ip分組。
ip協議的乙個核心任務是資料報的路由,即決定傳送資料報到目標機器的路徑。
ip模組工作流程
我們從右往左分析該圖。
當ip模組接收來自資料鏈路層的ip資料報時,他首先對該資料報的頭部做crc校驗,確認無誤之後就分析其頭部的具體資訊。
如果該ip資料報的頭部設定了源站選路選項(鬆散源路由選擇或嚴格源路由選擇),則ip模組呼叫資料報**子模組來處理該資料報。
如果該ip資料報是傳送給本機的,則ip模組就根據資料報頭部中的協議欄位來決定將它派發給哪個上層應用(分用)。
如果ip模組發現這個資料報不是傳送給本機的,則也呼叫資料報**子模組來處理該資料報。
資料報**子模組將首先檢測系統是否允許**,如果不允許,ip模組就將資料報丟棄;如果允許,資料報**子模組將對該資料報執行一些操作,然後將它交給ip資料報輸出子模組。
ip資料報應該傳送至哪個下一跳路由(或者目標機器),以及經過哪個網絡卡來傳送,就是ip路由過程,即圖中「計算下一跳路由」子模組。
ip輸出佇列中存放的是所有等待傳送的ip資料報,其中除了需要**的ip資料報外,還包括封裝了本機上層資料的ip資料報。
虛線箭頭顯示了路由表更新的過程,這一過程是指通過路由協議或者route命令調整路由表,使之更適應最新的網路拓撲結構,稱為ip路由策略。
路由機制
1.查詢路由表中和資料報的目標ip位址完全匹配的主句ip位址;如果找到,就使用該路由項;沒找到則轉步驟2
2.查詢路由表中和資料報的目標ip位址具有相同網路id的網路ip位址,如果找到,就使用該路由項;沒有則轉步驟3
3.選擇預設路由項,這通常意味著資料報的下一跳路由是閘道器。
路由表更新
路由表必須能夠更新,以反映網路連線的變化,這樣ip模組才能準確,高效的**資料報。
route命令可以修改路由表。
eg:
$sudo route add -host 192.168
.1.109 dev eth0
$sudo route del -net 192.168
.1.0 netmask 255.255
.255
.0$sudo route del default
$sudo route add default gw 192.168
.1.109 dev eth0
不是傳送給本機的ip資料報將由資料報**子模組來處理。路由器都能執行資料報的**操作,而主機一般只傳送和接收資料報,這是因為主機上/proc/sys/net/ipv4/ip_forward 核心引數預設被設定為0,我們可以通過修改它來使能主機的資料報的**功能。
$ echo 1 > /proc/sys
/net/ipv4/ip_foeward
對於允許ip資料報**的系統(主機或路由器),資料報**子模組將對期望**的資料報執行如下操作:
1.檢查資料報頭部ttl值,為0就丟棄。
2.檢視資料報頭部的嚴格源路由選擇選項,如果該選項被設定,則檢測資料報目標ip位址是否是本機的某個ip位址,如果不是,則傳送乙個icmp源站選路失敗報文給傳送端。
3.如果有必要,則給源端傳送乙個icmp重定向報文,以告訴它乙個更合理的下一跳路由器。
4.將ttl值減1。
5.處理ip頭部選項。
6.如果有必要,則執行ip分片操作。
8位型別字段用於區分報文型別,它將icmp報文分為兩大類: 一類是差錯報文,這類報文主要用來回應網路錯誤(例如:目標不可到達(型別值為3)和重定向(型別值為5) )。
另一類是查詢報文,這類報文用來查詢網路資訊(用ping程式就是使用icmp報文檢視目標是否到達(型別值為8) )。
有的icmp報文還使用8位**欄位來進一步細分不同的條件。
icmp報文使用16位校驗和字段對整個報文(包括頭部和內容部分)進行迴圈冗餘校驗(crc),以檢驗報文在傳輸過程中是否損壞。
接收主機根據這兩個資訊就可以斷定引起重定向的ip資料報應該使用哪個路由器來**,並且以此來更新路由表(通常是更新路由表緩衝,而不是直接更改路由表)。
一般來說,主機只能接收icmp重定向報文,而路由器只能傳送icmp重定向報文。
IP協議詳解
協議森林 我盡力 ip協議詳解 在粗略了解了ip接力和ip位址後,我們再反過來,看一看ip協議的具體細節和設計哲學。ipv4與ipv6頭部的對比 我們已經在ip接力中介紹過,乙個ip包分為頭部 header 和資料 payload data 兩部分。頭部是為了實現ip通訊必須的附加資訊,資料是ip通...
IP協議詳解
從兩個方面討論ip協議 1.ip頭部資訊。用於指定ip通訊的源端ip位址,目的端ip位址,指導ip分片和重組以及指定部分通訊行為。2.ip資料報的路由和 ipv4頭部結構 ip路由 當ip模組接收到來自資料鏈路層的ip資料報時,首先對該資料報的頭部做crc校驗,確認無誤之後就分析其頭部的具體資訊。若...
IP協議詳解
ip位址提供了一種將資料跨網路從a主機到b主機的能力,ip位址被分成兩個部分,前半部分叫做網路號,後半部分叫做主機號。ip位址分為兩個部分,網路號和主機號 不同的子網其實就是把網路號相同的主機放到一起,如果在子網中新增一台主機,則這台主機的網路號和這個子網的網路號一致,但是主機號必須不能和子網中的其...