ipv4報文格式
版本(version):4比特(bit),4(二進制0100)代表ipv4,6(二進制0110)代表ipv6;
報文頭長度(IHL,IP Header Length):4比特(bit),該值以4字節(Byte)
為一個單位,因此最長可以表示15*4=60字節(Byte);最小為20(不帶Option字段),最長為60;
服務類型(TOS,Type of Service):8比特(bit),用於實施QOS,RFC 791中TOS 的IP Precedence分為8個優先級,值越大優先級越高。RFC2474中對TOS重新定義,前6位定義成DSCP,可以標識64中等級,后兩位保留;
報文總長度(Total Length):長度16比特(bit),以字節(Byte)
為單位,包含報文頭和數據,所有IP報文最長65535字節(Byte),2的16次方等於65536;
標識符(Identification):16比特(bit),主機每發一個報文,加1,分片重組時會用到該字段,與Flags和Fragment Offset聯合使用進行分段操作,一個大包分段為多個小包時標記為相同的值;
標記(Flags):3比特(bit),第一位不使用,第二位是DF(Don’t Fragment)位,表示是否分片,0表示可以分片,1表示不能分片;第二位是MF(More Fragment)位,表示該報文是否為最后一片,0表示是,1表示否即還有后續報文;
片偏移(Fragment Offset):12比特(bit),表示分片在原分組中的相對位置,以8個字節
為偏移單位;
生存時間(TTL,Time to Live):8比特(bit),報文發送設備賦值,報文沒經過一台路設備,該設備會對TTL值減1,當TTL值為0時丟棄報文,用於防環;
協議(Protocol):8比特(bit),上層所用的協議;
頭部校驗(Header Checksum):16比特(bit),只檢驗數據包的首部,不檢驗數據部分。這里不采用CRC檢驗碼,而采用簡單的計算方法;因為路由器需要改變包頭里的TTL值,因此路由器需要為每個包重新計算頭部校驗值;
源地址(Source Address):32比特(bit), 源IP地址;
目的地址(Destination Address):32比特(bit), 目標IP地址;
可選項(Options):可變長度;主要用於測試,具體見下方
填充(Padding):填充字段,全0,因IP報文頭長度單位為32bit(4Byte,),所以報文長度必須為32bit的整數倍。
擴展--服務類型(TOS,Type of Service):
COS、TOS和DSCP:
COS是二層報文優先級IEEE802.1p,TOS和DSCP是三層IP報文頭的優先級
COS是字VLAN幀里的802.1Q tag里的一個PRI字段(3bit),代表8個優先級0-7
報文分為三種情況:帶優先級和VLAN ID的標簽報文,其優先級值是自身帶的值;只帶優先級的標簽報文,此時VLAN ID為0,其優先級值是自身帶的值;未帶標簽的報文,一般默認的優先級值為0,也可以進行更改指定新的優先級。
TOS和DSCP是IP報文頭的優先級,不同的RFC,具體參考QOS;
擴展--可選項(Options):
松散源路由(Loose source Routing):給出一連串路由器接口IP地址,IP包必須沿着這些IP傳送,但允許相繼的兩個IP之間經過多跳;
- Type: 類型。占1字節,此處設為131。
- length: 占1字節,記錄整個選項的長度。
- pointer: 指針項,占1個字節,指向下一個被處理的源站地址,最小值為4。
- route data: 路由數據。
嚴格源路由(Strict Source Routing):給出一連串路由器接口IP地址,IP包必須沿着這些IP傳送,如果下一跳不在IP列表則表示發生錯誤; - Type=137(10001001):占1字節,code 的值此處設為137。
- length:占1字節,記錄整個選項的長度。
- pointer:指針項,占1個字節,指向下一個被處理的源站地址,最小值為4。
路有記錄(Record Route):當IP包離開每個路由器時,記錄路由器的出接口IP地址; - Type: 指明IP選項的類型。此處值為7。
- length: 選項的總字節長度。不包含填充的長度,IP填滿時最大為39;。
- pointer: 它是一個基於1的指針,指向存放下一個IP地址的位置。它的最小值為4,指向存放第一個IP地址的位置。隨着每個IP地址存入清單,ptr的值分別為8,12,16,最大到36,當記錄下9個IP地址后,ptr的值為40,表示清單已滿。
- route data: 路由數據。
時間戳(Timestamps):當IP包離開每個路由器時紀錄時間。 - Type (01000100):時間戳選項,代碼為68;
- length:選項的總長度(一般為36或40);
- ponter:指向下一個可用空間的指針(5,9,13等);
- oflw:表示溢出字段;
- flg:表示標志字段:
0:只記錄時間戳。
1:每台路由器都記錄它的IP地址和時間戳。在選項列表中只有存放4對地址和時間戳的空間。
3:發送端對選項列表進行初始化,存放了4個IP地址和4個取值為0的時間戳值。只有當列表中的下一個IP地址與當前路由器地址相匹配時,才記錄它的時間戳。