V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
huangcjmail
V2EX  ›  程序员

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

  •  
  •   huangcjmail · 360 天前 · 1942 次点击
    这是一个创建于 360 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我理解 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
    ➜  ~ 
    
    14 条回复    2023-11-28 11:33:04 +08:00
    pagxir
        1
    pagxir  
       360 天前 via Android
    明显是没理解。一个是 64 减到 49, 一个是从 128 减到 113 ,当然是无法直接比较
    Songxwn
        2
    Songxwn  
       360 天前
    默认的 TTL 是看系统是什么,64 128 255 都是常见的。然后每经过一个三层路由器转发就会减去 1 。 你 ping github ,应该就是 128-113 ,经过了 14 跳路由转发。

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

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

    ping: https://fasionchan.com/network/icmp/ping/
    traceroute: https://fasionchan.com/network/icmp/traceroute/
    julyclyde
        14
    julyclyde  
       359 天前
    @mantouboji traceroute 和这里的不一样
    ping ICMP ECHO 是由目标机器发的,TTL 是由它指定的
    而 traceroute 的 ICMP TTL exceed 消息是由中间路由回复的,这个回复在整个路径里“属于第几步”是由 traceroute 自己计算的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5835 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 02:15 · PVG 10:15 · LAX 18:15 · JFK 21:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.