1. 引言

Internet Protocol (IP) 是网络层中最重要的通信协议,其核心功能是路由。它负责将主机发出的数据包通过路由器逐跳转发,直到到达目标地址。

简单来说,传输层会将数据流拆分成 IP 数据包,IP 路由器在网络中逐跳转发这些数据包,接收端的网络层再将所有数据包重新组装成原始的数据流,最后由传输层进行处理。

互联网是由多个异构网络通过路由器互联组成的。为了适应不同网络对数据传输速率和数据包大小的限制,路由器可能会将 IP 数据包拆分成更小的片段,这种技术称为分片(Fragmentation)

在本文中,我们将深入讲解 IPv4 数据报的结构和关键字段。

2. IPv4 数据报结构

IPv4 于 1981 年推出,至今仍在广泛使用。它采用 32 位地址空间,支持约 43 亿个唯一 IP 地址。

IPV4 Protocol Structure

一个 IPv4 数据包被称为 datagram(数据报),它由头部(header)数据部分(data payload)组成。

  • 头部至少有 20 字节固定字段(mandatory fields)。
  • 后续可选字段(options + padding)最多 40 字节
  • 所以整个头部长度在 20~60 字节之间。
  • 数据报最大长度为 65,535 字节(2¹⁶),其中至少 20 字节是头部,因此数据部分最大为 65,515 字节

IPv4 头部共有 14 个字段,前 13 个是必填字段,第 14 个是可选字段(Options)。

2.1 版本号(Version)

4 位字段,标识 IP 协议版本。IPv4 中该字段值为 4

2.2 头部长度(Internet Header Length, IHL)

4 位字段,表示头部长度,单位是 32 位字(4 字节)
最小值为 5(即 5×4=20 字节),最大值为 15(即 15×4=60 字节)。

2.3 服务类型(Differentiated Services Code Point, DSCP)

8 位字段,用于指定数据包的服务类型,例如 VoIP(语音 IP)流量优先处理。

2.4 显式拥塞通知(Explicit Congestion Notification, ECN)

用于在网络拥塞时通知发送端,而无需丢弃数据包,从而提高网络效率。

2.5 总长度(Total Length)

16 位字段,表示整个数据报的长度(包括头部和数据),单位为字节。最大值为 65,535。

2.6 标识符(Identification)

16 位字段,用于唯一标识一组数据报的分片。同一个原始数据报的所有分片具有相同的标识值。

2.7 标志位(Flags)

3 位字段,用于控制分片行为:

  • Bit 0:保留位,必须为 0。
  • Bit 1:DF(Don’t Fragment),若为 1 表示禁止分片。
  • Bit 2:MF(More Fragments),若为 1 表示还有后续分片。

2.8 分片偏移(Fragment Offset)

13 位字段,表示当前分片相对于原始数据报数据部分的偏移量,单位为 8 字节。

2.9 生存时间(Time To Live, TTL)

8 位字段,表示数据报的最大跳数(hop)。每经过一个路由器,TTL 减 1,减到 0 时被丢弃,防止数据包在网络中无限循环。

2.10 协议(Protocol)

8 位字段,表示数据部分使用的上层协议类型,例如:

  • 6 表示 TCP
  • 17 表示 UDP
  • 1 表示 ICMP

2.11 头部校验和(Header Checksum)

16 位字段,仅用于校验头部是否出错。每个路由器都会重新计算该值,若校验失败则丢弃数据包。

注意:校验和只校验头部,不包括数据部分。

2.12 源地址(Source Address)

32 位字段,表示发送方的 IPv4 地址。

2.13 目标地址(Destination Address)

32 位字段,表示接收方的 IPv4 地址。

2.14 可选字段(Options)

可变长度字段,用于扩展功能,如记录路由、时间戳等。使用较少,且通常只在特殊场景下使用。

3. 小结

本文详细介绍了 IPv4 数据报的结构和关键字段,帮助我们理解 IP 数据在网络中是如何被封装、转发和处理的。掌握这些基础知识对于网络编程、协议分析、以及网络故障排查都非常重要。

如果你在开发网络应用或做底层协议调试时,了解这些字段的含义和作用,可以帮你避免很多“踩坑”问题,也能更高效地定位和解决问题。


原始标题:IPv4 Datagram