1. 连通测试和路由跟踪到底在测什么
刚入行那会儿,我总觉得网络排查是一件很玄学的事。明明网线插着、指示灯亮着、IP也配了,可就是访问不了目标服务。后来带我的前辈说了一句话,我记到现在:网络问题从来不是“通”或“不通”两个状态,而是一条链路上某一跳出了问题。连通测试和路由跟踪,就是帮你把这条链路一层层剥开的工具。
这两个东西说白了就是网络排查的“听诊器”。连通测试用来回答“对方到底能不能摸到”,路由跟踪用来回答“我是沿着哪条路摸过去的、在哪一跳卡住了”。它们不依赖什么高级网管系统,几乎每台设备都自带,命令行敲几下就能出结果。不管你是刚接触运维的新手,还是写了几年业务代码偶尔要排查接口超时的开发,甚至是家里网络出问题想自己看看的普通用户,掌握这两个工具都能让你少求人、少背锅。
我见过太多人一遇到网络问题就重启路由器、重装系统,折腾半天发现是中间某台设备把ICMP给禁了。也见过有人拿着路由跟踪的结果一脸茫然,不知道哪一跳才是真正的问题所在。这篇文章我就按自己这些年踩坑的顺序,把连通测试和路由跟踪从原理到实操、从参数到读结果、从常见故障到排查套路,完整地捋一遍。你看完之后,至少能做到:拿到一个网络不通的问题,知道先测什么、再测什么,结果怎么读,问题大概出在哪一段。
2. 连通测试的核心原理与实操要点
2.1 连通测试到底测的是什么
连通测试最常用的就是那个大家都会敲的命令,它的正式名字叫互联网控制消息协议回显请求。原理特别朴素:我发一个特定格式的小包给你,你收到之后原样给我回一个包,我根据有没有收到回包、来回花了多长时间,来判断咱俩之间这条链路的状态。
这里有个很多人忽略的点:连通测试测的是“双向可达性”,不是“单向能发出去”。你发出的请求能到达对方,只完成了一半;对方的回应能回到你这里,才算真正通。所以有时候你会看到“请求超时”,但目标服务其实是活着的——因为去的时候通,回来的时候被某台设备的策略拦了。这种情况在跨区域、跨运营商的网络里特别常见。
还有一个基础概念得说清楚:连通测试走的是网络层的协议,它不关心目标端口开没开、服务有没有在监听。也就是说,能通不代表服务可用,不通也不代表服务挂了。我早期就犯过这个错,测到能通就以为万事大吉,结果业务连不上数据库,后来才发现是端口没放行。连通测试和端口探测是两码事,前者测主机可达,后者测服务可达,排查的时候要分开看。
2.2 常用参数逐个拆解
不同系统上这个命令的参数略有差异,但核心那几个是通用的。我按实际排查时最常用的顺序说。
指定发送次数:默认情况下,很多系统会一直发下去,你得手动停。排查时我习惯先指定发4到5个包,够看趋势又不至于等太久。命令大概是-c 5这种形式。为什么要发多个而不是一个?因为单个包可能因为偶发的拥塞或抖动丢失,发多个能看出丢包是持续性的还是偶发的。
指定包大小:默认包很小,有些链路对特定大小的包有特殊处理,比如MTU不匹配导致大包被丢弃。这时候可以用-s指定发送的数据量,比如发一个1472字节的包(加上头部正好接近常见的1500字节MTU),如果小包通、大包不通,基本就能定位到MTU问题。这个技巧在排查某些特定场景的“能连上但传不了数据”时特别好用。
指定源地址:一台设备可能有多个网卡、多个地址,默认走哪个路由就带哪个源地址。排查多网卡环境时,用-I或-S指定从哪个地址发出去,能验证特定路径的可达性。我遇到过一台服务器有两个网段,默认路由走A网段,但业务要求走B网段,结果B网段的对端根本不通,就是用指定源地址测出来的。
设置超时时间:默认等待回包的时间可能比较长,排查时我会把超时调短一点,比如1到2秒,这样不通的时候能快速得到结果,不用干等。命令形式类似-W 2。
禁止分片:这个参数在排查MTU问题时是黄金搭档。加上它之后,包在传输过程中不允许被分片,如果链路MTU不够,包就会被丢弃并返回一个特定错误。配合不同大小的包一起测,能精确算出路径上的最小MTU。
下面这张表是我整理的常用参数速查,不同系统叫法可能不同,但含义一致:
| 参数用途 | 典型写法 | 使用场景 |
|---|---|---|
| 指定发送次数 | -c 5 | 快速判断持续丢包还是偶发 |
| 指定包大小 | -s 1472 | 排查MTU不匹配 |
| 指定源地址 | -I 或 -S | 多网卡环境验证路径 |
| 设置超时 | -W 2 | 加快排查节奏 |
| 禁止分片 | -M do 或 -f | 配合包大小定位MTU |
| 记录路由 | -R | 查看去程经过的节点 |
2.3 结果怎么读才不跑偏
拿到连通测试的结果,重点看三个东西:丢包率、往返时间、以及返回的错误类型。
丢包率是百分比,0%说明这条链路在当前测试条件下是稳定的。但要注意,偶尔丢一两个包不一定代表有问题,尤其是跨广域网的链路,轻微丢包是正常的。如果丢包率超过5%且持续,那就得重视了。往返时间看的是平均值和波动,如果平均时间正常但波动很大(比如一会儿10毫秒一会儿500毫秒),说明链路存在拥塞或抖动,这种“时通时不通”的问题最难查。
返回的错误类型信息量很大。“请求超时”通常意味着包发出去了但没回来,可能是中间设备丢弃、对端没响应、或者回程被拦。“目标主机不可达”一般是路由表里没有到达目标的路径,或者最后一跳的设备明确告诉你找不到目标。“传输中过期”则是包的生存时间耗尽,通常意味着路由环路或者路径太长。“需要分片但设置了禁止分片”直接指向MTU问题。
我个人的习惯是,看到超时先别急着下结论,换几个不同大小的包再测一轮,同时结合路由跟踪看路径,基本就能把范围缩小到某一跳。
注意:很多设备和防火墙会限制或禁用这类探测包的响应,这是出于安全考虑的正常配置。所以“测不通”不等于“网络坏了”,一定要结合其他手段交叉验证。
3. 路由跟踪的工作机制与实战解读
3.1 路由跟踪是怎么“画”出路径的
路由跟踪的思路非常巧妙,它利用了包的生存时间字段。每经过一台路由器,这个值就减一,减到零的时候,这台路由器会把包丢弃,并回一个“传输中过期”的消息给发送方。路由跟踪就是从这个机制入手的:先发一个生存时间为1的包,第一跳路由器收到后减到零,回消息,这样我就知道了第一跳是谁;再发一个生存时间为2的包,第二跳路由器回消息,我就知道了第二跳是谁。如此递增,直到包到达目标或者达到最大跳数。
这个过程就像你寄一封信,每经过一个邮局就盖一个戳,戳满了信就被退回,退回的时候你就知道信走到哪个邮局了。路由跟踪就是不断调整“允许盖几个戳”,从而把整条路径上的邮局一个个问出来。
这里有个关键点:路由跟踪显示的是“去程”路径,回程路径可能完全不同。网络路由是双向独立的,去的时候走A路,回来可能走B路。所以有时候你会看到路由跟踪到了某一跳之后全是超时,但目标其实是通的——因为去程的后续节点不响应探测,或者回程走了另一条路。这种情况不能简单判定为“不通”。
3.2 不同平台的命令差异
路由跟踪在不同系统上的命令名和参数差别挺大,我按常见平台列一下。
在类Unix系统上,命令通常是traceroute,默认走UDP探测,也可以加参数走ICMP或TCP。走TCP探测在排查某些只放行特定端口的网络时特别有用,因为很多设备对UDP探测不响应,但对TCP握手有反应。命令形式类似traceroute -T -p 80 目标地址,意思是走TCP协议、探测80端口。
在Windows系统上,命令是tracert,默认走ICMP探测,参数相对少一些,但基本够用。它不支持直接指定TCP探测,这是它的局限。
还有一个更现代的工具叫mtr,它把连通测试和路由跟踪合在一起,持续发送探测包并实时刷新每一跳的丢包率和延迟。这个工具在排查间歇性故障时简直是神器,因为它能告诉你“哪一跳在持续丢包”,而不是只给一个瞬间的快照。我现在的习惯是,先用普通路由跟踪看路径,再用mtr持续观察几分钟,基本就能锁定问题跳。
| 平台 | 命令 | 默认协议 | 特色能力 |
|---|---|---|---|
| 类Unix | traceroute | UDP | 可切换TCP/ICMP探测 |
| Windows | tracert | ICMP | 简单直接,参数少 |
| 跨平台 | mtr | ICMP/UDP/TCP | 实时持续统计每跳质量 |
3.3 每一跳的信息怎么看
路由跟踪的输出一般是一行一跳,每行包含跳数、节点地址(可能还有域名)、以及三次探测的往返时间。读的时候我关注这几个地方。
星号表示什么:某一跳显示星号,说明这次探测没有收到该节点的回应。可能是该节点不响应探测,也可能是包在这一跳被丢弃了。关键看后续跳有没有回应——如果这一跳是星号,但下一跳有回应,说明这一跳只是不响应探测,路径其实是通的。如果从某一跳开始后面全是星号,那问题大概率就出在这一跳附近。
延迟突然跳变:正常情况下,延迟随着跳数增加缓慢上升。如果某一跳的延迟突然从几毫秒跳到几百毫秒,说明这一段链路存在拥塞或者物理距离很远。如果后续跳的延迟又降下来了,那可能只是那一台设备处理探测包比较慢,不代表真实转发延迟高。
路径出现环路:如果看到几个地址反复出现,比如第5跳是A、第6跳是B、第7跳又是A,那基本可以判定存在路由环路。这种情况会导致包在环里打转直到生存时间耗尽,表现为目标完全不可达。
路径不对称:去程和回程路径不同是正常的,但如果差异特别大,比如去程走的是低延迟路径、回程绕了很远,那业务体验就会受影响。排查时可以用不同源地址分别测,对比路径差异。
提示:路由跟踪的结果受网络动态变化影响很大,不同时间测可能路径不同。排查时最好多测几次,或者用持续探测工具观察一段时间,避免被单次快照误导。
4. 完整排查流程与典型场景实操
4.1 从零开始的一次标准排查
假设现在有个场景:某台业务服务器访问不了另一个网段的目标服务,我要从头排查。我的标准流程是这样的。
第一步,先确认本机网络配置。看看IP、掩码、网关配得对不对,路由表里有没有到达目标网段的路由。这一步很多人跳过,但实际排查中,配置错误导致的问题占了相当大的比例。命令就是查看地址和路由表那几个,确认默认网关存在且可达。
第二步,测网关连通性。先测自己到网关通不通。网关都不通,后面的事都不用谈了。如果网关不通,问题就在本地链路或网关设备上,检查网线、交换机端口、网关地址配置。
第三步,测目标连通性。网关通了,直接测目标地址。如果通,那网络层没问题,问题可能在应用层或端口层面。如果不通,进入下一步。
第四步,路由跟踪定位断点。对目标做路由跟踪,看路径在哪一跳开始断。如果断在网关之后的第一跳,可能是网关的路由配置问题;如果断在中间某一跳,可能是那一跳的设备策略或链路故障;如果一直跟到目标网段但最后一跳不通,可能是目标主机没开或者回程被拦。
第五步,交叉验证。换不同大小的包测、换TCP探测测、从其他源地址测,多角度确认问题范围。这一步是区分“真故障”和“探测被限制”的关键。
第六步,持续观察。如果是间歇性问题,用持续探测工具观察几分钟,记录丢包和延迟的变化规律,找出问题跳。
这套流程我用了很多年,大部分网络不通的问题都能在十分钟内定位到大致范围。
4.2 场景一:能通但延迟忽高忽低
这种问题最折磨人,因为业务时好时坏,用户投诉不断,但你一测又是通的。我的处理方式是先用持续探测工具跑一段时间,重点看每一跳的延迟分布和丢包率。
如果发现某一跳的延迟波动特别大,而其他跳都很稳定,那问题基本就在那一跳对应的链路上。常见原因包括:该链路带宽被占满、设备CPU负载过高、或者链路本身质量差。这时候可以尝试在业务低峰期再测一次,对比延迟是否恢复正常,从而确认是否与负载相关。
还有一种情况是延迟波动出现在最后几跳,也就是目标网段内部。这可能是目标服务器本身负载高,或者目标网段的接入设备有问题。这时候需要联系目标侧一起排查,单方面很难定位。
4.3 场景二:小包通大包不通
这个场景特别典型,表现是能连上目标,但一传数据就卡死或者连接中断。根源通常是路径上某一段的MTU小于发送方认为的MTU,大包被丢弃,而小包(比如握手包)能正常通过。
排查方法很直接:用禁止分片参数,从大到小逐步减小包大小,找到那个“刚好能通”的临界值。比如先测1472字节,不通就测1400,再不通测1300,直到找到能通的大小。这个临界值加上头部开销,就是路径的实际MTU。找到之后,要么调整发送方的MTU设置,要么让路径上的设备支持分片,问题就解决了。
我印象很深的一次,某业务跨区域传输大文件总是失败,小请求却正常。测了半天发现路径中间有一段MTU只有1400,而发送方默认按1500发,大包全被丢了。把发送方MTU调成1400之后,问题立刻消失。这种问题不靠连通测试和路由跟踪配合,根本无从下手。
4.4 场景三:路由跟踪中途全是星号
这种情况容易让人误判为“网络断了”,但其实要分两种可能。一种是路径真的断了,包到某一跳就过不去了;另一种是后续节点不响应探测,但转发功能正常。
区分方法很简单:看目标服务本身通不通。如果连通测试能通、业务也正常,那路由跟踪后面的星号只是探测被限制,不用管。如果连通测试也不通,那就要认真对待了。这时候可以尝试换TCP探测,因为很多设备对ICMP不响应但对TCP有反应。如果TCP探测能跟到更远,说明路径是通的,只是ICMP被限制了。
还有一种情况是目标网段做了策略,只允许特定源地址访问。这时候从允许的源地址测能通,从其他地址测不通,路由跟踪的表现也会不同。排查时要确认自己的源地址是否在允许范围内。
5. 常见问题速查与避坑经验
5.1 排查中的典型误区
误区一:把探测不通等同于网络故障。这是最常见的错误。很多设备和防火墙默认不响应探测包,这是正常的安全策略。判断网络是否真的有问题,要看业务是否可用,而不是看探测结果。我见过有人因为探测不通就大动干戈改配置,结果把本来正常的网络改出了故障。
误区二:只看单次结果就下结论。网络是动态的,单次探测可能恰好遇到瞬时拥塞或路由收敛。我现在的习惯是,任何异常结果都要复测至少三次,或者用持续工具观察,确认是稳定现象还是偶发。
误区三:忽略源地址的影响。多网卡、多网段环境下,从不同源地址发出的探测可能走完全不同的路径,结果也完全不同。排查时一定要明确自己是从哪个地址测的,必要时指定源地址对比测试。
误区四:路由跟踪看到星号就认为断在那里。前面说过,星号可能只是不响应探测。正确的做法是结合连通测试和业务状态综合判断,而不是盯着星号下结论。
5.2 高频问题速查表
| 现象 | 可能原因 | 排查动作 |
|---|---|---|
| 连通测试全超时 | 链路断、目标关机、策略拦截 | 先测网关,再路由跟踪定位断点 |
| 连通测试部分丢包 | 链路拥塞、设备负载高 | 持续探测观察规律,定位问题跳 |
| 小包通大包不通 | 路径MTU不匹配 | 用禁止分片参数逐步测临界值 |
| 路由跟踪中途全星号 | 节点不响应探测或路径真断 | 换TCP探测,结合业务状态判断 |
| 延迟忽高忽低 | 链路拥塞、路由抖动 | 持续探测,对比不同时段结果 |
| 路径出现环路 | 路由配置错误 | 检查相关设备路由表,联系网络管理方 |
5.3 我踩过的几个坑
第一个坑是过度依赖默认参数。早期我测连通性就用默认命令,发一个包看结果。后来发现单个包根本说明不了问题,必须发多个、看丢包率才有意义。现在我的默认操作就是至少发5个包。
第二个坑是忽略回程路径。有一次去程路由跟踪一切正常,但业务就是不通。折腾很久才发现是回程路径上有一台设备做了限制。从那以后,我排查时会有意识地考虑双向路径,必要时从目标侧反向测一次。
第三个坑是在虚拟化环境里用物理网络的思路排查。虚拟交换机、 overlay网络这些环境里,路由跟踪的结果可能和物理路径完全对不上,因为中间经过了隧道封装。这种环境下,连通测试和路由跟踪只能作为参考,更多要依赖虚拟网络自己的排查工具和日志。
第四个坑是忘记检查本地防火墙。有次排查了半天远端,最后发现是本机防火墙把回包拦了。现在我的排查清单里,本地防火墙和策略永远是第一步要确认的。
实操心得:排查网络问题时,养成“从近到远、从简到繁”的习惯。先确认本地配置和本地链路,再逐步向外扩展。大部分问题其实就出在最近的一两跳,跑很远去查往往是白费功夫。
6. 工具选型与进阶技巧
6.1 命令行工具之外的补充手段
命令行工具虽然万能,但有些场景下图形化工具或者专业工具效率更高。比如持续监控场景,mtr这类工具能实时刷新,比反复敲命令直观得多。再比如需要长期记录和分析的场景,可以把探测结果输出到文件,用脚本做统计和告警。
还有一些场景需要模拟特定协议或端口的探测。比如只放行TCP 443的网络,用默认的ICMP探测可能全被拦,但用TCP探测就能正常跟到目标。这时候选择支持多协议探测的工具就很重要。我一般会准备两三个不同侧重点的工具,根据场景切换使用。
6.2 把探测结果用起来
探测结果不只是用来看的,还可以沉淀下来做基线。比如正常状态下记录一份路径和延迟基线,出问题的时候一对比,立刻就能看出哪一跳发生了变化。这个做法在管理多台设备、多条链路时特别有价值。
我自己的做法是,对关键链路定期做一次探测并保存结果,形成一个简单的历史记录。当业务出现波动时,翻出最近的基线对比,往往能快速定位到变化点。这个习惯帮我省了很多排查时间。
另外,探测结果也可以作为和网络管理方沟通的依据。当你拿着具体的跳数、地址、丢包率去反馈问题时,对方处理起来会快很多,而不是一句“网络不通”让人无从下手。
6.3 安全与合规的边界
最后得提一句,这类探测工具虽然好用,但使用时要遵守所在网络的管理规定。在企业网络里,大范围的扫描式探测可能触发安全告警,甚至被视为异常行为。排查问题时,针对具体目标做有限次数的探测是合理的,但不要拿它去做大范围的网络扫描。
还有就是,探测结果里可能包含网络拓扑信息,这些信息属于敏感内容,不要随意对外分享。我在分享排查经验时,都会把真实的地址和路径信息替换掉,只保留结构和思路。这一点在团队协作和对外沟通时尤其要注意。
说到底,连通测试和路由跟踪是两项基本功,工具本身不复杂,难的是对结果的理解和排查思路的积累。我这些年最大的体会就是:不要迷信任何单次结果,也不要跳过基础检查。把这两个工具用熟,再配合持续观察和交叉验证的习惯,大部分网络问题都能自己搞定。