IP 數據報首部
TCP/IP 協議定義了一個在因特網上傳輸的包,稱為 IP 數據報 (IP Datagram)。這是一個與硬件無關的虛擬包,由首部和數據兩部分組成。
首部的前一部分是固定長度,共 20 字節,是所有 IP 數據報必須具有的。在首部的固定部分的後面是一些可選字段,其長度是可變的。首都中的源地址和目的地址都是 IP 協議地址。
IP 數據報首部的固定部分中的各字段:
1)版本:佔4位,指IP協議的版本。
通信雙方使用的 IP 協議版本必須一致。日前廣泛使用的 IP 協議版本號為 4 (即 IPv4)。IPv6 目前還處於起步階段。
2)首部長度:佔 4 位,可表示的最大十進制數值是 15。
請注意,這個字段所表示數的單位是32位字 ( 1 個 32 位字長是 4 字節),因此,當 IP 的首部長度為 1111 時 ( 即十進制的 15 ),首部長度就達到 60 字節。
當 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),那麼就會對報文進行分片,詳情請看《IP 分片丟失重傳》。
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數據報的首部長度做成固定的。
閱讀更多 cpp軟件架構獅 的文章