IPv4 报文头部格式
IPv4 头部固定 20 字节(160 位),包含 14 个字段
版本 (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)
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 Options6- TCP17- UDP43- Routing44- Fragment58- ICMPv659- 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 字节 |
| 校验和 | 有(头部) | 无 |
| 分片处理 | 路由器可分片 | 仅源主机分片 |
| 选项支持 | 头部选项(可变) | 扩展头部(链式) |
| 广播支持 | 有 | 无(用多播代替) |