IPv4 报文头有哪些关键字段?TTL、协议号和头部校验和有什么用?
简化版
IPv4 报文头最核心的字段包括:源 IP、目的 IP、TTL、Protocol、Total Length、Identification、Flags、Fragment Offset、Header Checksum 等。面试回答时要抓住三点:目的 IP 决定报文往哪里转发,TTL 防止报文在网络里无限循环,Protocol 告诉接收端上层交给 TCP、UDP 还是 ICMP。IPv4 头部校验和只校验 IP 头,不校验数据部分;每经过一个路由器 TTL 会减 1,所以头部校验和也要重新计算。
详细版
IPv4 头部最小 20 字节,最大 60 字节。常见字段可以按功能分组:
| 字段 | 作用 |
|---|---|
| Version | IP 版本,IPv4 为 4 |
| IHL | 头部长度,单位是 4 字节 |
| Total Length | IP 报文总长度,包含头部和数据 |
| Identification / Flags / Fragment Offset | 分片与重组相关 |
| TTL | 生存时间,每过一跳减 1,减到 0 丢弃 |
| Protocol | 上层协议号,例如 TCP=6、UDP=17、ICMP=1 |
| Header Checksum | IPv4 头部校验和 |
| Source IP / Destination IP | 源地址和目的地址 |
TTL 的作用不是精确表示时间,而是限制最多经过多少跳;Protocol 字段用于解封装,例如目的主机看到 Protocol=6 就把负载交给 TCP;头部校验和只保护 IPv4 头部,因为链路层和传输层各自还有校验机制。
完整版教学
一、IPv4 头部解决的是什么问题
网络层的核心任务是把数据包从源主机送到目的主机。IPv4 头部就是这张“运输单”,里面至少要说明:
- 这个包从哪里来:源 IP;
- 这个包要到哪里去:目的 IP;
- 这个包还能被转发多少跳:TTL;
- 负载交给哪个上层协议:Protocol;
- 这个包是否被分片,以及如何重组:Identification、Flags、Fragment Offset。
IPv4 头部最小 20 字节。它不保证可靠传输,不保证顺序,也不负责重传;这些通常由 TCP 等上层协议完成。IP 层负责的是尽力而为的转发。
二、先记住 IPv4 头部的整体结构
面试不要求逐位背图,但要能说出核心字段和用途:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+----+----+--------+-----------------------------------------------+
|Ver | IHL| DSCP | Total Length |
+------------------+-----+-----------------------------------------+
| Identification |Flg | Fragment Offset |
+------------------------+----+--------------------------------------+
| TTL | Protocol | Header Checksum |
+---------------------------------------------------------------+
| Source IP Address |
+---------------------------------------------------------------+
| Destination IP Address |
+---------------------------------------------------------------+
| Options... |
+---------------------------------------------------------------+
常问的是:TTL、Protocol、分片字段、校验和、源/目的 IP。能把这些字段串成“转发、解封装、分片、防环路”四个关键词,回答就比较完整。
三、TTL:不是时间,而是跳数上限
TTL 全称 Time To Live,但在现代 IP 转发里更常理解为最大跳数限制。每经过一个三层设备,TTL 减 1;如果减到 0,路由器丢弃该报文,并通常返回 ICMP Time Exceeded。
例如一个包的初始 TTL 为 64:
主机A TTL=64 -> 路由器1 TTL=63 -> 路由器2 TTL=62 -> ...
TTL 的意义有两个:
- 防止路由环路导致报文永远在网络里转;
- 支撑
traceroute这类工具,通过逐步增加 TTL 观察每一跳返回的 ICMP 报文。
TTL 不表示“这个包能活多少秒”,面试里把它说成跳数限制更准确。
四、Protocol:告诉目的主机负载交给谁
IP 报文到达目的主机后,内核需要知道 IP 负载应该交给哪个上层模块。这个信息由 Protocol 字段提供:
| Protocol 值 | 上层协议 |
|---|---|
| 1 | ICMP |
| 6 | TCP |
| 17 | UDP |
比如浏览器访问 HTTPS,底层可能是:
以太网帧 -> IPv4(Protocol=6) -> TCP(443) -> TLS -> HTTP
这里 Protocol=6 只说明 IP 负载是 TCP,具体应用端口由 TCP 头部里的端口号决定。也就是说,IP 头负责“交给 TCP/UDP/ICMP”,传输层头部再负责“交给哪个进程或服务”。
五、Total Length、IHL 和 Options:怎么算包的大小
IPv4 的 IHL 表示 IP 头部长度,单位是 4 字节。没有 Options 时,IHL=5,也就是 20 字节;有 Options 时会更长,最大 60 字节。
Total Length 表示整个 IPv4 报文长度,包含 IP 头和数据。比如:
IHL = 5 -> IP头 20 字节
Total Length = 1500
IP负载长度 = 1500 - 20 = 1480 字节
这也是为什么 MTU、MSS、分片问题经常和 IP 头部一起考:链路层能承载的最大 IP 报文长度受 MTU 限制,如果 IP 报文超过路径 MTU,就可能被分片或被丢弃。
六、分片字段:Identification、Flags、Fragment Offset
IPv4 支持在网络层分片。三个字段最关键:
- Identification:同一个原始 IP 报文的所有分片使用相同标识;
- Flags:包含 DF 和 MF,DF 表示不要分片,MF 表示后面还有分片;
- Fragment Offset:当前分片在原始报文中的偏移,单位是 8 字节。
一个大的 IP 报文被分成多个分片后,目的主机会根据 Identification 和 Fragment Offset 重组。如果任意一个分片丢失,整个原始报文都无法重组成功。
这也是工程上通常希望避免 IP 分片的原因:分片增加丢包放大、重组开销和排障难度。
七、Header Checksum:只校验头部,而且每跳会变
IPv4 头部校验和只覆盖 IP 头部,不覆盖数据部分。因为 TTL 每经过一个路由器都会变化,所以 Header Checksum 也要随之更新。
为什么不校验数据部分?可以从分层理解:
- 链路层通常有 FCS 检测帧错误;
- TCP/UDP 有自己的校验和覆盖传输层头和数据;
- IPv4 头部校验和只负责发现 IP 头部在传输中是否损坏。
IPv6 直接移除了头部校验和,一个原因就是减少路由器每跳处理成本,把端到端校验更多交给传输层和链路层。
八、常见误区与追问
- 误区:TTL 表示报文能存活多少秒。 现代网络中 TTL 更应理解为最多经过多少跳,每经过一个路由器减 1。
- 误区:Protocol 字段表示应用层协议。 Protocol 表示 IP 负载交给 TCP、UDP、ICMP 等哪一个上层协议,不表示 HTTP 或 DNS。
- 误区:IPv4 头部校验和会校验整个数据包。 它只校验 IPv4 头部,数据部分由链路层或传输层校验机制负责。
- 误区:IHL 就是整个 IP 包长度。 IHL 是头部长度,Total Length 才是 IP 报文总长度。
- 追问:为什么 TTL 变化后校验和也要变化? 因为 TTL 属于 IPv4 头部字段,头部内容变了,头部校验和必须重新计算。
- 追问:TCP 和 UDP 是靠哪个字段区分的? IPv4 头部的 Protocol 字段区分上层协议,TCP 是 6,UDP 是 17。
九、加强记忆
IPv4 头部可以按四条主线记:转发看目的 IP,防环路看 TTL,解封装看 Protocol,分片重组看 Identification/Flags/Offset。IHL 表示头部长度,Total Length 表示整个 IP 报文长度,Header Checksum 只校验 IPv4 头部。面试回答时不要逐字段硬背,而是把字段放回转发流程:路由器按目的 IP 查路由,转发时 TTL 减 1 并更新校验和,目的主机根据 Protocol 把负载交给 TCP、UDP 或 ICMP。