协议头
|00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|
| Version | IHL | DSCP | ECN | Total Length |
| Identification | Flags | Fragment Offset |
| Time To Live | Protocol | Header Checksum |
| Source IP Address |
| Destination IP Address |
| Options(if IHL > 5) |
| Data |
Version 版本号 4bits
数值是4表示IPv4
IHL Internet Head Length IPv4协议头长度 4bits
这个数值表示有几个32位的数据,也就是有几个4字节,如果没有可选项,那么值是5,表示4*5=20个字节。从上图也可以看出正好5排。所以可选项是否存在也是根据IHL>5判断。
TOS Type of Service 服务类型 8bits
用来控制数据传输优先级,又分为DSCP和ECN
-
DSCP Differentiated Services Code Point 差分服务器编码点 6bits
-
ECN Explicit Congestion Notification 显示拥塞通知 2bits
Total Length 总长度 16bits
这个IP数据包总长度,包括Head,表示多少个bytes。因为是16bits,所以IPv4数据包最大是65535bytes。但是由于MTU大小一般是1500,包括Ethernet II协议也规定数据长度为1500,所以如果数据超过这个长度就需要分片了。
Identification 标识 16bits
说分片,分片就来了。这个是用来针对同一组传输数据,由于受限于Total Length,采取分片传输后,区分属于哪组分片的标识。Identification相同,并且四元组也形同,就可以认定为同一分片。
Flags 标志 3bits
标识分片状态,控制分片
- bit 0:保留,设为0
- bit 1:是否可分片 0-不可分片;1-可分片
- bit 2:是否有更多分片 0-没有更多分片,表示为最后一个分片数据包;1-还有更多分片数据包
Fragment Offset 分片偏移 13bits
第一个分片是0,这个数值表示数据处于原数据的位置偏移,偏移了多少个8bytes。最大数据是2^13 - 1=8191个8bytes,所以最大是8191*8=65528bytes,是小于IPv4最大数据长度65535的,所以是可以分片的,并且就算加上head也是合法的。
这里有一个需要注意,由于表示是偏移几个8bytes,所以分片数据必须是8bytes倍数。
Time To Live TTL 生存时间 8bits
一个数值,每经过一个路由器会减1,数值为0时,数据包丢掉。这是为了避免有数据包找不到目的地址,在网络中不断的空转,这样的包越来越多,如果不丢掉,就会耗尽网络资源。
Protocol 协议 8bits
表示当前数据包的数据部分保存的是什么协议的内容,列几个常见的
数值 | 协议 |
---|---|
1 | ICMP |
4 | IP in IP 一种隧道协议把IP数据包在另一个IP中 |
6 | TCP |
17 | UDP |
Header checksum 头部校验码 CRC 16bits
用于校验头部数据是否正确
Source address 源IPv4地址 32bits
Destination address 目的IPv4地址 32bits
Options 可选项
这个不常用,最后数据必须填充为32bits的倍数