本节摘要:ICMP 是网络层的"广播电台"——报告差错、支持探测;路由协议是"制图局"——路由器之间互相通告链路信息,各自算出路由表。本节讲清 ICMP 的报文类型与用途边界、距离向量与链路状态两大算法家族的原理差异,并用 ping 的完整往返过程把两者串起来。
上一节留下两个问题:路由器查的那张表从哪来?数据包被丢弃时谁来报信?前者归路由协议,后者归 ICMP。它们一个管"修路图",一个管"路况广播",共同把网络层的闭环补完整。
ICMP 报文装在 IP 报文里(协议号 1),但逻辑上属于网络层的附属协议。常见类型:
# 核心 ICMP 报文速查(类型/码) 类型 0 / 8 :回显应答 / 回显请求 ← ping 的本体 类型 3 :目的地不可达(码细分:0网络 1主机 3端口 4需要分片…) 类型 5 :重定向——"别绕经我,有更近的下一跳" 类型 11 :超时(TTL 耗尽) ← traceroute 的本体 类型 3 码 4 :需要分片但 DF 置位 ← 路径 MTU 发现的反馈机制 一次 ping 的完整旅程(把前两节知识串起来): 1. 构造 ICMP 回显请求,包进 IP 报文(协议号 1) 2. 查本机路由:目标非本网段 → 交给默认网关(ARP 先问到网关 MAC) 3. 逐跳转发,IP 不变、MAC 换信封、TTL 递减 4. 目的主机收到,协议号 1 → 交 ICMP 模块 → 生成回显应答原路返回 5. 发送方收到应答,计算往返时延
值得划清的边界:ICMP 报告差错,但差错报文本身出错不再引发报错(防止无限递归);ICMP 不修复任何东西——它只负责告诉发送方"发生了什么",怎么办(通常重传或换路)是上层的事。类型 3 码 4 是个重要配角:上一节的"路径 MTU 发现"正是靠它——发一个 DF 置位的大包,途中 MTU 不够的路由器回这个差错并附上自己能通过的 MTU,发送方据此调小 TCP 段,全程无分片。
路由表的第一来源是直连网段(接口配了地址自动生成)与手工静态路由;但互联网规模的动态路表,靠路由协议在路由器之间自动计算。两大算法家族:
距离向量(RIP 为代表):每个路由器只维护"到各目的地的距离",周期性把自己的整张表发给直接邻居。收到邻居的表后做简单加法更新:经你到某地 5 跳,我到你 1 跳,那我经你 7……等等,6 跳。优点是实现极简、开销极小;缺点是慢、视野短、有经典缺陷:
计数到无穷问题(坏消息传得慢): 链路 A—B 断了。B 发现直连不通,但 C 还告诉 B:"我到 A 只要 2 跳" (其实 C 的路正是经 B 走的)。B 如获至宝:经 C 到 A,3 跳! C 听说 B 现在 3 跳,更新自己:经 B 4 跳!…… 两个路由器互相"抬价",跳数缓慢爬升直到 16(RIP 的无穷大)才死心。 解法:水平分割(不把学来的路反射回原口)、毒性逆转、 触发更新——都是在给这个先天缺陷打补丁。
链路状态(OSPF 为代表):每个路由器只如实描述"我接了哪些邻居、代价多少"(链路状态通告),泛洪给全区域所有路由器。于是人人都拿到同一张原始地图,各自跑 Dijkstra 最短路径算法算路。收敛快、无环路、支持分层(区域划分),代价是内存与计算的消耗。骨干网与大型企业网的标配。
| 维度 | 距离向量 RIP | 链路状态 OSPF |
|---|---|---|
| 交换内容 | 整张距离表给邻居 | 链路描述泛洪给全网 |
| 视角 | 道听途说,不知道拓扑 | 人手一张全图 |
| 算法 | 分布式加法比较 | 本地 Dijkstra |
| 收敛速度 | 慢(分钟级),有环路窗口 | 快(秒级) |
| 适用规模 | 小网络 | 中大型、骨干 |
背景:办公室一台机器突然无法访问任何外网,内网共享目录正常。用户重启网卡无效。
分层定位思路(第 1 章方法论的实战):
第 1 步:链路层通不通? $ ping 192.168.1.1 → 通,平均 0.6ms 结论:网卡、交换机、网关全部正常。 第 2 步:IP 层能不能出网关? $ ping 8.8.8.8 → 不通(100% loss) $ traceroute -n 8.8.8.8 1 192.168.1.1 0.7 ms 2 * * * 结论:包交给了网关,网关没能送出去或没收到回音。 第 3 步:分清"去不了"还是"回不来" 在网关上查:WAN 口地址能 ping 通外网,NAT 表也有该内网 主机的转换记录 → 包出去了,回程也回来了, 但 NAT 还原时目标对不上?检查主机地址: $ ip addr → 发现主机有 两个 IP(.23 与 .99), 静态配置残留了旧网段的 .99,默认路由走的是 .99 源地址, 运营商对源地址非法的包直接丢弃。 处置:删掉残留地址,只留 DHCP 下发的 .23,立刻恢复。 变式:同样症状更常见的原因是网关 ARP 表错乱或上游故障, 第 3 步的"分清去回"是通用手法:在出口设备上同时看 出站计数与 NAT 表,单向递增即回程问题(多半在运营商侧)。
⚠️ 常见坑:把"ping 不通"直接等同于"网络不通"。ICMP 常被防火墙降优先级或整体禁用(第 7 章安全策略常这么配),端口正常而 ping 失败的情况比比皆是。判断服务是否可达,要用对应端口的 TCP 探测。
BGP 在这套图里站在哪? 互联网由数万个机构网络(自治系统)互联而成,机构内部用 OSPF 这类"内政协议",机构之间用 BGP 这类"外交协议"——它通告的不是最短路径而是"经我可达哪些网段"的策略组合,商业关系(谁给谁付钱)直接写进路由决策。你在 4.2 用 traceroute 看到的骨干跳变,多数就是 AS 之间的交接点。
为什么不用一种协议统一内外? 规模与信任都不同:内部网络可以泛洪链路状态(设备互相坦诚),跨机构网络不可能把内部拓扑透露给商业对手——分层分域不是技术洁癖,是信任边界的工程映射。
网络层到站。数据包已能抵达任何主机,下一站传输层解决"主机内的最后十米":端口寻址与可靠交付。