2.2 IPv4頭部結構
2.2.1 IPv4頭部結構
IPv4的頭部結構如圖2-1所示。其長度通常為20字節,除非含有可變長的選項部分。
4位版本號(version)指定IP協議的版本。對IPv4來說,其值是4。其他IPv4協議的擴展版本(如SIP協議和PIP協議),則具有不同的版本號(它們的頭部結構也和圖2-1不同)。
4位頭部長度(header length)標識該IP頭部有多少個32?bit字(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數據報的最大長度為65?535(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。