资讯动态

读懂ping与tracert:从ICMP原理到全链路网络故障排查

发布时间:2026/10/18 14:29:57 来源:尧图企业网站定制
找个网络问题的根因一半时间花在“猜”上。你能想到的最常见操作就是打开命令行敲两下ping 一下看通不通tracert 一下看断在哪。但很多人对这两个命令的理解停留在“能用”层面看到输出里的 TTL、毫秒、星号一脸懵更别提顺着结果去判断是链路问题、路由问题还是设备问题。这篇文章就把 ping 与 tracert 的底层原理拆开讲透再结合故障排查实战讲清楚一套从链路到路由的全链路分析方法。不管你是运维、开发、网工还是被“网络卡到怀疑人生”的普通用户把这两个工具吃透排查网络问题的效率至少翻一倍。1. ping 的底层原理一条回声报文背后的严谨协议1.1 ICMP Echo 报文ping 究竟在干什么ping 之所以叫 ping是因为它的工作方式很像声呐——你发一个信号出去对方原样弹回来你就知道对面在。网络里的这个“信号”是一个 ICMP 报文全称 Internet Control Message Protocol它被 IP 协议直接封装不像 TCP/UDP 那样要端口号。ping 使用的是其中两种类型Echo Request类型 8和 Echo Reply类型 0。一个 ICMP Echo 报文的结构很有意思8 字节的头部后面跟着数据区。头部里有类型、代码、校验和、标识符Identifier和序号Sequence Number。标识符在早期的 Unix 实现里就是发起 ping 的进程号目的是区分不同进程发出的探测序号则从 0 开始递增每次发一个包就加一。数据区里面装什么Windows 默认装 32 字节的填充数据Linux 默认装 56 字节里面带着发送时间戳。接收方收到 Echo Request 后把类型改成 0原样把数据区带回来发送方拿到回包后读时间戳就能算出往返时延。这里有个很关键的细节校验和。这个校验和由发送方计算接收方验证。只要报文在传输过程中任何一个比特翻了车校验和就不匹配这个包会被直接丢弃不会有什么“重传”机制也不会通知你“我收到了一个坏包”。这就是为什么有时候 ping 会看到某一两个包超时但过一会儿又正常——中间有个包校验失败被静默丢弃了你根本不知道具体是哪一环出的问题。1.2 TTL 与 RTT两个“T”但完全是两码事RTTRound Trip Time是往返时延ping 输出里的 time12.3 ms 就是这个。很多人误以为 RTT 是“半程”的时间其实它是完整的去程加回程总耗时。比如你 ping 一台服务器 RTT 是 100ms这不代表去程 50ms 回程 50ms——路径严重不对称时完全可能出现去程 90ms、回程 10ms 甚至更极端的情况。TTLTime To Live是另一回事它是 IP 头里的一个 8 位字段最大 255。它的作用是防止数据包在网络环路里永远打转。每经过一台路由器TTL 减 1减到 0路由器就把它丢弃同时回送一个 ICMP Time Exceeded 报文给源地址。TTL 不是“存活时间”虽然名字带 Time但它实际上是跳数计数器。ping 输出里的 TTL 值要注意了。比如你 ping 一台 Linux 服务器结果显示 ttl55这不是服务器设置的 TTL 是 55而是服务器发出的回包初始 TTL 是 64回程经过了 64-559 跳到达你这里。也就是说这个 TTL 反映的是回程方向的跳数不是去程。去程可能走了 7 跳回程走了 9 跳路径不对称在互联网里太常见了。1.3 用 TTL 反推初始值里藏着主机信息既然 TTL 是递减的而不同操作系统对 ICMP 回包设置的初始 TTL 不同那你完全可以拿它当指纹用。常见初始值如下系统/设备默认 TTL 初值观察技巧Windows128ping 结果里 TTL 在 110~128 之间基本可判断是 WindowsLinux/macOS64TTL 在 50~64 之间大概率是 Linux 或 macOS多数网络设备255直接 ping 设备管理地址看到 254 或 255部分嵌入式设备64很多路由器/交换机回包 TTL 也是 64这个判断只能当参考不能当铁证。因为 NAT、代理、隧道封装都会改写或消耗 TTL。比如你 ping 一个经过 NAT 转换的地址NAT 设备转发时会削减一跳的 TTL但回包的初始值还是目标主机自己设置的所以反推出来的跳数只代表“目标主机回包到你的路径”不代表整个链路两端的真实距离。2. tracert 的底层原理靠“犯错”把每一跳逼出来2.1 利用 TTL 耗尽机制绘制网络路径ping 能告诉你“通不通”但“通了之后经过哪些路径”才是排查的关键这就是 tracert / traceroute 干的事。它的设计思路非常巧妙故意让探测报文犯错再根据错误响应把路径一段段拼出来。原理可以浓缩成一句话先发一个 TTL1 的包第一台路由器收到后转发前把它减成 0于是丢弃并回送 ICMP Time Exceeded 报文你就能看到第一跳接着发 TTL2 的包它能穿过第一台路由器被第二台路由器丢弃并回超时报文你就能看到第二跳依此类推TTL 递增到最终抵达目标。传统实现里Linux/Unix 下的 traceroute 默认使用 UDP 报文目标端口从 33434 开始逐包递增。为什么要用一个没人监听的端口因为当包最终到达目标主机时TTL 不会再耗尽如果目标端口没有服务在监听主机就回送一个 ICMP Port Unreachable类型 3 代码 3报文。traceroute 收到这个报文就知道“到终点”了停止探测。Windows 的 tracert 走的路线不太一样它用 ICMP Echo Request 做探测包目标返回 Echo Reply 即表示到达。所以严格说Windows 的 tracert 更像“逐跳加强版的 ping”。每一跳默认探测 3 次输出的三个时间点就是这 3 次的往返时延。如果某一次没等到回包显示星号。跳数最多默认 30 跳基本能覆盖绝大多数公网路径。2.2 三种探测模式的差异选对模式比猛测更有用现在的 traceroute 工具一般支持三种模式各有优缺模式默认使用探测包类型结束信号典型问题UDPLinux 默认UDP 到递增端口ICMP 端口不可达中间设备可能只限制 UDP目标防火墙可能丢弃不可达回包ICMPWindows 默认ICMP EchoICMP Echo Reply中间节点可能丢弃超时回包导致星号多TCP手工指定TCP SYN 到指定端口TCP 响应/RST能测特定端口的路径但防火墙可能干扰为什么强调模式选择很重要因为两种模式在同一个网络环境里跑出来的结果可能完全不同。我曾经排查一个跨机房访问慢的问题用 Windows 自带的 tracert 看第 6 跳开始全部超时几乎判断是链路断了但用 Linux 的 UDP 模式一跑路径清清楚楚到终点。原因是某几个节点的安全策略只对 ICMP 做了限速和丢弃UDP 超时报文却能正常返回。实用建议是怀疑路径问题时先用 ICMP 模式Windows 默认跑一次再用 UDP 模式Linux 默认或 TCP 模式如traceroute -T -p 80交叉验证。结果差异大基本能锁定是设备策略问题而非链路故障。2.3 星号不等于断链超时报文被吞掉了新手看到星号就惊慌失措觉得“链路过不去了”。实际上星号的含义是你的探测包发出去了但在超时时间内没有收到 TTL 耗尽回包。这有三类常见原因一是中间节点配置了管理模式默认丢弃 Ping 和 TTL 超时报文。很多骨干路由器和运营商设备为了降低控制面负载会直接丢弃这些“诊断类”报文但正常业务流量照常转发。这种星号是最常见的属于“设备不配合诊断”。二是设备启用了 ICMP 速率限制。有些设备对 ICMP 的响应做了限速比如每秒只回几个包你每跳连发 3 个大概率只收到 1 个甚至收不到输出里就会出现两个星号加一个延迟数字。三是防火墙策略直接丢弃了这些报文。从安全角度看暴露自己的路由位置对自己没好处很多企业防火墙干脆全部丢弃。所以如果目标的所有跳都断续出现星号但最终能出结果链路大概率没断如果从某一跳开始往后全部星号最终目标也是星号那就要结合 ping 目标的结果综合判断了。3. 全链路故障排查实战从本机到远端一步步收敛3.1 先分清“通不通”与“快不快”从近到远逐层验证接手一个网络投诉我习惯按这个顺序来先验证本机协议栈再验证到网关最后验证到远端。每一步都是一次“二分法”把问题的边界一步步压缩。第一步ping 127.0.0.1。这是回环地址包根本不离开本机通的话说明 TCP/IP 协议栈正常。如果这一步都不通那问题在系统网络配置别查外网了。第二步ping 本机局域网 IP。比如你在 10.0.0.100/24ping 10.0.0.100。这一步验证的是网卡和 IP 配置。能通说明网卡驱动、IP 层发送接收链路正常。第三步ping 网关比如 10.0.0.1。这一步最常出问题。网关是你和外部世界的唯一出入口它丢包后面全白搭。验证这一步要重点看两个指标丢包率和延迟。局域网里丢包率应该是 0%延迟通常在 1ms 以内。如果局域网 ping 网关延迟十几毫秒甚至更高别急着怪运营商先去查局域网内部的交换机、网线、无线干扰。第四步才是 ping 远端公网地址。这里要区分两种情况是对所有外部地址都丢包慢还是只对某一个目标慢前者大概率是出口链路或网关的问题后者要重点看路由路径和中间链路。这套由近到远的流程看起来简单但很多人上来就 ping 外网一丢包就喊运营商结果自家里 Wi-Fi 信号满格但空口干扰严重根本不是人家的问题。3.2 用 tracert 锁“断点”一条输出还原整条路径当链路确实有问题时tracert 的价值就出来了。我拿一个实际生产环境里常见的场景举例用户反馈访问某台业务服务器很慢丢包严重。先在一台可以正常上网的跳板机上执行 tracert输出类似下面这样1 1 ms 1 ms 1 ms 10.0.0.1 2 12 ms 12 ms 11 ms 192.0.2.1 3 11 ms 12 ms 15 ms 198.51.100.9 4 * * * Request timed out. 5 * * * Request timed out. 6 48 ms 47 ms 50 ms 203.0.113.66 7 12 ms 22 ms 15 ms 203.0.113.130 8 112 ms 110 ms 115 ms 192.0.2.88看到这个结果多数人第一反应是“第 4、5 跳断了”。但仔细分析你会发现第 6 跳的延迟又回来了第 8 跳是目标服务器而且能通。这说明第 4、5 跳只是不响应 TTL 超时报文链路本身还在转发流量。真正值得关注的是延迟变化前 3 跳都在 12ms 左右到第 6 跳跳到 48ms再到第 8 跳直接 112ms。如果你知道目标服务器的地理位置分布这个变化往往对应着物理链路从一个区域切换到另一个区域的节点。排查真正断点的原则很简单连续多跳超时且后续所有跳全部超时直到最终目标也不通——这种才算疑似链路中断。如果中间有星号、后面又有正常响应那基本只是节点不回诊断报文。3.3 中间跳丢包不算数如何识别“伪丢包”这是全文最值得记住的一个经验。tracert 显示中间某一跳丢包 50%紧接着下一跳丢包 0%这种情况极大概率是中间设备对 ICMP 报文做了限速。按它的策略每秒钟只响应一定数量的诊断报文超出的直接丢弃。测出来的“丢包”和真实业务丢包完全是两码事。那怎么测真实链路丢包我建议用 MTRMy Traceroute它能持续跑并统计每一跳的丢包率。跑的时候加-c 1000发 1000 个探测包或者--report模式下让它跑几分钟。看结果时有个关键判断口径如果丢包集中在某一跳但后续跳的丢包率几乎为 0那基本是 ICMP 限速的“伪丢包”如果丢包从某一跳开始蔓延后续跳也跟着丢说明这一跳往后的链路或设备确实在丢包需要重点处理。另外还要警惕“首包丢、后包通”的现象。很多设备的控制面处理首个 ICMP 超时报文时要查路由表、查转发信息耗时较长超过工具的等待时间之后的包走了快速通道就正常响应了。所以短时间测试看到零星星号连测几次都稳定复现才值得继续深挖。3.4 大包 ping 与 MTU小包全通、大包全挂的经典疑难还有一种情况小包 ping 一切正常延迟很低丢包为零但一旦涉及大包传输的业务比如图片上传、视频推流就卡成幻灯片。这时候要做大包 ping 测试。正常的以太网 MTU 是 1500 字节IP 头占 20 字节ICMP 头占 8 字节所以不带分片标志的情况下ping 数据区最大可以填 1472 字节。超过这个值IP 层就会分片传输。Windows 下用ping -f -l 1472 目标IP-f 表示不分片Linux 下用ping -M do -s 1472 目标IP。如果 1472 通、1500 不通说明路径 MTU 小于 1500如果 1472 就不通问题更严重路径 MTU 更小。找出最大可用 MTU 的做法是逐步减小从 1472 开始用二分法快速试 1400、1300、1200……找到恰好能通的那个值。这个问题的根源往往在封装或隧道链路上——当链路层有额外开销时标准 MTU 1500 放不下额外的包头中间设备又设置了 DF 不分片就直接丢弃而 ping 默认小包不受影响就会产生“小包通、大包挂”的诡异现象。简单的应急方案是调整网卡或接口的 MTU 值到内网适配治本还得掐路径中的 MTU 黑洞设备。4. 高频误区和排查心得这些坑我都替你踩过4.1 常见误判整理一张表看清“通”与“断”多年的排障里高频误判基本集中在下面这个表格里。每一条我都有过实际教训。现象常见误判更合理的解读ping 通但业务访问不了“网络没问题”ICMP 可达不代表 TCP/UDP 应用端口可达业务不通要看对应端口。防火墙策略也可能只管业务端口。ping 不通但业务正常“链路断了”很多主机和防火墙直接丢弃 ICMP但没有影响业务流量。ping 超时不能单独作为故障证据。tracert 从第 2 跳开始全星号“网络彻底断”大概率是中间设备丢弃诊断报文需要用另一种模式或 MTR 交叉验证。中间有一跳丢 80%“那条线路坏了”先看下一跳丢不丢、目标丢不丢。下一跳不丢基本都是 ICMP 限速。TTL 值突然变化“有人在搞鬼”路径变化、NAT 设备、目标端初始值设置不同都会导致 TTL 变化要结合多条路径信息整体看。4.2 tracert 时间不是单段延迟别被数字误导tracert 输出里的三个毫秒数很多新人都理解错了。它代表的是“从我发出探测包到收到某跳回包的总耗时”。举个例子第 3 跳显示 10ms第 4 跳显示 20ms。这不是告诉你“第 4 跳单独花了 10ms”而是“到第 4 跳为止整个往返耗时 20ms”。由于探测包本来就存在去程到达该跳、该跳处理回包、回程返回的三段耗时所以这个数字是一个累计性质的参考不能简单前后相减得出“某一段延迟”。但用它来做横向趋势比较还是有意义的连续几跳数字都差不多突然某跳翻了好几倍说明过了这个节点之后路径发生明显变化比如跨网、跨区、走低速链路——这时候结合 IP 归属来查往往能看出绕路或路由策略问题。4.3 排障先用工具交叉验证一个工具说断两个工具才能下结论我现在的习惯是任何链路问题都用至少两种探测方式交叉验证。方案很简单先ping -c 100看基础丢包和延迟再mtr -r -c 300 目标IP看路径和每跳丢包。如果中间跳丢包但目标不丢基本可以判定链路健康问题大概率出在应用层或目标服务器负载如果目标本身也丢包再细分是去程丢还是回程丢通过从目标服务器反向 ping 回源地址来验证。反向验证容易被忽略但价值极高。登录目标服务器对源 IP 执行同样的大包 ping 或 mtr能看清回程路径。去程是 A 线路、回程绕成了 B 线路这种不对称路径是很多间歇性卡顿的元凶——某个方向拥塞但你看不到。发现问题后联系对端网络侧协调让回程走更合理的路径效果立竿见影。最后再多说一句这些工具是排障用的不是压测工具更不是攻击工具。生产环境里不要对外部目标持续大流量扫描很多设备和管理员对高频探测是有防御反应的一旦被识别为异常流量反而会影响正常业务。另外踩过几次坑之后我总结出一个原则——永远让数据说话别让感觉带节奏。看到链路问题先用 ping/tracert 把边界画出来再决定找谁处理这个过程比任何玄学都靠谱。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑