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 |