文章目录
- IPv4数据报的首部格式
- IPv4数据报分片
- 生存时间 TTL字段
- 协议字段
- 首部检验和字段
IPv4数据报的首部格式
IPv4 数据报的首部格式及其内容是实现 IPv4
协议各种功能的基础。
在 TCP/IP
标准中,各种数据格式常常以32比特(即4字节)为单位来描述
-
固定部分:每个 IPv4 数据报都必须要包含的部分
-
某些 IPv4 数据报的首部,除了包含 20 字节的固定部分,还包含一些可选的字段来增加 IPv4 数据报的功能
-
版本:长度为 4 个比特,用来表示 IP 协议的版本,通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议的版本号为4(即IPv4)
-
首部长度:长度为4个比特,该字段的取值以4字节为单位,用来表示IPv4数据报的首部长度(总是4的整数倍)。
-
最小取值为二进制的
0101
,即十进制的5,再乘以4字节单位,表示IPv4数据报首部只有20字节固定部分。 -
最大取值为二进制的
1111
,即十进制的15,再乘以4字节单位,表示IPv4数据报首部包含20字节固定部分和最大40字节可变部分。
-
-
可选字段:长度从1字节到40字节不等,用来支持排错测量以及安全措施等功能。虽然可选字段增加了 IPv4 数据报的功能,但这同时也使得 IPv4 数据报的首部长度成为可变的,这就增加了因特网中每一个路由器处理 IPv4 数据报的开销。实际上,可选字段很少被使用。
-
填充:用来确保 IPv4 数据报的首部长度是4字节的整数倍,使用全0进行填充。当首部长度(20字节固定部分+可变部分)的长度不是 4字节 整数倍时,填充相应数量的全0字节,以确保 IPv4 数据报的首部长度是 4字节 的整数倍。
-
区分服务:长度为 8 个比特,用来获得更好的服务该字段在旧标准中叫作服务类型,但实际上一直没有被使用过。1998年,因特网工程任务组IETF把这个字段改名为区分服务。利用该字段的不同取值可提供不同等级的服务质量。只有在使用区分服务时该字段才起作用,一般情况下都不使用该字段。
-
总长度:长度为16个比特,该字段的取值以字节为单位,用来表示IPv4数据报的长度(首部长度+数据载荷长度)。最大取值为二进制的 16 个比特1,即十进制的65535(很少传输这么长的IPv4数据报)
-
源IP地址:长度为32比特,用来填写发送 IPv4 数据报的源主机的 IPv4 地址。
-
目的IP地址:长度为32比特,用来填写接收 IPv4 数据报的目的主机的 IPv4 地址。
IPv4数据报分片
IPv4 数据报中的标识、标志、片偏移部分,共同用于IPv4数据报分片
当 IPv4 数据报长度超过 MTU
(最大传输单元,Maximum Transmission Unit) 时,无法封装成帧,需要将原 IPv4 数据报分片为若干个更小的IPv4数据报,再将分片后的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数据报的位置有多远。
某个 IPv4 数据报总长度为 3820 字节,采用 20 字节固定首部,根据数据链路层要求,需要将该 IPv4 数据报分片为长度不超过 1420 字节的数据报片:
-
确定原始数据报的大小:原始 IPv4 数据报的总长度是 3820 字节。其中包括 20 字节的 IP 首部。
-
计算有效载荷的大小:有效载荷的大小 = 总长度 - IP首部长度 = 3820 - 20 = 3800 字节。
-
确定每个分片的最大大小:根据题目要求,每个分片的大小不能超过 1420 字节。每个分片包含 20 字节的 IP 首部和最多 1400 字节的有效载荷。
-
计算所需的分片数量:
- 第一分片:从第 0 到第 1399 字节(共1400字节)
- 第二分片:从第 1400 到第 2799 字节(共1400字节)
- 第三分片:从第 2800 到第 3799 字节(共1000字节)
-
设置分片信息:
-
分片标识 (Identification):保持不变,设为 23333。
-
MF标志位 (More Fragments):除最后一个分片外的所有分片都设为1,表示还有更多分片。最后一个分片设为0。
-
DF标志位 (Don’t Fragment):所有分片都设为0,因为已经进行了分片操作。
-
片偏移 (Fragment Offset):以8字节为单位,第一个分片为0,第二个分片为 1400 8 = 175 \frac{1400}8 = 175 81400=175 第三个分片为 2800 8 = 350 \frac{2800}8 = 350 82800=350。
-
-
总结分片信息:
分片编号 | 总长度(字节) | 标识 | MF | DF | 片偏移 |
---|---|---|---|---|---|
1 | 20 + 1400 | 23333 | 1 | 0 | 0 |
2 | 20 + 1400 | 23333 | 1 | 0 | 175 |
3 | 20 + 1000 | 23333 | 0 | 0 | 350 |
通过以上步骤,我们可以将原始的 3820 字节 IPv4 数据报成功地分成三个符合要求的分片。
生存时间 TTL字段
生存时间(Time To Live,TTL):长度为 8 个比特,最大取值为二进制的11111111
,即十进制的 255。该字段的取值最初以秒为单位。因此,IPv4 数据报的最大生存时间最初为 255 秒。路由器转发 IPv4 数据报时,将其首部中该字段的值减去该数据报在路由器上所耗费的时间,若结果不为 0 就转发,否则就丢弃。
生存时间字段后来改为以“跳数”为单位,路由器收到待转发的IPv4数据报时,将其首部中的该字段的值减1,若结果不为0就转发,否则就丢弃。
生存时间字段可以防止被错误路由的IPv4数据报无限制地在因特网中兜圈。
协议字段
协议:长度为8个比特,用来指明 IPv4 数据报的数据载荷是何种协议数据单元PDU。
常用的一些协议和相应的协议字段值
协议名称 | 协议字段值 |
---|---|
ICMP | 1 |
IGMP | 2 |
TCP | 6 |
UDP | 17 |
IPv6 | 41 |
OSPF | 89 |
首部检验和字段
首部检验和:长度为16个比特,用于检测 IPv4 数据报在传输过程中其首部是否出现了差错。IPv4数据报每经过一个路由器,其首部中的某些字段的值(例如生存时间 TTL、标志以及片偏移等)都可能发生变化,因此路由器都要重新计算一下首部检验和。
首部检验和的计算方法:
上述检验和的计算方法不仅用于IP协议,还用于运输层的用户数据报协议 UDP
和传输控制协议 TCP
,常被称为因特网检验和(Internet Checksum)。这种检验和的检错性能虽然不如 CRC 循环冗余校验,但更易用软件实现。
首部检验和计算的重点在于二进制反码求和的运算,两个数进行二进制反码求和的运算规则是从低位到高位逐列进行计算:
- 0 和 0 相加是 0
- 0 和 1 相加是 1
- 1 和 1 相加是 0,但要产生一个进位 1,加到下一列
- 若最高位相加后产生进位,则最后得到的结果要加 1
- 将最终结果取反码,得到检验和。
由于网际层并不向其高层提供可靠传输的服务,并且计算首部检验和是一项耗时的操作,因此在 IPv6 中,路由器不再计算首部检验和,从而更快转发IP数据报。