Linux 網路程式設計 IP 資料報格式詳解

2021-08-29 20:43:23 字數 2783 閱讀 1298

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 位)的整數倍。

由發出資料報的源點設定這個字段。其目的是防止無法交付的資料報無限制地在網際網路中兜圍子,因而白白消耗網路資源。

最初的設計是以秒作為 ttl 的單位。每經過乙個路由器時,就把 ttl 減去資料報在路由器消耗掉的一段時間。若資料報在路由器消耗的時間小於 1 秒,就把 ttl 值減 1。當 ttl 值為 0 時,就丟棄這個資料報。當 ttl 為零的時候,就會丟棄這個報文,同時向源位址傳送錯誤報告,促使重新傳送。

9)協議:佔 8 位,協議字段指出此資料報攜帶的資料是使用何種協議,以便使目的主機的 ip 層知道應將資料部分上交給哪個處理過程,常用的有icmp(1), igmp(2), tcp(6), udp(17), ipv6(41)

10)首部檢驗和:佔 16 位。這個欄位只檢驗資料報的首部,但不包括資料部分。

這是因為資料報每經過乙個路由器,都要重新計算一下首都檢驗和 ( 一些字段,如生存時間、標誌、片偏移等都可能發生變化 )。不檢驗資料部分可減少計算的工作量。

ip 資料報首部的可變部分:

ip 首都的可變部分就是乙個可選字段。選項字段用來支援排錯、測量以及安全等措施,內容很豐富。此字段的長度可變,從 1 個位元組到 40 個位元組不等,取決於所選擇的專案。

某些選項只需要 1 個位元組,它只包括 1 個位元組的選項**。但還有些選項需要多個位元組,這些選項乙個個拼接起來,中間不需要有分隔符,最後用全 0 的填充字段補齊成為 4位元組的整數倍。增加首都的可變部分是為了增加 ip 資料報的功能,但這同時也使得 ip 資料報的首部長度成為可變的。這就增加了每乙個路由器處理資料報的開銷。

網路層 IP資料報

網路層的協議資料單元pdu是ip資料報,ipv4是ip協議的乙個版本,還有最新的ipv6版本,後面進行介紹。版本 指版本號4 首部長度 佔4位,一行首部4位元組 32位 至少5行共20位元組,最多15行共60位元組 區分服務 未使用該欄位 總長度 佔16位,首部和資料長度之和,最大2 16 1位元組...

linux如何修改ip資料報

dsr0.0.1程式存檔及說明 如何修改ip資料報 2007 10 08 19 41 38 對傳送的資料報的資料報型別進行修改 改為dsr型別,設dsr型別的值為24 同時加入dsr選項,儲存原來的資料型別 接收的資料報為逆過程 還原原資料報的資料型別 去掉dsr選項 實現的效果 只用同時執行該程式...

python 網路程式設計(udp資料報)

什麼是udp udp是乙個簡單的面向資料報的運輸層協議 程序的每個輸出操作都正好產生乙個udp資料報,並組裝成乙份待傳送的ip資料報。這與面向流字元的協議不同,如tcp,應用程式產生的全體資料與真正傳送的單個ip資料報可能沒有什麼聯絡。接收端是伺服器 server 傳送端是客戶機 client py...