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首部中全部的爲二進制整數在網絡傳輸中都要求以這種次序,所以它又被稱爲網絡字節序。