一个关于 ping 命令中, ttl 的疑问

2023-11-27 17:40:13 +08:00
huangcjmail  huangcjmail

我理解 ttl = 系统设置的缺省值 - 路由跳数。也就是说 ttl 越大,离目标服务器的跳数越近。 但是今天我 ping 了 baidu 和 github ,结果如下,baidu ttl = 49 、github ttl = 113 。如果按照我的理解,那么到 github 服务器的跳数比 baidu 的少了很多,有点反直觉。目前猜测有 2 个可能:

  1. 事实就是如此,因为网络拓扑的原因,到 github 的跳数就是少。
  2. 默认 ttl 缺省值会随着域名不同而不同。

有大佬知道这是为啥吗?

➜  ~ ping baidu.com
PING baidu.com (39.156.66.10) 56(84) bytes of data.
64 bytes from baidu.com (39.156.66.10): icmp_seq=1 ttl=49 time=33.4 ms
64 bytes from baidu.com (39.156.66.10): icmp_seq=2 ttl=49 time=33.5 ms
64 bytes from baidu.com (39.156.66.10): icmp_seq=3 ttl=49 time=33.2 ms
^C
--- baidu.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 33.238/33.385/33.513/0.239 ms
➜  ~ 
➜  ~ 
➜  ~ 
➜  ~ ping github.com
PING github.com (20.205.243.166) 56(84) bytes of data.
64 bytes from github.com (20.205.243.166): icmp_seq=1 ttl=113 time=80.5 ms
64 bytes from github.com (20.205.243.166): icmp_seq=2 ttl=113 time=79.9 ms
64 bytes from github.com (20.205.243.166): icmp_seq=3 ttl=113 time=79.7 ms
64 bytes from github.com (20.205.243.166): icmp_seq=4 ttl=113 time=80.2 ms
^C
--- github.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 79.788/80.139/80.547/0.407 ms
➜  ~ 
2056 次点击
所在节点   程序员  程序员
14 条回复
pagxir
pagxir
2023-11-27 17:48:26 +08:00
明显是没理解。一个是 64 减到 49, 一个是从 128 减到 113 ,当然是无法直接比较
Songxwn
Songxwn
2023-11-27 17:50:16 +08:00
默认的 TTL 是看系统是什么,64 128 255 都是常见的。然后每经过一个三层路由器转发就会减去 1 。 你 ping github ,应该就是 128-113 ,经过了 14 跳路由转发。

TTL 和域名无关,是在 IP 报文里面。
dier
dier
2023-11-27 17:54:29 +08:00
很明显 ping baidu 的域名 TTL 值是 64 ,ping github 的域名 TTL 值是 128 ,两个算下来经过的跳数其实是一样的。
huangcjmail
huangcjmail
2023-11-27 17:55:57 +08:00
@pagxir
@Songxwn 我这是一台机器上 ping 的。默认 TTL 应该是一样的。不同机器是这个结果我就不会有这个疑问了😂
dier
dier
2023-11-27 17:56:43 +08:00
另外,如果 30 跳都找不到目标的话基本上就通不了了。TTL 值的作用只是为了防止数据包一直在网络设备之间流转而设置的一个过期时间。
dier
dier
2023-11-27 17:57:14 +08:00
@huangcjmail 这个 TTL 值取决于目标服务器,不是取决于发起端
huangcjmail
huangcjmail
2023-11-27 18:00:49 +08:00
@dier 原来是这样
storm666
storm666
2023-11-27 18:11:19 +08:00
不同操作系统返回的 ttl 值不一样,例如 windows 通常是 128 ,linux 通常是 64 ,逐跳减 1 ,因此你可以通过返回的 ttl 值大概推断出目标主机的操作系统。
fangpeishi
fangpeishi
2023-11-27 18:29:44 +08:00
截图中显示的 TTL ,是 ICMP 回包的 TTL ,所以初始值可能不同。

给楼主出个题,如何推断出目标回包初始的 TTL 值。
虽然初始值有默认值,但是如果被修改过呢。
lwjef
lwjef
2023-11-27 21:25:49 +08:00
ping 114.114.114.114 可以加深 ttl 来自目标这个印象。
mantouboji
mantouboji
2023-11-27 23:33:03 +08:00
难道你不知道 traceroute 命令配合服用?
huangcjmail
huangcjmail
2023-11-27 23:41:53 +08:00
@mantouboji 提问之后确实 traceroute 了,显示跳数确实是在合理范围内,之前都忘记有这个命令了。主要还是没搞懂是服务端决定 TTL ,当时如果看到 traceroute 结果肯定更懵逼了。
hxysnail
hxysnail
2023-11-28 08:54:30 +08:00
ping 命令显示的 ICMP 回包的信息,回包是目标服务器发的,默认 TTL 是操作系统协议栈决定的,所以会有说差异。探测网络跳数,通常用 traceroute 或 mtr 命令。最后发两篇关于 ping 和 traceroute 命令原理的博客(自己写的)供大家参考一下:

ping: https://fasionchan.com/network/icmp/ping/
traceroute: https://fasionchan.com/network/icmp/traceroute/
julyclyde
2023-11-28 11:33:04 +08:00
@mantouboji traceroute 和这里的不一样
ping ICMP ECHO 是由目标机器发的,TTL 是由它指定的
而 traceroute 的 ICMP TTL exceed 消息是由中间路由回复的,这个回复在整个路径里“属于第几步”是由 traceroute 自己计算的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/995673

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX