顺藤摸瓜:Traceroute 到底是怎么工作的?

你在排查网络故障时,大概率用过这个命令:在终端敲下 traceroute baidu.comWindows 上是 tracert),然后屏幕上便开始一行行地跳出 IP 地址和延迟。

看着这一行行数字,就像是一场网络世界的沿途打卡,清晰地记录了你的数据包从电脑出发,跨越千山万水到达目的地的全过程。

但你有没有想过一个问题: IP 协议本来是一个只管发、不管中间过程的无连接协议,沿途的路由器也只会默默帮你转发数据包,从来不会主动告诉别人自己是谁。Traceroute 凭什么能把沿途所有的路由器一个不漏地出来?

今天,我们就来揭开这个网络世界借力打力的神奇探秘工具。


一、 核心秘密武器:TTL(生存时间)

Traceroute 的整个工作原理,核心就围绕着 IPv4 报文头部的一个关键字段——TTLTime to Live,生存时间)

很多人一看到“Time to Live”,以为它代表的是时间(比如几秒钟)。其实不然,在网络包里,TTL 是一个整数(最大 255),代表这个数据包还能被转发多少次(也就是最多能跳过多少个路由器)

当你的电脑发送一个数据包时:

  1. 你可以给这个包设定一个初始 TTL(比如设为 1)。
  2. 数据包每经过一个路由器(行业里叫一” / Hop),负责转发的路由器就会把 TTL 的值 1
  3. 关键点来了:如果某个路由器把 TTL 减到了 0,它就会认为这个包已经迷路、在网络里死循环了。于是,这个路由器会无情地把这个包丢弃,并顺便给源头(你的电脑)回一封信。
  4. 这封回信是一个 ICMP 差错报文,专业术语叫 超时(Time Exceeded,类型 11在这封回信里,会大方地写上:我是哪个路由器,我在这里把包销毁的(带上该路由器的 IP 地址)。

Traceroute 就是利用这个机制,像打桩一样把沿途的路由器一个个逼问出来的。


二、 Traceroute 的具体工作流程

Traceroute 并不是一下子就能查出所有路径的,它是一个步步为营、逐个探测的过程:

  • 第一步:探测第 1 跳(离你最近的网关,如家里的路由器或光猫)
    • Traceroute 发送一个探测包, TTL 设为 1
    • 包刚到达你家里的路由器,路由器一看:哎,TTL 1,减 1 之后变成 0 了!
    • 路由器丢弃该包,并给你的电脑回了一封 ICMP 超时信
    • 你的电脑收到回信,一看发信人的 IP,记录下来:哦,第一跳是 192.168.1.1,耗时 2ms
  • 第二步:探测第 2 跳(运营商的汇聚路由器)
    • Traceroute  TTL 设为 2,再次发送探测包。
    • 第一个路由器收到后,TTL 1 变成 1,没到期,它把包转发给第二个路由器。
    • 第二个路由器收到后,TTL 1 变成 0,超期!
    • 第二个路由器丢弃包,并回信:我是 10.0.0.1
    • 你的电脑记录下第二跳。
  • 345 ……(以此类推)
    • Traceroute 每次把 TTL 1TTL = 3, 4, 5……),直到这个数据包成功抵达真正的目的地
    • 当数据包到达终点(例如百度服务器)时,终点服务器发现:诶?这是发给我的包呀!由于没有超时,它不会回超时信,而是会根据你发的协议类型回应一个端口不可达或者“Ping 响应
    • Traceroute 收到终点的回信,就知道:全剧终,目的地到了。

三、 细节:UDP 还是 ICMP

早期的 Traceroute(在 Unix/Linux 系统中默认)使用的是 UDP 协议

  • 它向目标主机的一个极不可能开放的高位端口(例如 33434 开始的端口)发送 UDP 数据包。
  • 这样当包最终到达目的地时,目的主机由于找不到对应服务的端口,会回一个“ICMP 端口不可达的包,Traceroute 看到这个回信就知道到终点了

而在 Windows tracert 中,默认使用的是 ICMP 协议(发送 ICMP Echo Request,也就是 Ping 请求)。

在现代网络中,为了穿透防火墙,很多高级的网络诊断工具甚至支持发送 TCP SYN 来追踪,因为很多防火墙会过滤 UDP/ICMP,但对网页常用的 TCP 80/443 端口通常会网开一面。


四、 为什么有些路由会显示 * * *(超时无响应)?

你在跑 Traceroute 时,经常会看到某一行全是星号 * * *。这并不意味着这段网络断了,通常是由以下原因造成的:

  1. 安全策略(ICMP 限速或禁 Ping: 大量的路由器(特别是运营商骨干网的路由器、防火墙)为了防止被 DDoS 攻击或出于隐私考虑,故意设置了不回复 ICMP 超时报文。包其实顺利通过了,但路由器选择默默无闻,不回信,所以 Traceroute 拿不到它的 IP
  2. 中间设备性能或丢包: 确实发生了偶发性丢包,或者该路由器太忙来不及回信。
  3. 去程和回程路径不对称: 互联网极其庞大,去的时候走 A 路线,回的时候走 B 路线,导致统计数据出现偏差。

总结

Traceroute 的工作原理堪称计算机网络里借力打力的经典范本:

  • 它不强求沿途的路由器主动配合。
  • 故意制造“TTL 超时的错误,利用路由器大公无私回传的 ICMP 超时错误包,顺藤摸瓜地把每一跳的 IP 地址和延迟记录下来。

就像是在黑暗的迷宫里,你不断扔出倒计时不同的探测器,根据爆炸时传回的回音(ICMP 超时信),精准定位出沿途到底站了多少个岗哨。掌握了它的原理,下次网络卡顿时,你就能一眼看出究竟是卡在家里的路由器,还是卡在运营商的骨干网了。

评论

此博客中的热门博文

深度解析:Xray 核心技术 REALITY、Vision、xhttp 与 anytls 的协同工作原理

重新定义流媒体:Media over QUIC (MoQ) 为何是下个时代的终解?

gemini转发国内的部署教程