《Linux高效能伺服器程式設計》 2 3 IP分片

2021-09-23 10:01:47 字數 1928 閱讀 7188

前文曾提到,當ip資料報的長度超過幀的mtu時,它將被分片傳輸。分片可能發生在傳送端,也可能發生在中轉路由器上,而且可能在傳輸過程中被多次分片,但只有在最終的目標機器上,這些分片才會被核心中的ip模組重新組裝。

ip頭部中的如下三個欄位給ip的分片和重組提供了足夠的資訊:資料報標識、標誌和片偏移。乙個ip資料報的每個分片都具有自己的ip頭部,它們具有相同的標識值,但具有不同的片偏移。並且除了最後乙個分片外,其他分片都將設定mf標誌。此外,每個分片的ip頭部的總長度欄位將被設定為該分片的長度。

乙太網幀的mtu是1500位元組(可以通過ifconfig命令或者netstat命令檢視),因此它攜帶的ip資料報的資料部分最多是1480位元組(ip頭部占用20位元組)。考慮用ip資料報封裝乙個長度為1481位元組的icmp報文(包括8位元組的icmp頭部,所以其資料部分長度為1473位元組),則該資料報在使用乙太網幀傳輸時必須被分片,如圖2-2所示。

圖2-2中,長度為1501位元組的ip資料報被拆分成兩個ip分片,第乙個ip分片長度為1500位元組,第二個ip分片的長度為21位元組。每個ip分片都包含自己的ip頭部(20位元組),且第乙個ip分片的ip頭部設定了mf標誌,而第二個ip分片的ip頭部則沒有設定該標誌,因為它已經是最後乙個分片了。原始ip資料報中的icmp頭部內容被完整地複製到了第乙個ip分片中。第二個ip分片不包含icmp頭部資訊,因為ip模組重組該icmp報文的時候只需要乙份icmp頭部資訊,重複傳送這個資訊沒有任何益處。1473位元組的icmp報文資料的前1472位元組被ip模組複製到第乙個ip分片中,使其總長度為1500位元組,從而滿足mtu的要求;而多出的最後1位元組則被複製到第二個ip分片中。

需要指出的是,icmp報文的頭部長度取決於報文的型別,其變化範圍很大。圖2-2以8位元組為例,因為後面的例子用到了ping程式,而ping程式使用的icmp回顯和應答報文的頭部長度是8位元組。

為了看清楚ip分片的具體過程,考慮從ernest-laptop來ping機器kongming20,每次傳送1473位元組的資料(這是icmp報文的資料部分)以強制引起ip分片,並用tcpdump抓取這一過程中雙方交換的資料報。具體操作過程如下:

$ sudo tcpdump -ntv -i eth0 icmp        #只抓取icmp報文

$ ping kongming20 –s 1473 #用-s選項指定每次傳送1473位元組的資料

下面我們考察tcpdump輸出的乙個ip資料報的兩個分片,其內容如下:

1. ip(tos 0x0, ttl 64, id 61197, offset 0, flags [+], proto icmp (1), length 1500)

192.168.1.108 > 192.168.1.110: icmp echo request, id 41737, seq 1, length 1480

2. ip(tos 0x0, ttl 64, id 61197, offset 1480, flags [none], proto icmp (1), length 21)

192.168.1.108 > 192.168.1.110: icmp

這兩個ip分片的標識值都是61197,說明它們是同乙個ip資料報的分片。第乙個分片的片偏移值為0,而第二個則是1480。很顯然,第二個分片的片偏移值實際上也是第乙個分片的icmp報文的長度。第乙個分片設定了mf標誌以表示還有後續分片,所以tcpdump輸出「flags[+]」。而第二個分片則沒有設定任何標誌,所以tcpdump輸出「flags[none]」。這個兩個分片的長度分別為1500位元組和21位元組,這與圖2-2描述的一致。

最後,ip層傳遞給資料鏈路層的資料可能是乙個完整的ip資料報,也可能是乙個ip分片,它們統稱為ip分組(packet)。本書如無特殊宣告,不區分ip資料報和ip分組。

linux高效能伺服器程式設計

linux高效能伺服器程式設計 當當網 亞馬遜 目錄 第一章 tcp ip協議族 第二章 ip協議族 第三章 tcp協議詳解 第四章 tcp ip通訊案例 訪問internet 第五章 linux網路程式設計基礎api 第六章 高階io函式 第七章 linux伺服器程式規範 第八章 高效能伺服器框架...

linux 高效能伺服器程式設計

1.高效能定時器 時間輪,時間堆 處理超時時間,如nginx使用紅黑樹,找出最可能超時的事件 2.高效能伺服器程式框架 nginx 使用的是基於事件模型,epoll,不阻塞,非同步處理 兩種高效的事件處理模式 reactor模式 proactor模式 兩種高效的併發模式 半同步 半非同步模式 領導者...

linux高效能伺服器程式設計(1)

linux網路程式設計基礎api 1 socket位址api 2 sockt基礎api sockt的api全部定義在sys socket.h檔案中,包括 建立socket,命名socket,監聽socket,接受連線,發起連線,讀寫資料,獲取位址資訊,檢測帶外標記,以及讀取和設定socket選項。3...