IPv4的頭部格式:
1. Version
版本號,預設是4。
2. IHL(Internet Header Length)
就是IPv4頭部長度。這個長度的單位是32bit,一般是5,那麼頭部的長度就是5x32bit=160bit。
3. DSCP(Differentiated Services Code Point),ECN(Explicit Congestion Notification)
原來這8位元組是被定義成TOS(Type of Service),現在被RFC2474定義成Differentiated services(差異化服務)和ECN。
背景:隨著網際網路的發展,各種各樣的服務被提供,比如語音、視訊、流音樂、網頁、郵件等等。原來的TOS定義已經跟不上時代的需要,所以在1998年,IETF釋出了RFC 2474,將原來的TOS替換成DSCP和ECN。
4. Total Length
整個資料包的長度,含頭部,單位為Byte。
5. Identification
資料包標識,用來區分相同的包,比如ping包。
6. Flags
bit 0 : 保留,總是0
bit 1 : Don’t Fragment, DF。表示不分片。當需要傳送的資料大於最長資料包限制的時候,資料需要分片傳送。如果這位置1,IP模組將不會對資料包進行分片。這種情況下,如果IP資料包長度超過MTU,IP模組將丟棄資料包並返回一個ICMP差錯報文。
bit 2 : More Fragment,MF。表示更多分片,除了資料包的最後一個分片外,其他分片都要把它置1.
7. Fragment Offset
分片的位移。(2^13 – 1) x 8 = 65528 bytes, 也就是說,最大的IP資料包長度為65528+20=65548位元組。
8. Time to Live, TTL
防止資料擁塞用的,有一個初始值,比如64,每經過一個路由器自動-1,到0的時候就被銷燬。
9. Protocol
上層協議號,比如ICMP是1,TCP是6,UDP是17.
10. Header Checksum
頭部CRC校驗,詳細可以看這裡:http://en.wikipedia.org/wiki/IPv4_header_checksum
11. Source IP Address
源IP地址
12. Destination IP Address
目標IP地址
13. Options
可選,不常用,後面再詳細分析。
抓包測試:
用tcpdump抓包, sudo tcpdump –ntx –i eth0 icmp
抓一下ping資料包,我這裡ping一下自己的主機craftor.org
上面一個包是傳送,下面的包是返回。
0x4 | 協議版本,v4 |
0x5 | 包頭長度,5x32bit |
0x00 | 參照RFC2474,00是預設包型別 |
0x0054 | 包總長為0x54=84 |
0x59b0 | ID |
0x4000 | 不分片,不分包 |
0x40 | TTL=64 |
0x01 | ICMP協議,ping屬於ICMP協議 |
0xbbbc | CheckSum |
0xc0a82c81 | SourceIP=192.168.44.129 |
0xc64a71c8 | DestinationIP=198.74.113.200 |
0x0800~0x3637 | Options |