Linux 網絡編程——IP 數據報格式詳解 http://www.linuxidc.com/Linux/2015-04/116149.htmlinux
TCP/IP 協議定義了一個在因特網上傳輸的包,稱爲 IP 數據報 (IP Datagram)。這是一個與硬件無關的虛擬包,由首部和數據兩部分組成。編程
首部的前一部分是固定長度,共 20 字節,是全部 IP 數據報必須具備的。在首部的固定部分的後面是一些可選字段,其長度是可變的。首都中的源地址和目的地址都是 IP 協議地址。安全
IP 數據報首部的固定部分中的各字段:網絡
1)版本:佔4位,指IP協議的版本。測試
通訊雙方使用的 IP 協議版本必須一致。日前普遍使用的 IP 協議版本號爲 4 (即 IPv4)。IPv6 目前還處於起步階段。spa
2)首部長度:佔 4 位,可表示的最大十進制數值是 15。設計
請注意,這個字段所表示數的單位是32位字 ( 1 個 32 位字長是 4 字節),所以,當 IP 的首部長度爲 1111 時 ( 即十進制的 15 ),首部長度就達到 60 字節。htm
當 IP 分組的首部長度不是 4 字節的整數倍時,必須利用最後的填充字段加以填充。所以數據部分永遠在 4 字節的整數倍開始,這樣在實現 IP 協議時較爲方便。首部長度限制爲 60 字節的缺點是有時可能不夠用。這樣作的目的是但願用戶儘可能減小開銷。隊列
最經常使用的首部長度就是 20 字節 (即首部長度爲 0101),這時不使用任何選項。資源
3)服務:佔 8 位,用來得到更好的服務,通常不使用。
服務類型字段實際上被劃分爲 2 個部分,一部分爲優先權一部分爲 TOS。優先權用來設定報文的優先級,就像郵包分爲掛號和平信同樣。TOS 容許按照吞吐量、時延、可靠性和費用方式選擇傳輸服務,在早期的時候,TOS 還被用來進行路由選擇。在 QOS 中有時也會使用優先權,常見的優先權隊列。
這個字段在舊標準中叫作服務類型,但實際上一直沒有被使用過。1998 年 IETF 把這個字段更名爲區分服務 DS ( DifferentiatedServices )。只有在使用區分服務時,這個字段才起做用。
4)總長度:總長度指首都及數據之和的長度,單位爲字節。
由於總長度字段爲 16 位,因此數據報的最大長度爲 65535 字節。在 IP 層下面的每一種數據鏈路層都有本身的幀格式,其中包括幀格式中的數據字段的最大長度,即最大傳送單元 MTU (Maximum Transfer Unit)。當一個數據報封裝成鏈路層的幀時,此數據報的總長度 ( 即首部加上數據部分 )必定不能超過下面的數據鏈路層的 MTU 值。
若是報文總長度大於數據鏈路可傳輸的最大傳輸單元(MTU),那麼就會對報文進行分片。
5)標識 ( Identification ):佔 16位。
IP 軟件在存儲器中維持一個計數器,每產生一個數據報,計數器就加 1,並將此值賦給標識字段。但這個「標識」並非序號,由於 IP 是無鏈接的服務,數據報不存在按序接收的問題。
當數據報因爲長度超過網絡的 MTU 而必須分片時,這個標識字段的值就被複制到全部的數據報的標識字段中。相同的標識字段的值使分片後的各數據報片最後能正確地重裝成爲原來的數據報。
6)標誌 ( Flag ):佔3 位,但目前只有2位有意義, 其中第一位沒有被使用。
第二位是不分片位,當 DF 位被置1,表示路由器不能對數據報文進行分片處理,若是報文因爲不能被分片而不能被轉發,那麼路由器將丟棄這個數據包,並向源地址發送錯誤報告。這一功能能夠用來測試線路的最大傳輸單元。只有當 DF = 0 時才容許分片。
第三位爲 MF,當路由器對數據進行分片時,除了最後一個分片的 MF 位爲 0 外,其餘全部的 MF 所有爲 1,表示其後面還有其餘的分片。
MF = 1 即表示後面 「還有分片」 的數據報。
MF = 0表示這已經是若干數據報片中的最後一個。
7)片偏移:佔 13位。較長的分組在分片後,某片在原分組中的相對位置。
也就是說,相對用戶數據字段的起點,該片從何處開始。片偏移以 8 個字節爲偏移單位。這就是說,每一個分片的長度必定是 8 字節 ( 64 位)的整數倍。
8)生存時間:佔 8 位,生存時間字段經常使用的英文縮寫是 TTL ( Time To Live ),其代表數據報在網絡中的壽命。
由發出數據報的源點設置這個字段。其目的是防止沒法交付的數據報無限制地在因特網中兜圍子,於是白白消耗網絡資源。
最初的設計是以秒做爲 TTL 的單位。每通過一個路由器時,就把 TTL 減去數據報在路由器消耗掉的一段時間。若數據報在路由器消耗的時間小於 1 秒,就把 TTL 值減 1。當 TTL 值爲 0 時,就丟棄這個數據報。當 TTL 爲零的時候,就會丟棄這個報文,同時向源地址發送錯誤報告,促使從新發送。
9)協議:佔 8 位,協議字段指出此數據報攜帶的數據是使用何種協議,以便使目的主機的 IP 層知道應將數據部分上交給哪一個處理過程,經常使用的有ICMP(1), IGMP(2), TCP(6), UDP(17), IPv6(41)
10)首部檢驗和:佔 16 位。這個字段只檢驗數據報的首部,但不包括數據部分。
這是由於數據報每通過一個路由器,都要從新計算一下首都檢驗和 ( 一些字段,如生存時間、標誌、片偏移等均可能發生變化 )。不檢驗數據部分可減小計算的工做量。
11)源地址:發送方IP地址
12)目的地址:接收方IP地址
IP 數據報首部的可變部分:
IP 首都的可變部分就是一個可選字段。選項字段用來支持排錯、測量以及安全等措施,內容很豐富。此字段的長度可變,從 1 個字節到 40 個字節不等,取決於所選擇的項目。
某些選項只須要 1 個字節,它只包括 1 個字節的選項代碼。但還有些選項須要多個字節,這些選項一個個拼接起來,中間不須要有分隔符,最後用全 0 的填充字段補齊成爲 4字節的整數倍。增長首都的可變部分是爲了增長 IP 數據報的功能,但這同時也使得 IP 數據報的首部長度成爲可變的。這就增長了每個路由器處理數據報的開銷。
實際上這些選項不多被使用。新的 IPv6就將 IP數據報的首部長度作成固定的。