网络层、IP 数据报、网络接口与逐跳转发机制:一个数据报的完整旅程

本文系统剖析IP数据报在网络层的完整生命周期:从网络层的无连接、尽力而为服务模型,到IPv4/IPv6首部结构与校验机制;深入分片原理与工程代价;详解CIDR、DHCP、NAT等地址管理机制;重点阐述逐跳转发核心——转发表构建、最长前缀匹配(LPM)算法及路由器内部数据通路;并结合ARP解析、直接/间接交付、traceroute原理,还原端到端传输中IP与MAC地址的协同机制。

一、网络层在做什么:转发、路由与"尽力而为"

1.1 两个永远不要混淆的功能

网络层最重要的一课,是先分清这对概念:

维度 转发 Forwarding 路由选择 Routing
关注范围 单台路由器本地 整个网络、端到端路径
动作 把分组从入链路搬到出链路 计算并维护到达各目的网络的路径
时间尺度 每包执行一次,纳秒 ~ 微秒级 秒 ~ 分钟级(拓扑变化 / 周期更新)
实现 硬件(输入端口 ASIC / TCAM) 软件(控制平面进程与协议)
使用协议 无协议,只是动作 OSPF、BGP、RIP、IS-IS
所属平面 数据平面 data plane 控制平面 control plane

路由器一生只做两件事:按转发表转发(数据平面),维护转发表(控制平面)。转发表决定"这包往哪走",路由协议决定"表怎么写"。任何"路由器算法"的讨论,先分清是在哪一面——这是网络层最容易混的一点。

数据平面 data plane(纳秒级 · 硬件 · 单机本地)

控制平面 control plane(秒~分钟级 · 软件 · 全网络视角)

算出路径,写进表

路由选择算法
OSPF / BGP / RIP

转发表 FIB

最长前缀匹配
→ 从接口转发出去

路由器无连接状态:每个分组独立转发

1.2 为什么 IP 敢"无连接"

  • 建立连接需要路由器记住"谁和谁通信"的状态——10⁹ 主机规模下这条状态不可扩展;
  • 因此 IP 连握手都不做:每个数据报独立寻址、独立转发、独立处理;
  • 路由器无状态换来互联网的伸缩性;代价是顺序、丢失、时延、带宽都不保证。

1.3 服务模型:best effort(五无)

不保证 后果 谁补偿
不保交付 分组可能丢 TCP 重传 / 应用层
不保顺序 后发先至 TCP 序号重排
不保带宽 拥塞时大家公用 QoS / 拥塞控制
不保时延 排队不可预期 应用设计容忍
不保安全 明文可嗅探篡改 TLS / IPsec

推论:网络层越"哑",头上叠加的东西越丰富(TCP、QUIC、TLS、DNS 都在迁就这个哑网络)。SDN 与 ICN 等新范式试图改的是"控制面在哪",暂时都没有推翻 best-effort 本身。

1.4 控制平面的两种组织方式

传统 per-router 逻辑集中式(SDN)
路由算法运行在 每台路由器各自 远端控制器
邻居关系 路由器之间 控制器与设备(OpenFlow 等)
表项下发 本地生成 控制器计算后推送
数据平面 转发表 + 匹配 不变(仍然是匹配 + 动作)
代表 OSPF/BGP 自组网 OpenFlow、P4 可编程转发

💡 关键认知:SDN 是控制平面搬家,不是数据平面变法。转发的物理动作(查表、排队、交换)两种模式完全一样。


二、IP 数据报格式:IPv4 首部逐字段解剖

IPv4 数据报 = 20 字节固定首部 + 选项(0–40 字节)+ 数据载荷。所有字段按大端(网络字节序)排列,32 位对齐。

2.1 首部十三字段总表

# 字段 位 作用 每跳是否变化
1 Version 4 协议版本,IPv4 = 0100 否
2 IHL 4 首部长度(32 位字为单位),无选项 = 5(20 B) 否
3 DSCP / ECN 6 + 2 差分服务标记 / 显式拥塞通知 否(ECN 可被中间件写)
4 Total Length 16 首部 + 数据总字节数,最大 65535 分片时变
5 Identification 16 源主机生成的 ID,同源分片共用同一 ID 否(重组依据)
6 Flags 3 bit0 保留 / bit1 DF 禁止分片 / bit2 MF 后续还有片 分片时变
7 Fragment Offset 13 本片数据相对原始数据报偏移,单位 8 字节 分片时变
8 TTL 8 寿命,每跳 −1,归零即丢弃并回 ICMP Time Exceeded 是
9 Protocol 8 6 = TCP,17 = UDP,1 = ICMP,89 = OSPF 否
10 Header Checksum 16 只覆盖首部,16 位反码和 是
11 Source IP 32 源接口地址 否(NAT 改写除外)
12 Destination IP 32 目的接口地址 否(NAT 改写除外)
13 Options 0–40 宽松源路由、记录路由、时间戳(现实罕见) 否

数值实例:一个携带 2380 B 数据的 IPv4 数据报,Total Length = 2400 = 0x0960,Version = 0100,IHL = 0101,ID = 0x1A2B,TTL = 64,Protocol = 6(TCP)。

📌 每跳只动两个字段:TTL(递减)与 Header Checksum(重算)。TTL 每跳必变、变就要重算校验和——这一对"连体婴"是理解 IPv4/IPv6 设计差异的钥匙。

2.2 Checksum 算法(三步)

  1. 把首部按 16 位字分组,做反码和(进位回卷到低位);
  2. 结果取反,写入 Checksum 字段;
  3. 接收方对首部所有 16 位字求和(含 Checksum 本身),结果应为全 1(0xFFFF)即通过。

⚠️ 典型误解:“IP checksum 保证数据没坏”。不对:

  • 它只覆盖首部,载荷的正确性由 TCP/UDP 校验和(端到端)+ 链路层 CRC-32(每跳)兜底;
  • 它只防偶然位错,不防恶意篡改(无密钥无认证);
  • 为什么每跳重算:因为 TTL 每跳必变,首部变了校验和就得跟着变——这也正是 IPv6 把 IP 层校验删掉的理由之一(链路层已经校验过一轮,端到端有 L4 把关)。

2.3 IPv6:把 IPv4 三十年的补丁烧进格式

IPv6 固定 40 字节首部,字段数从 13(+可变选项)降到 8:

IPv6 字段 位 IPv4 对应 / 变化
Version 4 同,值 = 6
Traffic Class 8 ≈ DSCP + ECN
Flow Label 20 新增:给"流"打 QoS 直通标签
Payload Length 16 只计载荷(不含 40 B 首部)
Next Header 8 = Protocol,兼指扩展首部
Hop Limit 8 = TTL
Source / Destination 128 / 128 32 → 128 位

删掉四样东西、每样都有明确动机:

删除项 动机
Header Checksum 每跳重算是 ASIC 昂贵操作;CRC + L4 已足够
路由器分片能力 改为 PMTUD:路由器回 ICMPv6 Packet Too Big,源主机自己按需分
IHL + Options 字段 固定 40 B = 硬件定长线速解析;高级特性放扩展首部
广播 改用组播做邻居发现(Neighbor Discovery)

⚠️ 常见误读:“IPv6 不分片”。准确说法:IPv6 路由器不分片;分片只由源主机发起、且只针对扩展首部(分片扩展头)。


三、IP 分片与重组:数据报的"切分手术"

3.1 为什么要分片:链路 MTU 不一致

MTU(Maximum Transmission Unit)= 一个链路层帧能承载的最大 IP 数据报:

链路 MTU(字节)
Ethernet(以太网) 1500
PPPoE(家用宽带拨号) 1492
FDDI 4352
Token Ring 4464
X.25 576

一个 1500 B 的标准数据报进得了以太网,进不了 PPPoE,更进不了 X.25。如果要走的路里有一段 MTU 小于数据报,就必须在入口切开。

MTU ≥ 2400

MTU = 700

原始数据报
2400 B = 20 B 头 + 2380 B 数据

下一跳链路 MTU
装得下吗?

<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

reset2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值