本文是《计算机网络学习笔记》系列的第八篇。前几篇讲了应用层(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 头之后,里面的数据交给哪个上层协议:

协议
1ICMP(ping、traceroute、差错报告)
6TCP
17UDP
41IPv6(6in4 隧道,在 IPv4 包里封装 IPv6)
89OSPF(路由协议,运行在 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 的主要改进

特性IPv4IPv6
地址长度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


总结

IPv4IPv6
地址空间32 位,约 43 亿,已耗尽128 位,近乎无限
头部可变长(20~60B),含检验和固定 40B,无检验和
分片路由器可分片仅发送方分片
NAT必要,破坏端到端不需要,恢复端到端
过渡当前主流普及进行中,6in4 隧道过渡

IP 协议是整个互联网"找路"能力的基础——没有 IP,TCP 不知道包该往哪发,HTTP 请求永远送不出去。理解了 IP,再回头看 traceroute 的输出、DNS 的解析结果、NAT 的工作过程,会有一种豁然贯通的感觉。


本系列前七篇:
· 第一篇:《TCP 协议格式详解》
· 第二篇:《TCP 三次握手与四次挥手》
· 第三篇:《TCP 可靠数据传输》
· 第四篇:《TCP 流量控制与拥塞控制》
· 第五篇:《TLS:HTTPS 背后的加密握手》
· 第六篇:《HTTP 协议进化史》
· 第七篇:《DNS:互联网的电话簿》


参考资料:《计算机网络:自顶向下方法》

标签: none

添加新评论