IPv4 与 IPv6:网络层的寻址与路由
本文是《计算机网络学习笔记》系列的第八篇。前几篇讲了应用层(HTTP、DNS)和传输层(TCP、TLS),现在往下走一层——网络层。IP 协议是整个互联网的核心,它负责把数据包从源头送到目的地,跨越无数中间路由器。本文深入拆解 IPv4 和 IPv6 的协议格式,并讲清楚 NAT、分片、TTL 等关键机制。
一、网络层的职责
传输层(TCP/UDP)只关心端到端的两个进程之间的通信,它不知道中间经过了多少台路由器、走了哪条路。网络层负责的正是这件事:
主机 A ──► 路由器1 ──► 路由器2 ──► … ──► 主机 B
IP 负责在每一跳做出转发决策网络层的两个核心功能:
- 转发(Forwarding):路由器收到一个数据包,查表决定从哪个端口发出去(数据平面);
- 路由(Routing):路由器之间互相通信,计算出最优路径,填充转发表(控制平面,由 OSPF/BGP 等路由协议实现)。
IP 协议是网络层的核心,但它是尽力而为(Best Effort)的:不保证送达,不保证顺序,不保证不重复。可靠性由上层的 TCP 负责。
二、IPv4 协议格式详解
IPv4 数据报头部至少 20 字节,如果携带选项则最长 60 字节。
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(4)| IHL(4) | TOS / DS (8) | Total Length (16) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification (16) |Flags(3)| Frag Offset(13)|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| TTL (8) | Protocol (8) | Header Checksum (16) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source IP Address (32) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination IP Address (32) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options (0~40 bytes) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+版本(Version)— 4 位
值为 4,表示 IPv4。路由器看到这个字段,才知道如何解析后续字段。
首部长度(IHL,Internet Header Length)— 4 位
以 4 字节为单位。最小值 5(= 20 字节,无选项),最大值 15(= 60 字节)。接收方通过这个字段知道数据从哪里开始。
服务类型(TOS / DS)— 8 位
这个字段有历史包袱,新旧标准不同:
现代标准(Differentiated Services,DS 字段):
前 6 位:DSCP(差分服务代码点),标记数据包的优先级和处理方式:
EF(Expedited Forwarding):加速转发,用于语音/视频等实时业务,路由器优先处理;AF(Assured Forwarding):确保转发,按等级保证转发,适合企业级业务;BE(Best Effort):尽力而为,普通流量,不做特殊处理;
- 后 2 位:ECN(显式拥塞通知),路由器快满了时主动打标记,通知端到端降速,是 TCP 拥塞控制的网络层辅助(详见第4篇)。
数据包总长度 — 16 位
首部 + 数据的总字节数。理论最大 65535 字节,但实际上受限于链路层 MTU(以太网为 1500 字节),极少超过 1500 字节。
标识、标志、片偏移 — 共 32 位(分片三件套)
这三个字段共同支撑 IP 分片机制(详见下一节):
- 标识(Identification,16 位):同一个原始数据报的所有分片拥有相同的标识,接收端据此拼装;
标志(Flags,3 位):
DF(Don't Fragment):置 1 表示禁止分片,路由器若无法转发则丢弃并返回 ICMP 错误;MF(More Fragments):置 1 表示后面还有分片,最后一个分片的 MF=0;
- 片偏移(Fragment Offset,13 位):本分片数据在原始数据报中的位置,单位为 8 字节。
TTL(Time To Live)— 8 位
防止数据包在网络里无限循环的保障字段。
每经过一台路由器,TTL 减 1。当 TTL 减到 0 时,路由器丢弃该数据包,并向发送方返回一个 ICMP Time Exceeded 报文——"你的包死在我这里了"。
traceroute 的原理正是利用了这一机制:发送一系列 TTL 依次为 1、2、3… 的数据包,第 1 个在第 1 跳路由器被丢弃并返回 ICMP,第 2 个在第 2 跳被丢弃……这样就能逐步探测出路径上的每一台路由器。
常见默认 TTL 值:
- Linux:64
- Windows:128
- 网络设备(Cisco):255
协议(Protocol)— 8 位
分用字段,告诉接收端的 IP 层,剥掉 IP 头之后,里面的数据交给哪个上层协议:
| 值 | 协议 |
|---|---|
| 1 | ICMP(ping、traceroute、差错报告) |
| 6 | TCP |
| 17 | UDP |
| 41 | IPv6(6in4 隧道,在 IPv4 包里封装 IPv6) |
| 89 | OSPF(路由协议,运行在 AS 内部) |
首部检验和 — 16 位
只校验 IP 首部,不校验数据部分(数据的校验由 TCP/UDP 各自负责)。
每经过一台路由器,TTL 字段会变化,因此路由器必须重新计算并更新检验和。这在高速转发场景下是一笔不小的计算开销。
IPv6 直接删除了这个字段——现代链路层(以太网)本身已有 CRC 校验,加上硬件越来越可靠,IP 层再做一遍校验意义不大。
源地址 / 目的地址 — 各 32 位
发送方和接收方的 IPv4 地址,人类读写时用点分十进制表示(如 192.168.1.1)。
选项 — 0~40 字节
现实中几乎不用,在 IPv6 中被彻底删除。
三、IP 分片:当包太大时
不同类型的链路有不同的MTU(最大传输单元),以太网的 MTU 是 1500 字节。如果 IP 数据报超过了下一跳链路的 MTU,路由器就会把它切成若干个小片(Fragment)分别发送。
原始数据报(4000 字节)
→ MTU = 1500 字节
→ 分成 3 个分片:
分片1:20(IP头) + 1480(数据) = 1500 字节,MF=1,偏移=0
分片2:20(IP头) + 1480(数据) = 1500 字节,MF=1,偏移=185(185×8=1480)
分片3:20(IP头) + 1040(数据) = 1060 字节,MF=0,偏移=370重组发生在目的主机,而非中间路由器。一旦某个分片丢失,整个原始数据报都必须重传,因为 IP 层不做局部重传。
IPv6 的改变:IPv6 不允许中间路由器分片,发送方有责任事先探测路径 MTU(Path MTU Discovery),保证数据包不超过沿途最小 MTU。如果路由器收到太大的 IPv6 包,直接丢弃并返回 ICMP 差错报文,由发送方调小包大小重发。
四、NAT:IPv4 地址紧缺的权宜之计
IPv4 地址只有 32 位,理论上约 43 亿个。随着联网设备爆炸式增长,公网 IPv4 地址早已枯竭。NAT(Network Address Translation,网络地址转换) 是解决这个问题的权宜之计。
NAT 的工作原理
局域网内 路由器(NAT 设备) 公网
192.168.1.10:4321 ──► 修改源 IP+端口 ──► 1.2.3.4:8000 ──► 百度服务器
维护映射表
(192.168.1.10:4321 ↔ 1.2.3.4:8000)
百度服务器 ──► 1.2.3.4:8000 ──► 路由器查表 ──► 192.168.1.10:4321路由器维护一张 NAT 映射表,记录局域网 IP:端口与公网 IP:端口的对应关系。内网设备对外发包时,路由器把源地址改成公网 IP,并分配一个新端口;收到响应时,根据映射表再改回去转发给内网设备。
NAT 的代价:内网设备对外界"隐身"了——公网无法主动连入内网主机。这破坏了互联网"端到端(End-to-End)"的设计原则,也是 P2P 通信需要"打洞"的根本原因。
解决 NAT 穿透的方法:
- UPnP(Universal Plug and Play):路由器支持时,内网设备可主动请求路由器在 NAT 表中开一个洞;
- UDP 打洞(Hole Punching):借助公网服务器协调,让两个内网设备互相"打洞",实现直连(详见后续篇章)。
五、IPv6:下一代 IP 协议
IPv6 是 IPv4 的接班人,最大的改变是把地址空间从 32 位扩展到 128 位,提供约 3.4×10³⁸ 个地址——理论上地球上每一粒沙子都能分到几十亿个 IP 地址,彻底解决地址枯竭问题。
IPv6 协议格式
IPv6 头部固定 40 字节,相比 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(4)| Traffic Class (8) | Flow Label (20) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload Length (16) | Next Header(8)| Hop Limit(8) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Source Address (128 bits) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Destination Address (128 bits) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+| 字段 | 说明 |
|---|---|
| 版本 | 4 位,值为 6 |
| 流量类型 | 8 位,等同于 IPv4 的 TOS/DS 字段 |
| 流标签 | 20 位,标识同一个流的数据包,方便路由器做 QoS |
| 有效载荷长度 | 16 位,数据部分(不含 40 字节固定头)的长度 |
| 下一个首部 | 8 位,等同于 IPv4 的协议字段,指示上层是 TCP/UDP/ICMPv6 等 |
| 跳限制 | 8 位,等同于 IPv4 的 TTL |
| 源/目的地址 | 各 128 位(16 字节) |
IPv6 对比 IPv4 的主要改进
| 特性 | IPv4 | IPv6 |
|---|---|---|
| 地址长度 | 32 位(约 43 亿) | 128 位(约 3.4×10³⁸) |
| 头部长度 | 可变(20~60 字节) | 固定 40 字节 |
| 分片 | 路由器可以分片 | 只有发送方可以分片 |
| 首部检验和 | 有,每跳重算 | 无(减少路由器计算量) |
| 选项 | 有 | 无(改用扩展头) |
| NAT | 几乎必须 | 不需要(地址充足) |
| 广播 | 支持 | 不支持(改用多播) |
如何查看自己是否有公网 IPv6?
# Windows
ipconfig
# Linux / macOS
ip a
# 或
ifconfig注意:以 fe80:: 开头的是链路本地地址(Link-Local),只能在同一局域网内使用,不是公网 IPv6。
真正的公网 IPv6 地址以 2 开头:
2408:xxxx— 中国联通2409:xxxx— 中国移动240e:xxxx— 中国电信
IPv6 恢复了端到端通信
IPv4 + NAT 的架构破坏了互联网最初"每台主机都可以直接互访"的设计。IPv6 地址充足,每台设备都可以有真正的全球唯一公网地址,端到端(End-to-End)通信能力得以恢复——不再需要 NAT,不再需要打洞。
不过现实中 IPv6 的普及还面临几个阻碍:
- 企业内网设备大量不支持 IPv6;
- 家用路由器防火墙默认阻止外部的 IPv6 连接(需要手动配置放行规则);
- 国内运营商对 IPv6 的推广力度参差不齐。
IPv4 与 IPv6 哪个更快?
- 国内通信:IPv6 通常更快。IPv6 头部固定、无需 NAT 转换,路由器处理更简单;
- 跨国通信:IPv4 可能更快。IPv4 骨干网建设了几十年,路由优化更成熟,国际出口带宽也更充裕。
六、过渡方案:IPv6 over IPv4 隧道
在 IPv6 全面普及之前,网络上仍大量存在不支持 IPv6 的路由器,需要过渡方案。
6in4 隧道(Tunneling):把 IPv6 数据包整个封装进 IPv4 数据包的 payload,就像套娃一样穿越只懂 IPv4 的网络:
IPv6 主机 A ──► 边界路由器 B
B:把 IPv6 包封进 IPv4 包(协议字段=41)
──► 纯 IPv4 路由器 C ──► D(不懂 IPv6,当普通 IPv4 包转发)
边界路由器 E:解封,还原 IPv6 包
──► IPv6 主机 F协议字段 41 就是告诉接收端"我的 payload 是一个 IPv6 数据报",这也是为什么 IPv4 协议字段值 41 对应"IPv6"。
七、彩蛋:IPv5 去哪了?
IPv5 实际上是 ST 协议(Internet Stream Protocol),1979 年提出,专门为实时语音和视频传输设计,使用了版本号 5。但 ST 协议最终没有被广泛采用,败给了通用的 IPv4。
后来设计新一代 IP 协议时,版本号 5 已经被 ST"占用"了——即使 ST 从未流行,IANA 也不会重复分配版本号。于是新协议顺序跳过 5,直接命名为 IPv6。
总结
| IPv4 | IPv6 | |
|---|---|---|
| 地址空间 | 32 位,约 43 亿,已耗尽 | 128 位,近乎无限 |
| 头部 | 可变长(20~60B),含检验和 | 固定 40B,无检验和 |
| 分片 | 路由器可分片 | 仅发送方分片 |
| NAT | 必要,破坏端到端 | 不需要,恢复端到端 |
| 过渡 | 当前主流 | 普及进行中,6in4 隧道过渡 |
IP 协议是整个互联网"找路"能力的基础——没有 IP,TCP 不知道包该往哪发,HTTP 请求永远送不出去。理解了 IP,再回头看 traceroute 的输出、DNS 的解析结果、NAT 的工作过程,会有一种豁然贯通的感觉。
本系列前七篇:
· 第一篇:《TCP 协议格式详解》
· 第二篇:《TCP 三次握手与四次挥手》
· 第三篇:《TCP 可靠数据传输》
· 第四篇:《TCP 流量控制与拥塞控制》
· 第五篇:《TLS:HTTPS 背后的加密握手》
· 第六篇:《HTTP 协议进化史》
· 第七篇:《DNS:互联网的电话簿》
参考资料:《计算机网络:自顶向下方法》