这是《计算机网络 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。
ICMP 常被当作 ping 的附属协议,但它同时承担错误报告、路径探测、PMTUD 和 IPv6 邻居发现等功能。错误地全面封禁 ICMP 会带来两类问题:排障困难,以及大包传输的 PMTUD 失效。
6.1 ICMP 的定位
ICMP 巐藏在 IP 协议号 1 中,用于传递控制和错误消息。它不是应用数据的承载协议。
常见类型:
| 类型 | 名称 | 场景 |
|---|---|---|
| 0 / 8 | Echo Reply / Request | ping |
| 3 | Destination Unreachable | 网络、主机、端口不可达 |
| 5 | Redirect | 建议更优路径 |
| 11 | Time Exceeded | TTL 超时,traceroute |
| 12 | Parameter Problem | 包头错误 |
| 3 / Code 4 | Fragmentation Needed | PMTUD |
6.2 ping
基础用法:
ping 10.20.1.10
ping -c 100 10.20.1.10
ping -i 0.2 10.20.1.10
ping -6 2001:db8::1
指定不分片并测试载荷:
ping -M do -s 1472 10.20.1.10
计算:
ICMP Header 8 字节
IP Header 20 字节
1472 + 8 + 20 = 1500
如果 1472 不通而 1400 通,路径 MTU 可能小于 1500。
6.3 丢包解读
ping 结果需要区分三种情况:
- 全部不通:路由、地址、ACL 或目标不可达;
- 部分丢包:链路质量、队列拥塞、限速或负载不均;
- 请求正常但应用失败:传输层或应用层问题。
注意:
- 目标可能禁 ping 但服务可用;
- 中间设备可能限速 ICMP;
- ping 通不代表端口开放;
- ping 的 RTT 低不代表高负载时服务不排队;
- ICMP 走的路径可能与业务流量不同。
6.4 Destination Unreachable
常见代码:
| Code | 含义 |
|---|---|
| 0 | Network Unreachable |
| 1 | Host Unreachable |
| 2 | Protocol Unreachable |
| 3 | Port Unreachable |
| 4 | Fragmentation Needed |
| 5 | Source Route Failed |
例如 UDP 访问未监听端口,通常触发 Port Unreachable。路由器找不到路径时返回 Network/Host Unreachable。
6.5 traceroute
用法:
traceroute 10.20.1.10
traceroute -I 10.20.1.10
traceroute -T -p 443 10.20.1.10
traceroute -U -p 53 10.20.1.10
mtr -rw -c 100 10.20.1.10
协议差异:
| 方式 | 特点 |
|---|---|
| UDP | 默认,可能被策略影响 |
| ICMP | 常用,可能被限速 |
| TCP | 更接近业务端口路径 |
mtr 更适合观察持续趋势:
mtr -rw -c 200 -T -P 443 10.20.1.10
6.6 PMTUD
路径 MTU 发现依赖 ICMP Fragmentation Needed。
错误做法:
防火墙禁用所有 ICMP
-> 路由器无法返回分片要求
-> 发送方持续重传大包
-> TCP 大流量卡住
处理:
- 放行 ICMP Type 3 Code 4;
- 正确设置隧道和 overlay MTU;
- TCP 启用 MSS Clamp;
- 云主机、容器、负载均衡和安全设备统一评估;
- 用
ping -M do或tracepath验证。
Linux 相关:
sysctl net.ipv4.ip_no_pmtu_disc
sysctl net.ipv4.tcp_mtu_probing
6.7 ICMP 与安全
风险:
- ICMP 泛洪;
- 主机探测;
- 重定向攻击;
- 大包放大;
- 隐藏侧信道。
安全策略:
- 允许必要的错误报告;
- 限制 Echo 速率;
- 不盲目放行所有 ICMP;
- 关闭不必要的 ICMP Redirect 接受;
- 云安全组分层治理;
- 保留运维专用探测通道。
Linux 示例:
sysctl net.ipv4.conf.all.accept_redirects
sysctl net.ipv4.conf.all.send_redirects
6.8 排障案例
案例 1:服务访问超时
ping <target>
mtr -rw -c 100 <target>
traceroute -T -p 443 <target>
curl -v --connect-timeout 3 https://target
结论判断:
- ping 不通且 traceroute 断在网关:本机路由或网关问题;
- ping 通但 TCP 不通:安全组、防火墙或服务未监听;
- 某跳后延迟暴涨:路径或出口异常;
- 丢包与业务高峰相关:拥塞或带宽打满;
- 只有 IPv6 异常:AAAA、NDP 或防火墙策略。
案例 2:小包正常,大包失败
ping -M do -s 1472 <target>
ping -M do -s 1400 <target>
tracepath <target>
优先检查 VPN、隧道、云 overlay 和容器网络的 MTU。
本章小结
ICMP 承担错误报告、连通性测试、路径探测和 PMTUD 等关键功能。ping 是基础工具,但必须结合端口探测、应用请求和 traceroute 判断问题层级。全面封禁 ICMP 可能造成大包传输异常和排障困难,应精确放行错误报告类消息。
思考题
- ping 通但 HTTP 超时,可能有哪些原因?
- ICMP Type 3 Code 4 在 PMTUD 中有什么作用?
- traceroute 中间跳超时是否一定表示故障?
- 为什么推荐用 TCP traceroute 验证业务端口路径?
- 设计一份兼顾安全和可观测性的 ICMP 策略。