休闲

traceroute命令详解

时间:2010-12-5 17:23:32  作者:知识   来源:综合  查看:  评论:0
内容摘要:你ping一下百度,通不通?通。但网页打不开。这事儿我遇到过不止一次。ping只告诉你IP层能不能摸到对方,至于中间那十几跳路由器长什么样、哪一跳开始丢包、数据包是不是绕了半个地球才到——它一概不管。

你ping一下百度,命令通不通?详解通。但网页打不开。命令这事儿我遇到过不止一次。详解ping只告诉你IP层能不能摸到对方,命令至于中间那十几跳路由器长什么样、详解哪一跳开始丢包、命令数据包是详解不是绕了半个地球才到——它一概不管。traceroute就是命令干这个的。

它的详解原理说穿了不复杂。IP包头里有个TTL字段,命令每经过一台路由器减1,详解减到0就丢弃,命令同时回一个ICMP超时报文。详解traceroute就利用这个机制:先发TTL=1的命令包,第一跳路由器乖乖回报;再发TTL=2的,第二跳回报;依次递增,直到目标主机响应。每一跳的IP和往返时间就这么攒出来了。

Linux下叫traceroute,Windows下叫tracert,名字差一个字母,底层行为有差别。Linux默认发UDP包,目标端口从33434开始递增;Windows发的是ICMP Echo请求。这导致同一个目标,两个系统跑出来的路径偶尔不一样——因为路由器对UDP和ICMP的处理策略可能不同,负载均衡也会让不同协议走不同链路。

看个实际输出:

$ traceroute -n google.com traceroute to google.com (142.250.72.14), 30 hops max, 60 byte packets 1 192.168.1.1 1.203 ms 1.102 ms 1.089 ms 2 10.0.0.1 5.412 ms 5.387 ms 5.201 ms 3 172.16.0.1 8.923 ms 8.876 ms 8.754 ms 4 * * * 5 108.170.245.65 15.234 ms 15.198 ms 15.102 ms 6 142.250.72.14 14.876 ms 14.752 ms 14.698 ms 

第4跳三个星号,不是挂了,是那台路由器配置了不回应ICMP超时。很多骨干网路由器都这样,怕被扫。遇到星号别急着下结论说网络断了,得看后续跳数是否恢复。

几个常用参数值得记一下。-n不做DNS反解,速度快很多,输出也干净。-I改用ICMP Echo发包,有时候UDP被墙了但ICMP能过,换一下就有结果。-T用TCP SYN,目标端口默认80,这招在防火墙只放行TCP 80/443的环境里特别管用。-m指定最大跳数,默认30,查国内目标15足够了。-q改每跳探测次数,默认3次,网络稳的话设成1能省一半时间。

有个坑我踩过:某次排查跨境专线延迟,traceroute显示第7跳到第8跳之间突然从30ms跳到280ms。直觉告诉我是国际出口堵了。但换-T重跑,延迟分布完全变了,第7跳之后直接走另一条路。原因是UDP探测包被运营商的负载均衡哈希到了不同路径。所以单次traceroute结果只能当参考,多跑几次、换协议跑,交叉验证才靠谱。

另一个常见误判是延迟。中间某跳显示200ms,不代表数据真的在那台路由器上等了200ms。路由器回复ICMP超时的优先级很低,CPU忙着转发流量的时候,回你的包可能排在队列末尾。判断瓶颈要看延迟突增之后是否持续,以及最终目标的实际响应时间。

MTR把traceroute和ping揉在一起,持续探测每一跳,实时刷新丢包率和延迟分布。排查间歇性丢包时比traceroute好用得多。装一个mtr -n -T -c 100 target,跑一百轮,哪一跳开始丢、丢多少,一目了然。

traceroute不是万能工具。它看不到不对称路由——去程和回程走不同路径是常态,你只能看到去程。它也看不到MPLS标签交换内部的路径。但在“网络不通”和“网络慢”这两个场景里,它仍然是最快能给你方向感的那个命令。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap