TTL 是 IP 包里的一个计数字段,全称 Time To Live。它的作用是防止数据包在网络里无限循环。
核心机制
TTL 是一个 8 位字段,理论范围 0-255。每经过一个路由器(一跳),TTL 就减 1。当 TTL 减到 0 时,路由器丢弃这个包,并向源地址发回一个 ICMP "Time Exceeded" 消息。
所以 TTL 的实际含义是:这个包最多还能走多少跳。
为什么需要 TTL
网络里可能存在路由环路------包在几个路由器之间来回打转。如果没有 TTL,这种包会永远占用带宽和路由器资源。TTL 给了它一个硬性寿命上限,走够跳数就自动消亡。
常见的初始 TTL 值
不同操作系统的默认初始 TTL 不一样:
| 系统 | 默认 TTL |
|---|---|
| Linux | 64 |
| Windows | 128 |
| 部分网络设备 | 255 |
可以用这个特性做粗略的 OS 指纹识别:ping 一个主机,看回包的 TTL,如果收到 57,那初始值大概率是 64,中间经过了 7 跳。
TTL 的两个经典用途
1. traceroute(路由追踪)
traceroute 的原理就是故意利用 TTL:先发 TTL=1 的包,第一跳路由器把它减到 0,回一个 ICMP 超时消息,这样就暴露了第一跳的 IP。然后发 TTL=2 的包,暴露第二跳,依次递增,直到到达目标。这样就能逐跳画出完整路径。
2. 限制作用范围
在组播、BGP 邻居建立等场景里,有时会故意把 TTL 设成 1,让包只能在本链路内传输,出不了直连设备。这是一种简单的安全边界控制。
一个容易混淆的点
TTL 和 DNS 里的 TTL 是两回事。DNS TTL 指的是记录在 DNS 缓存里能存多久,单位是秒。IP 的 TTL 是跳数计数,两者只是名字撞了,机制完全不同。

traceroute 第 16 跳之后全是 *,说明后续路由器不回应 ICMP 超时(很多骨干网设备默认关闭这个功能),并不代表包没过去。
有几种情况会让 TTL 反推和 traceroute 对不上:
1. 初始 TTL 不一定是 64。 如果百度那台服务器是 Windows(初始 128),那 128 - 48 = 80 跳,显然不合理,说明它不是 Windows。如果是某种网络设备(初始 255),255 - 48 = 207,更不可能。所以基本可以确定初始值是 64。
2. traceroute 的 * 不代表没经过。 中间那些 * * * 的路由器只是不回复 ICMP 超时,但包确实从它们身上过去了。TTL 计数把这些"沉默的跳"也算进去了。
3. 去程和回程路径可能不对称。 traceroute 测的是去程路径,而 ping 的 TTL 是回包里的值,反映的是回程路径的跳数。两者可能不一样。
4. 同一域名可能解析到不同 IP。 你 ping 和 traceroute 虽然都显示 124.237.177.164,但百度有多台服务器,不同时刻可能解析到不同地址,路径也可能不同。