一、网络层在做什么:转发、路由与"尽力而为"
1.1 两个永远不要混淆的功能
网络层最重要的一课,是先分清这对概念:
| 维度 | 转发 Forwarding | 路由选择 Routing |
|---|---|---|
| 关注范围 | 单台路由器本地 | 整个网络、端到端路径 |
| 动作 | 把分组从入链路搬到出链路 | 计算并维护到达各目的网络的路径 |
| 时间尺度 | 每包执行一次,纳秒 ~ 微秒级 | 秒 ~ 分钟级(拓扑变化 / 周期更新) |
| 实现 | 硬件(输入端口 ASIC / TCAM) | 软件(控制平面进程与协议) |
| 使用协议 | 无协议,只是动作 | OSPF、BGP、RIP、IS-IS |
| 所属平面 | 数据平面 data plane | 控制平面 control plane |
路由器一生只做两件事:按转发表转发(数据平面),维护转发表(控制平面)。转发表决定"这包往哪走",路由协议决定"表怎么写"。任何"路由器算法"的讨论,先分清是在哪一面——这是网络层最容易混的一点。
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 算法(三步)
- 把首部按 16 位字分组,做反码和(进位回卷到低位);
- 结果取反,写入 Checksum 字段;
- 接收方对首部所有 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 小于数据报,就必须在入口切开。

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

被折叠的 条评论
为什么被折叠?



