📡 IP报文格式大全

交互式可视化 IPv4 与 IPv6 报文头部结构

IPv4 报文头部格式

IPv4 头部固定 20 字节(160 位),包含 14 个字段

Version/IHL
Ver
IHL
DSCP/ECN
DSCP
ECN
Total Length
Total Length (16 bits)
Identification
ID (16 bits)
Flags/Fragment
Flags (3)
Fragment Offset (13)
TTL
Time To Live (8)
Protocol
Protocol (8)
Header Checksum
Checksum (16)
Source Address
Source IP (32 bits)
Destination Address
Destination IP (32 bits)
Options (可选)
Options & Padding (0-40 bytes)

版本 (Version) + 头部长度 (IHL)

版本 (4 bits): 标识 IP 协议版本,IPv4 固定为 0100 (4)。

IHL - Internet Header Length (4 bits): 头部长度,以 32 位字为单位。最小值为 5(20 字节),最大值为 15(60 字节)。

这两个字段共占 1 字节(8 位),前 4 位为版本,后 4 位为 IHL。

  • 例如 IHL = 5 表示头部为 5 × 4 = 20 字节(无选项字段)
  • IHL = 6 表示头部为 24 字节(包含 4 字节选项)

服务类型 (DSCP) + ECN

DSCP - Differentiated Services Code Point (6 bits): 区分服务编码点,用于 QoS 标记,定义数据包的优先级和处理策略。

ECN - Explicit Congestion Notification (2 bits): 显式拥塞通知,用于在拥塞时通知发送方降低速率,而不丢弃数据包。

这两个字段共占 1 字节(8 位),前 6 位为 DSCP,后 2 位为 ECN。

  • DSCP 值 0-63,常见值:EF ( Expedited Forwarding, 101110) 用于语音等实时流量
  • ECN 值:00 (不支持), 01 (ECT(0)), 10 (ECT(1)), 11 (CE)

总长度 (Total Length)

16 位字段: 表示整个 IP 数据包(头部 + 数据)的长度,单位为字节。

取值范围:0 - 65,535 字节。但实际传输中通常受 MTU 限制(如以太网 MTU 1500 字节)。

  • 最小值为 20 字节(只有头部,无数据)
  • 如果数据包需要分片,每个分片都有自己的总长度字段
  • 接收方通过此字段判断数据包是否完整

标识 (Identification)

16 位字段: 用于标识主机发送的每一个数据包。当数据包需要分片时,所有分片都保留相同的标识值。

发送主机为每个发出的数据包递增此值(通常从 0 或随机值开始)。

  • 接收方通过标识字段识别属于同一原始数据包的分片
  • 配合源 IP、目的 IP 和协议字段唯一标识一个数据流
  • 标识值会循环使用(达到 65535 后回到 0)

标志 (Flags) + 片偏移 (Fragment Offset)

Flags (3 bits): 分片控制标志。

  • 第 0 位:保留,必须为 0
  • 第 1 位:DF (Don't Fragment) - 0=允许分片, 1=禁止分片
  • 第 2 位:MF (More Fragments) - 0=最后一片, 1=还有后续分片

Fragment Offset (13 bits): 片偏移,表示该分片在原始数据包中的位置,单位为 8 字节(64 位)。

  • 第一个分片偏移为 0
  • 后续分片偏移 = 前面所有分片的数据长度 / 8
  • 最大可表示偏移:8191 × 8 = 65,528 字节

生存时间 (TTL - Time To Live)

8 位字段: 数据包在网络中能够经过的最大跳数(路由器跳数)。

每经过一个路由器,TTL 值减 1。当 TTL 减到 0 时,路由器丢弃该数据包,并向源主机发送 ICMP Time Exceeded 消息。

  • 初始值通常为 64(Linux)、128(Windows)或 255(Cisco)
  • 防止数据包在网络中无限循环
  • 可以用 traceroute 工具通过 TTL 探测路径

协议 (Protocol)

8 位字段: 标识上层协议类型,指示 IP 数据包中封装的是哪种协议的数据。

常见协议号:

  • 1 - ICMP (Internet Control Message Protocol)
  • 6 - TCP (Transmission Control Protocol)
  • 17 - UDP (User Datagram Protocol)
  • 89 - OSPF (Open Shortest Path First)
  • 47 - GRE (Generic Routing Encapsulation)

接收方根据此字段将数据部分交给相应的上层协议处理。

头部校验和 (Header Checksum)

16 位字段: 仅对 IP 头部进行校验,不包括数据部分。

校验和计算方法:

  • 将头部视为 16 位字的序列
  • 所有 16 位字求和(采用 1 的补码运算)
  • 取结果的 1 的补码作为校验和字段的值
  • 校验时重新计算,结果应为 0(表示无错误)

注意: 路由器转发时,TTL 字段会减 1,因此必须重新计算校验和。

源 IP 地址 (Source Address)

32 位字段 (4 字节): 标识发送方的 IP 地址。

格式:点分十进制表示,如 192.168.1.100

  • 在 NAT 环境中,此地址可能被转换为公网 IP
  • 接收方回复数据包时,目的地址填此字段的值
  • 用于路由选择和返回路径

目的 IP 地址 (Destination Address)

32 位字段 (4 字节): 标识接收方的 IP 地址。

路由器根据目的地址进行路由转发决策。

  • 单播地址:指向单个主机
  • 广播地址:如 255.255.255.255(受限广播)
  • 多播地址:如 224.0.0.0 ~ 239.255.255.255

选项 (Options) + 填充 (Padding)

可变长度 (0-40 字节): 可选字段,用于特殊功能。

常见选项:

  • Security - 安全限制(军用级别)
  • Loose Source Routing - 松散源路由(指定部分路由)
  • Strict Source Routing - 严格源路由(指定完整路径)
  • Record Route - 记录路由路径
  • Timestamp - 时间戳记录
  • Router Alert - 路由器提醒

如果选项长度不是 32 位的倍数,需要用 0 填充,确保头部总长度为 32 位的倍数。

💡 IPv4 头部总结

  • 固定部分: 20 字节(160 位)
  • 可变部分: 0-40 字节(选项字段)
  • 最小总长度: 20 字节(无数据)
  • 最大总长度: 65,535 字节
  • 传输单位: 大端序 (Big-endian)

IPv6 报文头部格式

IPv6 头部固定 40 字节(320 位),简化了字段设计,移除了校验和

Version
Ver (4)
Traffic Class
Traffic Class (8)
Flow Label
Flow Label (20)
Payload Length
Payload Length (16)
Next Header
Next Header (8)
Hop Limit
Hop Limit (8)
Source Address
Source (128 bits)
Destination Address
Destination (128 bits)

版本 (Version)

4 位字段: 标识 IP 协议版本,IPv6 固定为 0110 (6)。

路由器通过此字段识别数据包是 IPv4 还是 IPv6,并采用相应的处理方式。

流量类别 (Traffic Class)

8 位字段: 类似于 IPv4 的 DSCP 字段,用于 QoS 标记。

前 6 位为 DSCP,后 2 位为 ECN(显式拥塞通知)。

  • 用于区分不同流量的优先级
  • 支持实时流量(如 VoIP、视频)的高优先级转发
  • 与 IPv4 DSCP 兼容,便于平滑过渡

流标签 (Flow Label)

20 位字段: 用于标识同一"流"的数据包,支持 QoS 处理。

流是一系列具有相同源、目的、协议类型的数据包,可能还有相同的端口号。

  • 非零值表示这是一个特定流,路由器可以为其提供特殊处理
  • 值为 0 表示普通数据包
  • 允许路由器缓存流的状态,实现快速转发
  • 对实时应用(如视频会议)特别有用

有效载荷长度 (Payload Length)

16 位字段: 表示 IPv6 头部之后的数据部分(扩展头部 + 上层数据)的长度,单位为字节。

最大值为 65,535 字节。如果有效载荷超过此值(如使用 Jumbogram),此字段设为 0,并使用 Hop-by-Hop 扩展头部中的超大有效载荷选项。

  • 不包括 IPv6 头部本身(固定 40 字节)
  • 包括所有扩展头部和上层协议数据

下一头部 (Next Header)

8 位字段: 功能类似于 IPv4 的协议字段,但含义更广。

它可以是:

  • 上层协议类型(如 TCP=6, UDP=17)
  • 扩展头部的类型(如 Hop-by-Hop=0, Routing=43, Fragment=44)

IPv6 支持多个扩展头部,每个扩展头部也有自己的 Next Header 字段,形成链表结构。

常见 Next Header 值:

  • 0 - Hop-by-Hop Options
  • 6 - TCP
  • 17 - UDP
  • 43 - Routing
  • 44 - Fragment
  • 58 - ICMPv6
  • 59 - No Next Header

跳数限制 (Hop Limit)

8 位字段: 功能等同于 IPv4 的 TTL。

每经过一个路由器,Hop Limit 减 1。当减到 0 时,路由器丢弃数据包,并向源主机发送 ICMPv6 Time Exceeded 消息。

  • 默认初始值通常为 64
  • 防止数据包在网络中无限循环
  • IPv6 移除了头部校验和,路由器不再需要重新计算校验和,处理效率更高

源地址 (Source Address)

128 位字段 (16 字节): 标识发送方的 IPv6 地址。

格式:8 组 4 位十六进制数,用冒号分隔,如 2001:0db8:85a3:0000:0000:8a2e:0370:7334

  • IPv6 地址空间巨大(2^128),解决了 IPv4 地址耗尽问题
  • 支持自动配置(SLAAC)和 DHCPv6
  • 地址类型:单播、多播、任播

目的地址 (Destination Address)

128 位字段 (16 字节): 标识接收方的 IPv6 地址。

路由器和接收方使用此地址进行转发和最终交付。

  • 支持多播地址(以 ff00::/8 开头)
  • 支持任播地址(从单播地址空间分配)
  • 链路本地地址(fe80::/10)用于本地网络通信

💡 IPv6 头部总结

  • 固定长度: 40 字节(320 位)
  • 字段数: 8 个字段(比 IPv4 简化)
  • 移除了: 头部校验和、标识/标志/片偏移字段
  • 新增: 流标签 (Flow Label)、扩展头部机制
  • 地址长度: 128 位(IPv4 的 4 倍)
  • 性能提升: 路由器无需重新计算校验和,转发效率更高

🔄 IPv4 vs IPv6 对比

特性 IPv4 IPv6
地址长度 32 位 128 位
头部长度 20-60 字节 固定 40 字节
校验和 有(头部)
分片处理 路由器可分片 仅源主机分片
选项支持 头部选项(可变) 扩展头部(链式)
广播支持 无(用多播代替)