凌晨两点,我盯着终端里滚动的报错日志,第七次怀疑是网络问题。同事路过,瞄了一眼屏幕,敲下trace,回车。三秒后,他指着输出说:“看,请求在第三个节点超时了,跟网络没关系,是那个节点的防火墙在丢包。”我愣住。一条命令,比我翻半小时文档管用。
trace,全称是traceroute(Windows下叫tracert),干的事特别朴素——把你电脑到目标服务器之间,每一跳(路由器)的延迟和路径,挨个列出来。像顺着快递单号查包裹,每一站几点到、停多久、有没有丢件,一目了然。
怎么做到的?它靠的是IP协议里的TTL字段。每过一台路由器,TTL减1,减到0就丢弃包,并回传一个ICMP超时消息。第一次发TTL=1的包,第一跳回你;第二次发TTL=2,第二跳回你。依次递增,直到到达目标。这法子笨,但可靠。就像你挨个敲门问路,每敲一家,门里的人告诉你他邻居在哪儿。
可这命令有个毛病——结果经常“脏”。中间某跳超时,显示三个*,不代表网络断了,可能是那台路由器不响应ICMP,或者限速了。我有次排查视频会议卡顿,trace出来第三跳全是星号,吓得以为骨干网故障,结果换了个公共DNS再试,路径完全正常,就是企业内网那台设备懒得理你。所以看到星号,先别慌,多测几次,换个源IP试试。
真正有用的细节藏在延迟数字里。正常情况,每一跳延迟是累加的,比如第5跳20ms,第6跳22ms,平滑递增。但如果你看到第5跳20ms,第6跳突然变成150ms,第7跳又回到25ms——这就有意思了。说明第6跳那台路由器把你包“扣”了130ms,大概率是它拥塞,或者在做QoS整形。这种跳变,比任何带宽测试工具都更早暴露问题。
还有个技巧,很多人不知道。用trace -I(ICMP模式)和trace -U(UDP模式)结果可能不同。因为有些中间设备对UDP探测包更宽松,对ICMP则直接丢。反过来,某些防火墙对ICMP限速,UDP反而通畅。所以排查时,两种模式交叉验证,能过滤掉“假故障”。我见过一个案例,业务方说跨城专线丢包,trace用UDP模式全程无丢包,但用ICMP模式在某个节点丢30%。最后发现是运营商那台设备对ICMP做了策略限速,数据面完全正常。要是只信一种结果,就得白白换条高价专线。
trace还有个冷门用法——看路由绕路。数据包从北京到上海,正常走直连光纤,延迟30ms。如果trace出来发现先跑到广州再折回上海,延迟飙到80ms,那就是运营商内部路由策略出了问题,或者BGP路由表被污染。这时候别自己折腾,把trace结果存下来,直接找运营商报障,附上路径截图,对方基本没法推诿。这比你说“网慢”有效得多。
当然,trace不是万能的。它只能看到三层路径,看不到二层交换机和负载均衡器内部。云环境里,很多虚拟化网络设备不响应探测,trace结果会断断续续,看着像故障,其实数据流正常走。这时候得配合mtr(持续抓包版trace)或者看应用层日志。别一根筋。
说到底,trace就像给网络拍X光片。它不治病,但能让你知道病在哪。下次再有人跟你说“网络卡”,别急着重启路由器。先敲一条trace,看看那根看不见的管子里,到底堵在哪个阀门上。省下的时间,够你多睡两小时。