TTL 防止报文无限打转
TTL 是 IP 头里的跳数上限:报文每经过一台路由器就减一,减到零会被丢弃,并由该路由器回一个 ICMP 超时报文通知源端。它的主要用途是防止路由环路让报文永远循环,同时也被 traceroute 用作逐跳探测的基础。不同系统给新发报文设置的默认值不一样,所以 ping 结果里的剩余 TTL 常被拿来粗略推断对端是什么系统。
常见默认值
| 系统 | 默认 TTL | 说明 |
|---|---|---|
| Linux | 64 | 由内核参数 ip_default_ttl 控制 |
| Windows | 128 | 可通过注册表调整 |
| 网络设备 | 255 | 部分路由协议对 TTL 有额外要求 |
观察与修改
观察与修改
ping -c 1 8.8.8.8 | grep ttl # 看剩余 TTL,据此粗略推断跳数
sysctl net.ipv4.ip_default_ttl # 查本机默认 TTL 设置
tcpdump -nn -v 'icmp' -c 5 | grep -i ttl # 抓包看实际报文字段
sysctl -w net.ipv4.ip_default_ttl=64 # 临时修改,重启后失效
traceroute -n -m 5 8.8.8.8 # 利用 TTL 递增确认前几跳地址用剩余 TTL 推断对端
| 剩余值 | 常见对应 | 可靠性 |
|---|---|---|
| 64 附近 | Linux 与多数类 Unix 系统 | 中等,虚拟化与中间设备可能改写 |
| 128 附近 | Windows 系统 | 中等,经过的跳数越多推断越不准 |
| 255 附近 | 网络设备或特殊配置 | 中等,需结合其它特征一起判断 |
| 明显偏小 | 经过跳数较多或初始值被改过 | 低,仅作参考不要作为结论依据 |
典型使用场景
- 配合 ping 粗判对端系统类型,缩小排查范围
- 理解 traceroute 的工作原理,解释为什么它能逐跳显示路径
- 排查路由环路:TTL 超时报文集中出现是环路的重要线索
- 做网络分段演练时确认报文经过的最大跳数是否符合预期
- 排查「小包正常、大包不通」时结合 ICMP 超时与分片提示一起分析
注意区分两个同名的 TTL:IP 头里的 TTL 是跳数上限,DNS 记录里的 TTL 是缓存秒数,二者毫无关系。排障时对话里混用会造成理解偏差,最好明确写成 IP TTL 或 DNS TTL。
IPv6 把同一字段改名为跳限 Hop Limit,作用与 IPv4 的 TTL 完全一致,只是名字不同;Windows 想改默认值要动注册表里 Tcpip\Parameters 下的 DefaultTTL,改完需重启才生效,而 Linux 用 sysctl net.ipv4.ip_default_ttl 临时调整、写进配置文件才持久。