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 地址与表达
| 维度 | IPv4 | IPv6 |
|---|---|---|
| 地址长度 | 32 bit(约 43 亿) | 128 bit(3.4×10³⁸) |
| 表达 | 10.0.0.1(点分十进制) | 2001:db8::1(冒号十六进制) |
| 分片 | 路由器可分片 | 仅发送端分片 |
| 广播 | 有(255.255.255.255) | 无(用组播/任播) |
| 安全性 | 靠应用层 | 内建 IPsec(AH/ESP) |
| 地址配置 | DHCP | SLAAC(无状态自动配置) |
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 层就不再是黑盒,而是你可以精准操控与排查的工具。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。