计算机网络学习站

kp-012 · 03-网络层与路由

IP 数据报格式、分片与转发

核心 约 30 分钟 IP 数据报TTL分片路由表
我的进度:

注:本文基于模型知识整理,建议结合权威教材与 RFC 原文核对细节。

一句话定义

IP 数据报是网络层的传输单元,由 20 字节固定首部、可选字段与数据构成;报文超过链路 MTU 时沿途路由器将其分片,而每台路由器依据路由表对每个报文独立做出「从哪个接口发给哪个下一跳」的转发决策。

为什么重要

读懂首部才能读懂抓包:排查连通性看 TTL,判断上层协议归属看协议字段,分析大包丢失要看分片字段。转发流程则是理解 traceroute、路由环路、默认网关等现象的底层模型——几乎所有网络层故障,最终都会落到「路由表里为什么没有这条前缀」或「TTL 为什么归零」这两个问题上。

前置知识

建议先读 kp-010《IPv4 地址体系与分类编址》,理解目的地址与网络前缀的关系;建议同时掌握 kp-011 的掩码按位与运算,并了解以太网帧与 MAC 地址的基本概念。

核心概念

IPv4 首部(RFC 791)字段逐个看:

  • 版本(4 位):恒为 4,收端据此解释后续字节。
  • 首部长度 IHL(4 位):以 4 字节为单位,无选项时取 5,即 20 字节;最大 15 对应 60 字节。
  • 区分服务(8 位):标记报文的服务质量等级,供沿途设备做差异化处理。
  • 总长度(16 位):首部加数据的总字节数,上限 65535。
  • 标识(16 位):同一数据报的所有分片携带相同标识,供目的端归组重组。
  • 标志(3 位):保留位、DF(不得分片)、MF(后面还有分片)。
  • 片偏移(13 位):本片数据在原报文数据区中的位置,以 8 字节为单位。
  • 生存时间 TTL(8 位):每经过一台路由器减 1,减到 0 即丢弃并向源回 ICMP 超时报文。
  • 协议(8 位):上层协议号,TCP 为 6,UDP 为 17,ICMP 为 1。
  • 首部校验和(16 位):仅覆盖首部,检测首部在传输中的差错。
  • 源地址与目的地址(各 32 位):未经 NAT 时端到端保持不变。

路由表条目三类:直连路由(接口所在网段自动生成)、静态路由(管理员手工配置)、默认路由(0.0.0.0/0,任何地址都能命中的兜底条目);动态路由协议(RIP、OSPF、BGP 等,见 kp-014 与 kp-015)学习来的路由也写入同一张表参与匹配。

图示

IPv4 首部(每行 32 位)

 0      4       8              16     19             31
+------+-------+--------------+------+--------------+
| 版本 | IHL   |   区分服务    |      总长度 16 位     |
+------+-------+------+-------+---------------------+
|        标识 16 位     |保留/DF/MF|    片偏移 13 位    |
+------+------+-------+----------+------------------+
|  TTL 8 位    | 协议 8 位   |    首部校验和 16 位     |
+--------------+-------------+-----------------------+
|                   源 IP 地址 32 位                   |
+-----------------------------------------------------+
|                  目的 IP 地址 32 位                  |
+-----------------------------------------------------+
无选项时首部共 20 字节;协议字段:TCP=6,UDP=17,ICMP=1

跨两跳转发:IP 地址不变,MAC 地址每跳更换

 A(192.168.1.10)      R1                 R2               B(192.168.3.20)
      |   帧: 源MAC=A   |                  |                 |
      |   目的MAC=R1左  |                  |                 |
      |  TTL=64        |                  |                 |
      |--------------->|  帧: 源MAC=R1右  |                 |
      |                |  目的MAC=R2左    |                 |
      |                |  TTL=63          |                 |
      |                |----------------->|  帧: 源MAC=R2右 |
      |                |                  |  目的MAC=B      |
      |                |                  |  TTL=62         |
      |                |                  |---------------->|

原理与机制

首部校验和为什么逐跳重算:TTL 每跳减 1,首部字节变了,原校验和必然失效,路由器必须重新计算后才转发;只校验首部不校验数据,是把开销控制在每跳可承受的范围内。TTL 防环的机理:路由配置错误可能形成环路,报文将无限兜圈,TTL 给每个报文设定寿命上限,宁可丢弃也不允许永久占用网络资源。分片机制:当出接口 MTU 小于报文长度且未置 DF 时,路由器把数据切成多片,各片独立成为 IP 报文——标识相同便于归组,MF 指示后面还有片,片偏移记录位置,目的端据此重装。重组只在目的端:中间路由器若参与重组,需要为每个流维护缓存与定时器,开销巨大;且分片可能经不同路径、乱序到达,只有目的端保证集齐全部片。置了 DF 的报文遇到更小的 MTU 出口会被丢弃并回送 ICMP 差错,发送方据此逐步探测路径上最小的 MTU,即路径 MTU 发现(Path MTU Discovery, PMTUD)。转发决策流程:取出目的地址,逐条计算「目的地址按位与掩码是否等于网络前缀」,收集所有命中项后选前缀最长者;若无命中则查默认路由,连默认路由也不存在就丢弃报文并向源发 ICMP 终点不可达。

实例分析

跨两跳路由器的完整转发:主机 A(192.168.1.10/24,网关 192.168.1.1)访问主机 B(192.168.3.20/24),路径为 A 至 R1(左口 192.168.1.1、右口 10.0.0.1),R1 至 R2(左口 10.0.0.2、右口 192.168.3.1),R2 至 B。第一跳:A 比较目的地址与自身掩码,发现不同网段,把帧发给网关,目的 MAC 是 R1 左口(A 先 ARP 网关获得),报文 TTL 为 64。第二跳:R1 查表得下一跳 10.0.0.2,帧从右口发出,源 MAC 变为 R1 右口、目的 MAC 变为 R2 左口,TTL 减为 63。第三跳:R2 命中直连路由,ARP 得到 B 的 MAC 后送达,TTL 减为 62。三跳中源、目的 IP 始终是 192.168.1.10 与 192.168.3.20,而 MAC 每一跳都被重写——IP 端到端、MAC 逐链路,这是网络层最重要的不变量。分片算例:报文总长 4000 字节(数据 3980 字节),出口 MTU 1500,每片最多装 1480 字节数据,切成三片:第一片偏移 0、MF 为 1;第二片偏移 185(1480 除以 8)、MF 为 1;第三片数据 1020 字节、偏移 370(2960 除以 8)、MF 为 0。

常见误区

  • 以为 TTL 防环是「精确纠正路由」:它不修复错误,只在环路发生时保证报文有寿命上限。
  • 以为重组可能发生在中间路由器:标准设计里只有目的端重组,中间路由器只管继续转发分片。
  • 忽略片偏移以 8 字节为单位:直接拿字节数填偏移字段会算错。
  • 以为 IP 地址会随转发改变:未经 NAT 时改的只有链路层地址与 TTL,IP 首部的两端地址不变。

自测题

  1. IHL 字段为什么必须存在?

答案要点:IPv4 首部含可选字段、长度可变,IHL 以 4 字节为单位标明首部实际长度,取值 5 表示 20 字节的标准首部。

  1. 报文总长 64536 字节、出口 MTU 1500 且未置 DF,路由器会怎么处理?

答案要点:超出 MTU 即分片,按每片最多 1480 字节净荷切割,各片携带相同标识,除最后一片外 MF 置 1,片偏移按 8 字节为单位填写。

  1. TTL 减到 0 时由谁处理、发什么消息?

答案要点:当前路由器丢弃报文并向源发 ICMP 超时报文;traceroute 正是利用这一机制逐跳探测路径。

  1. 为什么重组只在目的端进行?

答案要点:中间路由器重组需维护缓存与定时器、开销大;且分片可能经不同路径乱序到达,只有目的端必然集齐全部片。

  1. 转发时没有任何路由条目命中怎么办?

答案要点:先查默认路由 0.0.0.0/0;若默认路由也不存在,则丢弃报文并向源发 ICMP 终点不可达。

延伸阅读

  • RFC 791《Internet Protocol》
  • RFC 1191《Path MTU Discovery》
  • 谢希仁《计算机网络》