IPv4首部一般是20字節長。在以太網幀中,IPv4包首部緊跟着以太網幀首部,同時以太網幀首部中的協議類型值設置為080016。 IPv4提供不同,大部分是很少用的選項,使得IPv4包首部最長可擴展到60字節(總是4個字節4個字節的擴展)
0 | 4 | 8 | 12 | 16 | 19 | 24 | 31 |
版本 | 首部長度 | 服務類型 | 長度 | ||||
認證 | 標志 | 段偏移量 | |||||
TTL | 協議 | 校驗和 | |||||
源IP地址 | |||||||
目的IP地址 | |||||||
選項 ... |
IP包頭字段說明
版本:4位,指定IP協議的版本號。
包 頭長度(IHL):4位,IP協議包頭的長度,指明IPv4協議包頭長度的字節數包含多少個32位。由於IPv4的包頭可能包含可變數量的可選 項,所以這個字段可以用來確定IPv4數據報中數據部分的偏移位置。IPv4包頭的最小長度是20個字節,因此IHL這個字段的最小值用十進制表示就是5 (5x4 = 20字節)。就是說,它表示的是包頭的總字節數是4字節的倍數。
服務類型:定義IP協議包的處理方法,它包含如下子字段
過程字段:3位,設置了數據包的重要性,取值越大數據越重要,取值范圍為:0(正常)~ 7(網絡控制)
延遲字段:1位,取值:0(正常)、1(期特低的延遲)
流量字段:1位,取值:0(正常)、1(期特高的流量)
可靠性字段:1位,取值:0(正常)、1(期特高的可靠性)
成本字段:1位,取值:0(正常)、1(期特最小成本)
未使用:1位
長度:IP包的總長
認證:
標志:是一個3位的控制字段,包含:
保留位:1位
不分段位:1位,取值:0(允許數據報分段)、1(數據報不能分段)
更多段位:1位,取值:0(數據包后面沒有包,該包為最后的包)、1(數據包后面有更多的包)
段偏移量:當數據分組時,它和更多段位(MF, More fragments)進行連接,幫助目的主機將分段的包組合。
TTL:表示數據包在網絡上生存多久,每通過一個路由器該值減一,為0時將被路由器丟棄。
協議:8位,這個字段定義了IP數據報的數據部分使用的協議類型。常用的協議及其十進制數值包括ICMP(1)、TCP(6)、UDP(17)。
校驗和:16位,是IPv4數據報包頭的校驗和。
源IP地址:
目的IP地址:
選項(IP Options):本書不討論。
填充(Padding):當IP報文頭長度不是32比特的整數倍時,填充0來湊齊32比特整數倍,沒有實際意義。
數據(Data):來自第4層的數據段。
IPv4的頭部結構如圖2-1所示。其長度通常為20字節,除非含有可變長的選項部分。
4位版本號(version)指定IP協議的版本。對IPv4來說,其值是4。其他IPv4協議的擴展版本(如SIP協議和PIP協議),則具有不同的版本號(它們的頭部結構也和圖2-1不同)。
4位頭部長度(header length)標識該IP頭部有多少個32bit字(4字節)。因為4位最大能表示15,所以IP頭部最長是60字節。
8位服務類型(Type Of Service,TOS)包括一個3位的優先權字段(現在已經被忽略),4位的TOS字段和1位保留字段(必須置0)。4位的TOS字段分別表示:最小延 時,最大吞吐量,最高可靠性和最小費用。其中最多有一個能置為1,應用程序應該根據實際需要來設置它。比如像ssh和telnet這樣的登錄程序需要的是 最小延時的服務,而文件傳輸程序ftp則需要最大吞吐量的服務。
16位總長度(total length)是指整個IP數據報的長度,以字節為單位,因此IP數據報的最大長度為65535(216-1)字節。但由於MTU的限制,長度超過MTU 的數據報都將被分片傳輸,所以實際傳輸的IP數據報(或分片)的長度都遠遠沒有達到最大值。接下來的3個字段則描述了如何實現分片。
16位標識(identification)唯一地標識主機發送的每一個數據報。其初始值由系統隨機生成;每發送一個數據報,其值就加1。該值在數據報分片時被復制到每個分片中,因此同一個數據報的所有分片都具有相同的標識值。
3位標志字段的第一位保留。第二位(Don’t Fragment,DF)表示“禁止分片”。如果設置了這個位,IP模塊將不對數據報進行分片。在這種情況下,如果IP數據報長度超過MTU的話,IP模 塊將丟棄該數據報並返回一個ICMP差錯報文。第三位(More Fragment,MF)表示“更多分片”。除了數據報的最后一個分片外,其他分片都要把它置1。
13位分片偏移(fragmentation offset)是分片相對原始IP數據報開始處(僅指數據部分)的偏移。實際的偏移值是該值左移3位(乘8)后得到的。由於這個原因,除了最后一個IP分 片外,每個IP分片的數據部分的長度必須是8的整數倍(這樣才能保證后面的IP分片擁有一個合適的偏移值)。
8位生存時間(Time To Live,TTL)是數據報到達目的地之前允許經過的路由器跳數。TTL值被發送端設置(常見的值是64)。數據報在轉發過程中每經過一個路由,該值就被路由器減1。當TTL值減為0時,路由器將丟棄數據報,並向源端發送一個ICMP差錯報文。TTL值可以防止數據報陷入路由循環。
8位協議(protocol)用來區分上層協議,我們在第1章討論過。/etc/protocols文件定義了所有上層協議對應的protocol 字段的數值。其中,ICMP是1,TCP是6,UDP是17。/etc/protocols文件是RFC 1700的一個子集。
16位頭部校驗和(header checksum)由發送端填充,接收端對其使用CRC算法以檢驗IP數據報頭部(注意,僅檢驗頭部)在傳輸過程中是否損壞。
32位的源端IP地址和目的端IP地址用來標識數據報的發送端和接收端。一般情況下,這兩個地址在整個數據報的傳遞過程中保持不變,而不論它中間經過多少個中轉路由器。關於這一點,我們將在第4章進一步討論。
IPv4最后一個選項字段(option)是可變長的可選信息。這部分最多包含40字節,因為IP頭部最長是60字節(其中還包含前面討論的20字節的固定部分)。可用的IP選項包括:
記錄路由(record route),告訴數據報途經的所有路由器都將自己的IP地址填入IP頭部的選項部分,這樣我們就可以跟蹤數據報的傳遞路徑。
時間戳(timestamp),告訴每個路由器都將數據報被轉發的時間(或時間與IP地址對)填入IP頭部的選項部分,這樣就可以測量途經路由之間數據報傳輸的時間。
松散源路由選擇(loose source routing),指定一個路由器IP地址列表,數據報發送過程中必須經過其中所有的路由器。
嚴格源路由選擇(strict source routing),和松散源路由選擇類似,不過數據報只能經過被指定的路由器。
關於IP頭部選項字段更詳細的信息,請參考IP協議的標准文檔RFC 791。不過這些選項字段很少被使用,使用松散源路由選擇和嚴格源路由選擇選項的例子大概僅有traceroute程序。此外,作為記錄路由IP選項的替 代品,traceroute程序使用UDP報文和ICMP報文實現了更可靠的記錄路由功能,詳情請參考文檔RFC 1393。