一、引言
IPv4(Internet Protocol version 4)是互联网协议族中的核心协议,也是目前全球使用最广泛的网络层协议。作为互联网的 "交通规则",IPv4 定义了数据包在网络中的传输方式,负责将数据从源主机路由到目的主机,无论中间经过多少网络设备。IPv4 于 1981 年在 RFC 791 中正式定义,虽然已经存在超过 40 年,但仍然是现代互联网的基础。随着 IPv6 的逐渐普及,IPv4 依然占据主导地位,特别是在企业网络和家庭网络中。
本文将全面解析 IPv4 协议,深入探讨其报头结构、组成字段及其相互关系,以及从数据封装到传输再到解封装的完整通讯过程。通过本文的学习,读者将能够系统掌握 IPv4 的工作原理和实现机制,为深入理解计算机网络奠定基础。
二、IPv4 报头结构与组成字段详解
IPv4 数据报由两个主要部分组成:IP 首部和数据部分。IP 首部的固定部分长度为 20 字节,后面可以跟随可选字段,这些字段的总长度是变化的。IPv4 报头包含 13 个字段,这些字段是版本、互联网首部长度、服务类型、总长度、标识、标志、片偏移、生存时间、协议、首部校验和、源地址、目的地址和选项。这些字段共同构成了 IPv4 数据包的控制信息,指导数据包在网络中的传输。
2.1 版本(Version)字段
版本字段占 4 比特,用于表示网络层头部格式的版本号。对于 IPv4 来说,这个字段的值始终为 4。版本字段的作用是让接收方能够识别和处理不同版本的 IP 协议格式,确保发送方和接收方使用相同的协议版本进行通信。
当网络设备接收到一个 IP 数据包时,首先会检查版本字段,以确定如何解析后续的报头内容。如果版本号不匹配,设备可能无法正确处理该数据包,通常会将其丢弃并可能发送一个 ICMP 错误消息。版本字段位于 IP 报头的最前面,这使得接收方能够快速识别协议版本,而无需解析整个报头。
2.2 首部长度(IHL, Internet Header Length)字段
首部长度字段占 4 比特,指示 IP 报头的长度,以 32 位的字为单位。这个字段的最小值为 5(对应 20 字节),表示不包含任何选项的基本 IP 报头长度。最大值为 15(对应 60 字节),允许 IP 报头包含最多 40 字节的可选字段。
首部长度字段的计算公式为:首部长度(字节) = IHL值 × 4。例如,如果 IHL 字段的值为 5,则首部长度为 20 字节;如果值为 10,则首部长度为 40 字节。首部长度字段的作用是告诉接收方 IP 报头的结束位置和数据部分的开始位置,这对于正确解析数据包至关重要。
由于 IP 报头的某些字段(如选项)是可选的,接收方无法预先知道报头的总长度。首部长度字段解决了这个问题,确保接收方能够准确找到数据部分的起始位置。需要注意的是,首部长度必须是 32 位的整数倍,如果不是,需要通过填充字段(Padding)来补全。
2.3 区分服务(Differentiated Services)字段
区分服务字段占 8 比特,最初被设计为服务类型(Type of Service,ToS)字段,用于指定数据包的处理优先级和服务质量要求。该字段的设计目的是让发送者能够指明数据包的处理优先级和要求,例如低延迟、高吞吐量或高可靠性。
ToS 字段的使用并不普遍,因为不是所有的网络设备都会利用这些信息。随着技术发展,该字段在 RFC 2474 中被重新定义为区分服务(Differentiated Services,DiffServ)字段,其中前 6 位用于差分服务代码点(DSCP),后 2 位用于显式拥塞通知(ECN)。
DSCP 允许更精细的流量分类和优先级处理,定义了不同的每跳行为(PHB,Per-Hop Behavior),如:
- Expedited Forwarding (EF):用于高优先级流量,如 VoIP 或实时视频会议,保证低延迟、低丢包率和高可靠性。
- Assured Forwarding (AF):提供一组 PHBs,允许客户端获得保证的带宽。
- Best Effort:传统的互联网服务模型,数据包没有优先级,尽最大努力交付,但不保证。
- Network Control:用于网络控制流量,如路由器之间的路由协议交换信息。
DSCP 使得网络运营商可以实现复杂的 QoS 策略,以优化网络流量并保证服务质量。这些设置通常在网络设备上配置,并可以基于业务要求来优先处理或限制流量。
2.4 总长度(Total Length)字段
总长度字段占 16 比特,用于表示整个 IP 数据包(包括头部和数据)的长度,以字节为单位。由于该字段为 16 比特,IPv4 数据包的最大理论长度为 65535 字节。
总长度字段的主要作用是告诉接收方整个数据包的大小,包括头部和数据部分。通过将总长度减去首部长度(IHL × 4),接收方可以计算出数据部分的长度。这对于正确解析数据包和确保接收完整的数据至关重要。
虽然理论上 IPv4 数据包可以达到 65535 字节,但在实际应用中,大多数数据包都远小于这个值,因为大多数网络链路都有最大传输单元(MTU)的限制。MTU 是指链路层能够传输的最大数据包大小。例如,以太网的 MTU 通常为 1500 字节。当 IP 数据包超过 MTU 时,可能需要进行分片处理,这将在后续章节详细讨论。
2.5 标识(Identification)字段
标识字段占 16 比特,用于唯一识别主机发出的数据包片段。大多数经网络传送的消息都包含多个数据包,消息中的每个数据包都通过 16 比特标识符字段分配一个唯一值。
当某个数据包需要被分片成两个或多个数据包时,所有被分段后的数据包的标识符字段都相同,这样就能帮助接收端重组这些分段。标识字段的作用是让接收方能够识别哪些分片属于同一个原始数据包,从而正确地将它们重新组装起来。
标识字段的值由发送方分配,通常是一个递增的计数器。当发送方发送一个数据包时,它会为该数据包分配一个唯一的标识值。如果该数据包在传输过程中被分片,所有的分片都会携带相同的标识值。接收方根据这个标识值将属于同一个原始数据包的分片组合在一起。
2.6 标志(Flags)字段
标志字段占 3 比特,用于控制和指示分片的相关信息。标志字段的三个比特分别为:
- 保留位(Reserved Bit):第一个比特为 0,保留未使用。
- 不分段(Don't Fragment, DF)比特:第二个比特称为 DF 比特,DF 比特为 1 表示该数据包不应该被分段。如果设置了 DF 比特,而数据包又超过了 MTU,路由器将丢弃该数据包并发送一个 ICMP 错误消息。
- 更多分段(More Fragments, MF)标志:第三个比特表示该分段是最后一个分段(比特为 0)或者后面还有更多的分段(比特为 1)。如果数据包未被分段,那么就只有一个分段,该标志比特就被置为 0。
DF 比特在测试源端与目的端路径上的 MTU 时非常有用。如果 DF 为 1,那么数据包就不应该被分段。对路径上的任意路由器来说,如果其 MTU 小于数据包,那么就丢弃该数据包并向源端返回一条 ICMP 消息 "目的地不可达",该 ICMP 消息将包含该路由器出接口的 MTU。这就是路径 MTU 发现(Path MTU Discovery)机制的基础,该机制有助于确定路径上的最小 MTU,从而避免不必要的分片。
2.7 片偏移(Fragment Offset)字段
片偏移字段占 13 比特,用于指出本分片在其原始未分割数据报中的位置。片偏移量以 8 字节为单位,这意味着每个分片的长度必须是 8 字节的整数倍。
片偏移字段的作用是告诉接收方该分片在原始数据包中的位置,以便在重组时能够正确地将各个分片按顺序排列。第一个分片的偏移值为 0,如果数据包未被分段,那么该字段值为 0。
例如,如果一个原始数据包被分成三个分片,第一个分片的偏移量为 0,第二个分片的偏移量为 1480/8=185(假设第一个分片的数据部分为 1480 字节),第三个分片的偏移量为 (1480+1480)/8=370。接

最低0.47元/天 解锁文章
6791

被折叠的 条评论
为什么被折叠?



