每一行都由32位比特,即4个字节组成,每个格子称为字段或者域。IP数据报由20字节的固定部分和最大40字节的可变部分组成。
总长度
总长度为16个比特,该字段的取值以字节为单位,用来表示IPv4数据报的长度(首部长度+数据载荷长度)最大取值为二进制的16个比特1,即十进制的65535。
tip:IP数据报的分片概念
为了让不同分片知道自己属于同一个IPv4数据报,因此需要
标识
标识长度为16个比特,属于同一个IPv4数据报的各分片数据报应该具有相同的标识。IP软件会维持一个计数器,每产生一个IPv4数据报,计数器值就加1,并将此值赋给标识字段。
标志
最低位(More Fragment,MF)
MF=1表示本分片后面还有分片
MF=0表示本分片后面没有分片
中间位(Don’t Fragment, DF)
DF=1表示不允许分片
DF=0表示允许分片
最高位为保留位,必须设置为0
片偏移
片偏移长度为13个比特,该字段的取值以8字节为单位,用来指出分片IPv4数据报的数据载荷偏移其在原IPv4数据报的位置有多远。
举例:
特殊举例:
生存时间(Time To Live,TTL)
长度为8个比特,最大取值为二进制的11111111,即十进制的255。
生存时间字段后来改为以“跳数”为单位,路由器收到待转发的IPv4数据报时,将其首部中的该字段的值减1,若结果不为0就转发,否则就丢弃。
协议
长度为8个比特,用来指明IPv4数据报的数据载荷是何种协议数据单元PDU。
常用的一些协议和相应的协议字段值
|
------|------|—|-||
协议名称 | ICMP | IGMP | TCP | UDP | IPv6 |
---|---|---|---|---|---|
协议字段值 | 1 | 2 | 6 | 17 | 41 |
首部校验和
首部检验和
长度为16个比特,用于检测IPv4数据报在传输过程中其首部是否出现了差错。
IPv4数据报每经过一个路由器,其首部中的某些字段的值(例如生存时间TTL、标志以及片偏移等)都可能发生变化,因此路由器都要重新计算一下首部检验和。
由于网际层并不向其高层提供可靠传输的服务,并且计算首部检验和是一项耗时的操作,因此在IPv6中,路由器不再计算首部检验和,从而更快转发IP数据报。
两数进行二进制反码求和运算规则:
从低位到高位逐列计算
00相加为0
01相加为1
11相加为0,进1到下一位
若最高位相加后产生进位,最后得到的结果要加1
可选字段
长度从1字节到40字节不等,用来支持排错、测量以及安全措施等功能。虽然可选字段增加了IPv4数据报的功能,但这同时也使得IPv4数据报的首部长度成为可变的,这就增加了因特网中每一个路由器处理IPv4数据报的开销。
实际上,可选字段很少被使用。
填充
当首部长度(20字节固定部分+可变部分)的长度不是4字节整数倍时,填充相应数量的全0字节,以确保IPv4数据报的首部长度是4字节的整数倍。