IP 协议、路由与 NAT 深度解析:IPv4/IPv6、子网划分、路由表与地址转换

深度讲解 IP 层的协议原理与工程实践:IP 报文结构与分片、IPv4 与 IPv6 对比、子网划分与 CIDR、路由原理(静态路由、OSPF、BGP)、NAT/SNAT/DNAT 地址转换、ICMP 与 ARP、常见避坑与排障指南。

TCP 之上承载一切,而 IP 则承载 TCP。无论 HTTP、gRPC 还是 WebSocket,数据最终都要被打包成 IP 报文穿越网络。很多工程师熟悉 TCP 三次握手、熟悉 HTTP 状态码,却对 IP 层的分片、路由、NAT、ICMP 一知半解——而这正是排查"网络超时、地址不可达、MTU 黑洞"等疑难杂症的钥匙。本指南讲透 IP 协议、路由与 NAT 的核心原理与工程实践。

关键概念:IP(Internet Protocol)是"尽力而为"的无连接网络层协议,负责寻址、分片与路由。它不保证可靠,可靠性交给上层的 TCP。路由决定"报文往哪走",NAT 解决"私网地址如何访问公网"。


一、IP 报文与分片

1.1 IPv4 报文头

IPv4 报文头(20 字节固定 + 可选):
  Version(4bit)  IHL(4bit)  Type of Service(8bit)  Total Length(16bit)
  Identification(16bit)  Flags(3bit)  Fragment Offset(13bit)
  Time To Live(8bit)  Protocol(8bit)  Header Checksum(16bit)
  Source Address(32bit)  Destination Address(32bit)

关键字段:
  - TTL:每经过一个路由器减 1,为 0 即丢弃 → 防止环路
  - Protocol:上层协议号(6=TCP,17=UDP,1=ICMP,89=OSPF)
  - Identification/Flags/Offset:分片重组的三个字段
  - Total Length:总长度上限 65535 字节(IP 本身不关心 MTU)

1.2 分片与重组

网络链路有 MTU(最大传输单元,以太网默认 1500 字节)。当报文大于 MTU 且 DF 位未置位,路由器会分片:

分片流程:
  1. 报文 5000 字节 > MTU 1500 → 分成 4 片
  2. 每片是独立 IP 报文,携带相同 Identification
  3. Fragment Offset 标记每片在原报文中的位置(以 8 字节为单位)
  4. 接收端按 Identification + Offset 重组

DF 位(Don't Fragment):
  - DF=1 时禁止分片 → 若超过 MTU 则丢弃并回 ICMP 错误
  - 常见坑:VXLAN/隧道场景下 DF=1 + MTU 未调整 → 大包静默丢失
    (这就是著名的「MTU 黑洞」)

ℹ️ 核心:分片只在路径上发生,且性能很差(首片可能延迟、重组在端到端进行)。生产环境应通过调整 MTU 避免分片,而不是依赖分片。


二、IPv4 与 IPv6

2.1 地址与表达

维度IPv4IPv6
地址长度32 bit(约 43 亿)128 bit(3.4×10³⁸)
表达10.0.0.1(点分十进制)2001:db8::1(冒号十六进制)
分片路由器可分片仅发送端分片
广播有(255.255.255.255)无(用组播/任播)
安全性靠应用层内建 IPsec(AH/ESP)
地址配置DHCPSLAAC(无状态自动配置)
IPv6 特殊地址:
  ::1          回环地址(对应 127.0.0.1)
  ::           未指定地址
  fe80::/10    链路本地地址(仅本链路有效)
  fc00::/7     ULA(唯一本地地址,类似私网)
  2001:db8::/32 文档示例地址(绝不公网可达)

2.2 为什么需要 IPv6

IPv4 枯竭的连锁反应:
  - 公网 IP 稀缺 → 大量私网 + NAT → 端到端性丧失
  - NAT 破坏点对点:P2P、游戏联机、内网穿透都要打洞
  - IPv6 恢复端到端连通,去掉 NAT 的种种妥协

迁移现实:
  - 绝大多数云厂商默认提供 IPv4(双栈或 NAT)
  - IPv6 演进路线:双栈(同时 v4/v6)→ 纯 v6
  - 国内 IDC/云已普遍支持 IPv6,但业务改造仍滞后

三、子网划分与 CIDR

3.1 从分类地址到 CIDR

早期 IP 按 A/B/C 类划分(浪费严重),现在统一用 CIDR(无类别域间路由):

CIDR 表达:网络地址 + 前缀长度
  192.168.1.0/24 → 前 24 位是网络号,后 8 位是主机号
  10.0.0.0/8     → 前 8 位网络号,后 24 位主机号
  172.16.0.0/12  → 私有地址段

私有地址段(RFC 1918):
  10.0.0.0/8      (10.x.x.x,最大私网段)
  172.16.0.0/12   (172.16~172.31)
  192.168.0.0/16  (192.168.x.x,家用最常见)

3.2 子网计算速查

/24  = 256 个地址,可用 254(减网络地址 + 广播地址)
/25  = 128 个地址,可用 126
/30  = 4 个地址,可用 2(经典点对点链路)
/31  = 2 个地址,RFC 3021 允许全用(点对点)
/28  = 16 个地址,可用 14

判断同一网段:
  两个地址的网络号相同 → 直接二层互通(同交换机)
  网络号不同 → 需路由器转发

ℹ️ 核心:子网划分的核心是"网络号决定是否跨网段"。跨网段就必须走路由,这是理解"为什么通了但不通"的第一步。


四、路由原理

4.1 路由表与转发

路由表条目(以 Linux 为例):
  # ip route
  default via 192.168.1.1 dev eth0      ← 默认路由(兜底)
  192.168.1.0/24 dev eth0 proto kernel   ← 直连网段
  10.0.0.0/8 via 172.16.0.1 dev eth1    ← 静态路由

转发决策:
  1. 查目的地址 → 匹配最长前缀的路由
  2. 直连网段 → 查 ARP 得 MAC → 二层直达
  3. 非直连 → 交给下一跳(Gateway)→ 路由器转发

4.2 动态路由协议

协议类型适用范围特点
RIP距离矢量小型网络跳数上限 15,收敛慢
OSPF链路状态企业/IDC 内部(IGP)收敛快、支持区域划分
BGP路径矢量互联网/跨 AS(EGP)全球路由、支持策略
OSPF 要点:
  - 每台路由器建立链路状态数据库(LSDB),全网一致
  - 用 Dijkstra 算法计算最短路径树
  - 支持区域(Area 0 骨干 + 非骨干),减小计算规模

BGP 要点:
  - 在自治系统(AS)之间交换路由
  - 不找最短路径,按管理策略(LocalPref/AS-Path)选路
  - 支持 ECMP 等价多路径 → 负载均衡基础

4.3 企业内常见的路由场景

典型拓扑:
  VPC / VLAN 隔离 → 每个子网一个网段
  核心交换机/路由器做网段间路由(三层转发)
  出口路由器 → 静态默认路由 → 运营商 BGP 双线
  专线/云互联 → BGP 动态路由对接

常见排障:
  - 新加网段不通 → 检查路由表是否缺路由
  - 双线负载不均衡 → 检查 BGP 权重/ECMP 配置
  - 某一 IP 通、另一 IP 不通 → 检查最长的前缀匹配

五、NAT:网络地址转换

5.1 为什么需要 NAT

NAT 的三个用途:
  1. 节约公网 IP:大量私网主机共享一个公网 IP 上网
  2. 隐藏内网:内网结构对外不可见(安全上的"掩蔽",非真正安全)
  3. 端口映射:把公网端口映射到内网服务(DNAT)

核心概念:
  - SNAT(源地址转换):出站报文把源 IP 换成公网 IP
  - DNAT(目的地址转换):入站报文把目的 IP 换成内网 IP
  - 双向都需要维护 NAT 表(连接跟踪)

5.2 三类 NAT 与典型场景

1. 静态 NAT / 1:1
   - 一个公网 IP 固定映射一个内网 IP
   - 用于需要对外稳定的服务(较少)

2. 动态 NAT / N:1(PAT 端口复用,最常见)
   - 多个内网 IP 共享一个公网 IP,用端口区分
   - Linux iptables MASQUERADE、家用路由器均属此类
   - 限制:入站无法主动建立(需端口映射)

3. 端口映射(DNAT)
   - 公网 IP:端口 → 内网 IP:端口
   - 例:访问公网 203.0.113.1:80 → 内网 192.168.1.10:8080

NAT 与连接跟踪:
  - conntrack 维护 (内网IP:端口 ↔ 公网IP:端口 ↔ 远端IP:端口) 映射
  - 映射有超时,长连接需注意 keepalive 保活
  - 大并发下 conntrack 表满 → 丢包(经典事故)

ℹ️ 核心:NAT 用"端口复用"换来了公网地址的节省,代价是破坏端到端:入站连接受限、P2P 要打洞、某些协议(FTP 主动模式、SIP)需要 ALG 特殊处理。


六、ICMP 与 ARP

6.1 ICMP:控制与诊断

ICMP 的用途:
  ping(echo request/reply)— 连通性诊断
  TTL 超时 → traceroute 依赖
  目标不可达(Destination Unreachable)→ 路由/NAT 问题信号
  需要分片但 DF=1 → Fragmentation Needed(MTU 黑洞诊断关键)

常见误判:
  - ping 通 ≠ 服务可用(TCP 端口可能不通)
  - 云厂商常默认禁 ping 回包 → ping 超时不代表链路断
  - ICMP 不可达代码区分:0 网络不可达 / 1 主机不可达 / 3 端口不可达

6.2 ARP:IP 到 MAC 的映射

ARP 流程:
  1. 发送方广播 "谁有 192.168.1.10?"(ARP Request)
  2. 目标回复 "我是,我的 MAC 是 xx"(ARP Reply)
  3. 双方缓存 ARP 表(Linux: ip neigh)

常见坑:
  - ARP 表老化/冲突 → 同网段偶发不通
  - 防 ARP 欺骗 → 静态 ARP / 交换机端口安全
  - 跨网段不经过 ARP(交给网关 MAC),所以"网关错了全不通"

七、常见避坑

坑现象对策
MTU 黑洞(隧道/代理场景)大包超时、小包正常调小 MTU / MSS clamp,禁用 DF
conntrack 表满突发的丢包、连接失败扩大表容量、清理超时、分布式网关
忘配路由新增网段不通检查 ip route、最长前缀匹配
禁 ping 回包ping 超时误判宕机用 TCP 探活(nc -vz / curl)
NAT 长连接超时空闲连接被掐断应用层 keepalive / NAT 表超时调大
ARP 冲突同网段间歇不通静态 ARP、排查重复 IP
IPv6 未配置双栈环境偶发超时统一双栈策略,链路测试 v4/v6
分片性能差大报文转发慢调整 MTU,避免路由器分片

八、最佳实践清单

□ 部署前画清网段规划(CIDR + VLAN),避免地址混乱
□ 默认路由 + 明细路由结合,出口做默认兜底
□ 隧道/VXLAN 场景显式调整 MTU 与 MSS clamp
□ NAT 场景关注 conntrack 容量与超时配置
□ 监控 ICMP 不可达与 TTL 超时,作为链路质量信号
□ 双栈迁移优先双栈过渡,明确 IPv6 可达性测试
□ 动态路由(BGP/OSPF)接入时配置认证与策略
□ 故障排查从"路由表 → ARP → 防火墙/NAT"逐层验证

一句话原则

IP 管寻址与路由,NAT 解决地址不足却破坏端到端,
排查网络问题从「路由表、ARP、MTU、NAT 表」四层找。

小结

IP 层是网络世界的"地基":寻址靠 IP 地址与子网划分,转发靠路由表与动态路由协议,穿越靠 NAT 与端口映射,诊断靠 ICMP 与 ARP。理解 CIDR 让网段规划不再靠猜,理解 MTU 分片与 MTU 黑洞能解释很多"小包通、大包不通"的诡异现象,理解 NAT 与连接跟踪则是排查生产环境丢包、连接被掐断的关键。落地记住五件事:网段规划用 CIDR、跨网段必须走路由、隧道场景调 MTU、NAT 关注连接跟踪、诊断从路由/ARP 逐层排查。当你能在一张路由表上推演出报文的前进路径,IP 层就不再是黑盒,而是你可以精准操控与排查的工具。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「network」更多文章

  1. 云原生网络:CNI 容器网络、Overlay/Underlay 与 Service Mesh 数据面
  2. SSE 与实时通信方案:Server-Sent Events、WebSocket 对比与选型实战
  3. 网络故障排查实战:tcpdump/Wireshark/ss/iperf 工具链与分层诊断方法论