IPv4 头里有什么
IPv4 报文头最小 20 字节,承载寻址与转发所需的全部信息:谁发的、发给谁、上层是什么协议、还能走几跳、是否被分片。抓包工具与设备日志里出现的字段几乎都出自这张表,读懂它才能解释 TTL 异常、分片丢失与协议号不匹配这类问题。
基本信息
| 固定长度 | 20 字节;带选项最多 60 字节 |
|---|---|
| 规范 | RFC 791;DSCP 定义见 RFC 2474 |
| 校验范围 | 仅头部,不含数据 |
| 抓包命令 | tcpdump -nn -v、Wireshark 展开 IPv4 树 |
字段逐个看
| 字段 | 长度 | 作用 |
|---|---|---|
| 版本 | 4bit | 固定为 4 |
| 首部长度 | 4bit | 以 4 字节为单位,最小值 5 |
| DSCP/ECN | 8bit | 服务质量标记与拥塞标记 |
| 总长度 | 16bit | 头部加数据,最大 65535 字节 |
| 标识 ID | 16bit | 分片重组时同一原始报文的组号 |
| 标志与片偏移 | 3bit + 13bit | DF 禁止分片、MF 还有后续,偏移以 8 字节计 |
| TTL | 8bit | 每经一跳减一,减到 0 丢弃并回 ICMP |
| 协议号 | 8bit | 上层协议,6 为 TCP、17 为 UDP、1 为 ICMP |
| 首部校验和 | 16bit | 只校验头部,每跳重算 |
| 源与目的地址 | 各 32bit | 源与目的 IPv4 地址 |
抓头部与看字段
抓头部与看字段
tcpdump -nn -v -c 2 'ip' | head -20 # 打印 TTL、协议号、长度
tcpdump -nn -v 'icmp' -c 3 # 协议号为 1 的报文
tcpdump -nn 'ip[8] < 5' -c 5 # 抓 TTL 小于 5 的包,定位环路
ss -tan | head # 结合本机连接视角看同一批流量常见取值读法
| 字段 | 典型值 | 异常表现 |
|---|---|---|
| TTL | Linux 64、Windows 128、网络设备 255 | 远小于常见初值说明路径很长或被做了 TTL 改写 |
| 协议号 | 1 ICMP、6 TCP、17 UDP、47 GRE、50 ESP、89 OSPF | 设备丢弃不认识的协议号会表现为静默丢包 |
| 总长度 | 不超过出接口 MTU | 超过 MTU 且 DF 置位会触发 ICMP 需要分片 |
典型使用场景
- 解释「ping 通但服务不通」:协议号与端口组合不同,路径策略也不同
- 定位路由环路:观察 TTL 快速衰减与 ICMP 超时报文
- 核对分片行为:结合 ID、MF 与偏移判断报文是否被拆分
- 排查 MTU 黑洞:总长度与 DF 标志是判断依据
- 分析多路径差异:同一目标不同出口的 TTL 初值不一致,说明路径不对称
IPv4 首部校验和只覆盖头部,数据完整性由 TCP 或 UDP 校验和负责。两者分工不同,看到「IP 校验和正确但数据损坏」并不矛盾。