struct iphdr

struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
    __u8    ihl:4,
            version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
    __u8    version:4,
            ihl:4;
#else
#error "Please fix <asm/byteorder.h>"
#endif
    __u8    tos;
    __be16 -tot_len;
    __be16 -id;
    __be16 -frag_off;
    __u8    ttl;
    __u8    protocol;
    __be16 -check;
    __be32 -saddr;
    __be32 -daddr;
};

 

 

iphdr->version網絡

版本(4位),目前的協議版本號位4,也稱之爲IPv4併發

 

iphdr->ihl大數據

首部長度(4位),首部長度是指IP層頭部佔32bit字的數目,也就是IP層頭部包含多少個4字節(32b),包括任何選項,因爲它是一個4bit(最大表示15)字段,所以首部最長位60個字節.普通IP數據報字段的值爲5 ==》5*32/8=20Bytesspa

 

iphdr->toscode

服務類型字段(8位):服務類型(TOS)字段包括一個3bit的優先權字段(已被忽略),4bit的TOS子字段和1bit未用位但必須置0。4bit的TOS子字段分別表示最小時延、最大吞吐量、最高可靠性和最小費用。4bit中只能設置1bit。若是4bit均爲0表示這是通常服務。blog

iphdr->tot_len進程

總長度字段(16)位指的是整個IP數據包的長度,以字節位單位。利用首部長度字段和總長度字段,就能夠知道IP數據報中數據內容的起始位置和長度。因爲該字段長1bit,因此IP數據包最長可長達65535字節。ip

總長度字段是IP首部中必要的內容,由於一些數據鏈路(如以太網)須要填充一些數據以達到最小長度。儘管以太網的最小幀長爲46字節,但IP數據可能更短。若是沒有總長度字段,那麼IP層就不知道46字節中有多少是IP數據報的內容。路由

iphdr->idit

標識字段(16bit)惟一地標識主機發送地每一份數據報,一般每發送一份報文他的值就加1。

 

iphdr->frag_off

frag_off低13位

標識分段偏移(Fragment offset)域指明瞭該分段在當前數據報中的什麼位置上。除了一個數據報的最後一個分段之外,其餘全部的分段(分片)必須是8字節的倍數。這是8字節是基本分段單位。因爲該域有13個位,因此每一個數據報最多有8192個分段。所以最大數據報長度爲65536字節,比iphdr->tot_len域還大1。

 

frag_off高3位:

l  比特0保留,必須爲0;

l  比特1是「更多分片」(MF—More Fragment)標誌。除了最後一片外,其餘每一個組成數據報的片都要把該比特置1.

l  比特2是「部分片」(DF—Don’t Fragment)標誌,若是將這一比特置1,IP將不對數據報進行分片,這是若是須要進行分片的數據報到來,會丟棄此數據報併發送一個ICMP差錯報文給起始端。

 

iphdr->ttl

TTL(Time to live)8位,生存時間字段設置了數據報能夠通過的最多路由器數。它指定了數據報的生存時間。TTl的初始值由源主機設置(一般爲32或64),一旦通過一個處理它的路由器,它的值就減去1。當該字段值爲0時,數據報就被丟棄,併發送ICMP報文通知源主機。
TTL(Time to live)域是一個用於限制分組生存期的計數器。這裏的計數單位爲秒,所以最大生存期爲255s。在每一跳上該計數器必須被遞減。並且數據報在一臺路由器上排隊時間較長時,該計數器必須被多倍遞減。在實踐中,當它遞減到0時,分組會被丟棄,路由器給源主機發送一個警告分組。此項特性能夠避免數據報長時間地逗留在網絡中。

 

iphdr->protocol

協議字段(8位):根據它能夠識別是哪一個協議向IP傳送數據。

當網絡層組裝完成一個完整地數據報以後,他須要知道該如何對它進行處理。協議(Protocol)域指明瞭該將它交給哪一個傳輸進程。TCP或者UDP或者其餘協議。

 

iphdr->check

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

爲了計算一份數據報的IP校驗和,首先把校驗和字段置爲0。而後對首部中每一個16bit進行二進制反碼求和(整個首部看出時一串16bie的字組成),結果存在校驗和字段中。當收到一份IP數據報後,一樣對首部中的每一個16bit進行二進制反碼求和。因爲接收方在計算過程當中包含了發送方存在首部中的校驗和,所以若是首部在傳輸過程當中沒有發生任何差錯,那麼接收方計算的結果應該全爲1。不然就意味着數據在傳輸過程當中發生錯誤,IP就會丟棄收到的數據報。可是不生成差錯報文,由上層區發現丟失的數據報並進行重傳。

 

iphdr->saddr

32源IP地址

 

iphdr->daddr

32位目的IP地址

 

網絡字節序

4字節的32bit值如下面的次數傳輸:

首先是0~7bit

其次是8~15bit

而後試16~23bit

最後是24~21bit

這種傳輸次數稱之爲big-endian字節序。因爲TCP/IP首部中全部的爲二進制整數在網絡傳輸中都要求以這種次序,所以它又被稱爲網絡字節序。

相關文章
相關標籤/搜索