iphdr

iphdr,是一種計算機用語。是Linux下IP數據包的描述結構體。

Linux下IP數據包的描述結構體

所在頭檔案為/usr/src/linux/include/linux/ip.h,結構如下:

struct iphdr {

#if defined(__LITTLE_ENDIAN_BITFIELD) //小端模式下

__u8 ihl:4,//首部長度(4位)

version:4;//ip協定版本IPv4

#elif defined (__BIG_ENDIAN_BITFIELD) //大端模式下

__u8 version:4,

ihl:4;

#else

#error "Please fix <asm/byteorder.h>"

#endif

__u8 tos;//服務類型欄位(8位)

__be16 -tot_len;//16位IP數據報總長度

__be16 -id;//16位標識欄位(唯一表示主機傳送的每一分數據報)

__be16 -frag_off;//(3位分段標誌+13位分段偏移數)

__u8 ttl;//8位數據報生存時間

__u8 protocol;//協定欄位(8位)

__be16 check;//16位首部校驗

__be32 saddr; //源IP位址

__be32 daddr; //目的IP位址

};

31 0

|----|----|------|--|-------------------|----------

|ver |ihl | -tos | -| tot_len |

|----|----|------|--|-------------------|

| id | frag_off -|

|---------|---------|-------------------|

| ttl |protocol | check | 20 Bytes

|---------|---------|-------------------|

| saddr |

|---------------------------------------|

| daddr |

|---------------------------------------|----------

| |

-| options | 40 Bytes

| |

|---------------------------------------|

IPv4 (Internel協定)頭部

iphdr->version

版本(4位),目前的協定版本號是4,因此IP有時也稱作IPv4。

iphdr->ihl

首部長度(4位): 首部長度指的是IP層頭部占32 bit字的數目(也就是IP層頭部包含多少個4位元組 -- 32位),包括任何選項。由於它是一個4比特欄位,因此首部最長為60個位元組。普通IP數據報(沒有任何選擇項)欄位的值是5 <==> 5 * 32 / 8 = 5 * 4 = 20 Bytes

iphdr->tos

服務類型欄位(8位): 服務類型(TOS)欄位包括一個3 bit的優先權子欄位(現在已被忽略),4 bit的TOS子欄位和1 bit未用位但必須置0。4 bit的TOS子欄位分別代表:最小時延、最大吞吐量、最高可靠性和最

小費用。4 bit中只能設定其中1 bit。如果所有4 bit均為0,那么就意味著是一般服務。

iphdr->tot_len

總長度欄位(16位)是指整個IP數據報的長度,以位元組為單位。利用首部長度欄位和總長度欄位,就可以知道 IP數據報中數據內容的起始位置和長度。由於該欄位長16比特,所以IP數據報最長可達65535位元組

總長度欄位是IP首部中必要的內容,因為一些數據鏈路(如乙太網)需要填充一些數據以達到最小長度。儘管乙太網的最小幀長為46位元組,但是IP數據可能會更短。如果沒有總長度欄位,那么IP層就不知道46位元組中有多少是IP數據報的內容。

iphdr->id

標識欄位(16位)唯一地標識主機傳送的每一份數據報。通常每傳送一份報文它的值就會加1。

iphdr->frag_off (16位)

frag_off域的低13位 -- 分段偏移(Fragment offset)域指明了該分段在當前數據報中的什麼位置上。除了一個數據報的最後一個分段以外,其他所有的 分段(分片)必須是8位元組的倍數。這是8位元組是基本分段單位。由於該域有13個位,所以,每個數據報最多有8192個分段。因此,最大的數據報長度為65,536位元組,比iphdr->tot_len域還要大1。

iphdr->frag_off的高3位

(1) 比特0是保留的,必須為0;

(2) 比特1是“不分片”(DF -- Don't Fragment)標誌,如果將這一比特置1,IP將不對數據報進行分片,這時如果有需要進行分片的數據報到來,會丟棄此數據報並傳送一個ICMP差錯報文給起始端。

(3) 比特2是“更多分片”(MF -- More Fragment)標誌。除了最後一片外,其他每個組成數據報的片都要把該比特置1。

|---|-------------|

|DM0| offset |

|---|-------------|

15 1312 0

iphdr->ttl

TTL(time-to-live) -- 8位,生存時間欄位設定了數據報可以經過的最多路由器數。它指定了數據報的生存時間。TTL的初始值由源主機設定(通常為32或64),一旦經過一個處理它的路由器,它的值就減去1。當該欄位的值為0時,數據報就被丟棄,並傳送ICMP報文通知源主機。

TTL(Time to live)域是一個用於限制分組生存期的計數器。這裡的計數時間單位為秒,因此最大的生存期為255秒。在每一跳上該計數器必須被遞減,而且,當數據報在一台路由器上排隊時間較長時,該計數器必須被多倍遞減。在實踐中,它只是跳計數器,當它遞減到0的時候,分組被丟棄,路由器給源主機傳送一個警告分組。此項特性可以避免數據報長時間地逗留在網路中,有時候當路由表被破壞之後,這種事情是有可能發生的。

iphdr->protocol

協定欄位(8位): 根據它可以識別是哪個協定向IP傳送數據。

當網路層組裝完成一個完整的數據報之後,它需要知道該如何對它進行處理。協定(Protocol)域指明了該將它交給哪個傳輸進程。TCP是一種可能,但是UDP或者其他的協定也是可能的。

iphdr->check

首部檢驗和欄位(16位)是根據IP首部計算的檢驗和碼。它不對首部後面的數據進行計算。 ICMP、IGMP、UDP和TCP在它們各自的首部中均含有同時覆蓋首部和數據檢驗和碼。

為了計算一份數據報的IP檢驗和,首先把檢驗和欄位置為0。然後,對首部中每個16 bit進行二進制反碼求和(整個首部看成是由一串16 bit的字組成),結果存在檢驗和欄位中。當收到一份IP數據報後,同樣對首部中每個16 bit進行二進制反碼的求和。由於接收方在計算過程中包含了傳送方存在首部中的檢驗和,因此,如果首部在傳輸過程中沒有發生任何差錯,那么接收方計算的結果應該為全1。如果結果不是全1(即檢驗和錯誤),那么IP就丟棄收到的數據報。但是不生成差錯報文,由上層去發現丟失的數據報並進行重傳。

iphdr->saddr

32位源IP位址

iphdr->daddr

32位目的IP位址

網路位元組序

4個位元組的32 bit值以下面的次序傳輸:首先是0~7bit,其次8~15bit,然後16~23bit,最後是24~31 bit。這種傳輸次序稱作big endian位元組序。由於TCP/IP首部中所有的二進制整數在網路中傳輸時都要求以這種次序,因此它又稱作網路位元組序。

相關詞條

相關搜尋

熱門詞條

聯絡我們