一、IP資料報格式
IP資料報格式如下:
版本
IP協議版本號碼,長度為4位,IPv4此欄位值為4,IPv6此欄位值為6
首部長度
以32位的字為單位,該欄位長度為4位,最小值為5,即不帶任何選項的IP首部20個位元組;最大值為15,所以首部長度最大為60個位元組
服務類型(TOS)
長度為8位。此欄位包含3位的優先權(現已忽略),4位的服務類型子欄位和1位的保留位(必須置0)。4位的服務類型分別為最小延遲(D)、最大輸送量(T)、最高可靠性(R)、最小費用(F),如。
總長度
該欄位長度為16位,以位元組為單位,該欄位長度包含IP的頭部和資料部分(payload)。IP資料報最大可達65535個位元組。
標識
16位標識,用來標識一個IP資料報,每發送一個此值會加1,可用於分區和重新組裝成資料包。
標誌與片位移
3位標誌其中第一位不使用, 每二位DF(Don’t Fragment),該位如果為1,如果傳輸的資料報超過傳輸單元最大值,該資料報會被丟棄,並發送一個ICMP差錯報文。第三位MF(More Fragment)表示是否有更多的片,該位為1,說明後續有分區。最後一片MF為0。
IP包分區後每一個資料報都具有自己的首部,但是片位移值不同,通過片位移值接收端可以重新組裝IP包。
TTL
TTL(Time To Live)表示資料報最多可經過的路由器的數量。資料報每經過一個路由器,TTL減1,減為0時丟棄,並發送ICMP報文通知源主機。TTL可以避免資料報在路由器之間不斷迴圈。
協議類型
表示IP層上承載的是哪個進階協議。在封裝與分用的過程中,協議棧知道該交給哪個層的協議處理。1 ICMP 2 IGMP 6 TCP 17UDP
頭部校正和
保證資料前序部的資料完整性,但校正不包括資料部分。這樣做的目的有二:一是所有將資料封裝在IP資料包中的高層協議均含有覆蓋整個資料的校正和,因此IP資料報沒有必要再對其所承載的資料部分進行校正。二是每經過一個路由器,IP資料報的頭部要發生改變(如TTL),而資料部分不變,這樣只對發生改變的頭部進行校正,顯然不會浪費太多的時間。為了減少計算時間,一般不用CRC校正碼,而是採用更簡單的網際校正和(Internet
Checksum)。
源IP地址
發送資料的主機IP地址
目的IP地址
接收資料的主機IP地址
選項與填充(選項為4位元組整數倍,否則用0填充)
安全和處理限制
路徑記錄:記錄所經曆路由器的IP地址
時間戳記:記錄所經曆路由器的IP地址和時間
寬鬆來源站點路由:指定資料報文必須經曆的IP地址,可以經過沒有指定的IP地址。
嚴格的來源站點路由:指定資料報文必須經曆的IP地址,不能經過沒有指定的IP地址。
二、IP地址與路由
IPv4的IP地址長度為4位元組,通常採用點分十進位標記法(dotted decimal representation)例如0xc0a80002表示為192.168.0.2。Internet被各種路由器和網關裝置分隔成很多網段,為了標識不同的網段,需要把32位的IP地址劃分成網路號和主機號兩部分,網路號相同的各主機位於同一網段,相互間可以直接通訊,網路號不同的主機之間通訊則需要通過路由器轉寄。
假設某主機上的網路介面配置和路由表如下:
這台主機只有一個網路介面連到192.168.232.0/24網路。路由表的Destination是目的網路地址,Genmask是子網路遮罩,Gateway是下一跳地址,Iface是發送介面,Flags中的U標誌表示此條目有效(可以禁用某些條目),G標誌表示此條目的下一跳地址是某個路由器的地址,沒有G標誌的條目表示目的網路地址是與本機介面直接相連的網路,不必經路由器轉寄,因此下一跳地址處記為*號。
如果要發送的資料包的目的地址是192.168.232.1,跟第三行的子網路遮罩做與運算得到192.168.232.0,正是第三行的目的網路地址,因此從eth0介面發送出去,由於192.168.232.0/24正是與eth0介面直接相連的網路,因此可以直接發到目的主機,不需要經路由器轉寄。
如果要發送的資料包的目的地址是202.10.1.2,跟後兩行路由表條目都不匹配,那麼就要按預設路由條目,從eth0介面發出去,首先發往192.168.232.2 路由器,再讓路由器根據它的路由表決定下一跳地址。
路由的處理過程如下,ARP部分可以參考這裡:
參考:
《Linux C 編程一站式學習》
《TCP/IP詳解 卷一》