Overview
本文的行文逻辑如下:
首先讲述什么是TTL
,为了更好的讲清楚TTL
的作用,我试着举了多个TTL
在真实生活帮助我们解决的问题。
你会感叹这一个小小的字段,居然有这么大的用处!
Introduction to TTL
TTL
定义于IPv4
协议中,如下
RFC
规定占8
位,即数值0-255
。
TTL
,其实就是记录了网络的路径跳数 。
The Time-to-Live field, or TTL, sets an upper limit on the number of routers through which a datagram can pass. It is initialized by the sender to some value (64 is recommended [RFC1122], although 128 or 255 is not uncommon) and decre- mented by 1 by every router that forwards the datagram. When this field reaches 0, the datagram is thrown away, and the sender is notified with an ICMP message (see Chapter 8). This prevents packets from getting caught in the network forever should an unwanted routing loop occur.
上面的话总结起来就是:
1、数据包每经过一个router
,TTL
值就减少1
2、TTL
值如果为0
,当时的router
负责返回一个ICMP
告知发送方,TTL
值耗尽
3、TTL
值一般初始为64、128、255
4、TTL
存在的目的是防止数据包进入无限循环,浪费网络带宽
不过你会不会有这个疑问:TTL
,也就是Time to Live
,看起来像是一个时间限定,一个时间单位,为啥实际上却成了允许经过的最多router
个数呢?
The TTL field was originally specified to be the maximum lifetime of an IP data- gram in seconds, but routers were also always required to decrement the value by at least 1. Because virtually no routers today hold on to a datagram longer than 1s under normal operation, the earlier rule is now ignored or forgotten, and in IPv6 the field has been renamed to its de facto use: Hop Limit.
哦,原来如此。 一开始TTL
确实表示时间,后来在实际工程中发现,正常场景下一个router
并不会持有一个数据包超过1s
,所以后面TTL
的含义就变了。IPv6
中直接"明牌",我不装了,它就叫做Hop Limit
。
是啊,TTL
就是Hop Limit
的意思哦。
Usage 1、操作系统指纹
不同的操作系统的TTL默认值不同,windows
为128
,类unix
系统为64
。
所以呢,我们可以根据抓到的包的TTL
推测对端OS
的类型。
这应该是个类unix
操作系统呢
这应该是个windows
操作系统呢
Usage 2、判断抓包在哪一端
比如,给你一个包含http
请求和响应的抓包文件。你使用wireshark
打开,你如何确定该文件是从http client
端抓取,还是从http server
端抓取的呢?
talk is cheap, show me the wireshark pcap 🐶
这个需要用到上面的知识:
不同的操作系统的TTL
默认值不同,windows
为128
,类unix
系统为64
。
It is initialized by the sender to some value (64 is recommended [RFC1122], although 128 or 255 is not uncommon
如果在你抓到的包中,看到TTL=64/128
等初始数值,大概率就是在当前端所抓。比如:
点开1
号包的详情,发现IP
协议中TTL=128
,那你大概率可以认为这些网络包是在src=10.5.28.229
这台机器上所抓。
Usage 3、识别防火墙
在讲述本小节之前,首先说一个知识:
对于外网来说,同一个连接TTL
有可能会变化;
对于内网来说,同一个链路上,TTL
基本不会变化;
这是什么意思?
对于内网来说,网络拓补是比较稳定和单一的。但是对于外网来说,同一个TCP
连接,IP
路由走的可能不太一样。这也是互联网这个名称的由来,从A
点到B
点,路线很多,每次都可能走不通的路径。
也就是说,在内网环境,如果一个连接中,发现TTL
有变化,就要引起重视,而且很可能就是内网防火墙引起的啊。
下面引用极客时间《网络排查案例课》中的一个例子,具体来说就是在一个连接的初始阶段,三次握手成功,紧接着的TLS
四次握手失败,client
被RST
。
这是在client
端抓取的包,首先我们查看server
端发来的SYN+ACK
包
然后查看貌似是server
端发来的RST
包
啊哈,通过TTL
的对比,一下子就露出了马脚,这个RST
是由中间的某台设备------防火墙发出,断掉了本次的TLS
四次握手。
Usage 4、网络超探测类工具
探测类工具,比如traceroute
,它的原理便依赖IP
协议的TTL
。
首先简单介绍一下traceroute
,它是干什么呢?和ping
探测的区别?它的原理是什么?
你应该很熟悉ping
,我们一般使用ping+host
来判断你的主机与host
是否能够联通、以及它们之间的往返时间RTT
等。
那么traceroute
呢?
它更进一步,它能详细的列出数据包在通往host
主机路上经过的每一个router
The primary difference between ping and traceroute is that while ping simply tells you if a server is reachable and the time it takes to transmit and receive data, traceroute details the precise route info, router by router, as well as the time it took for each hop.
ping
和traceroute
的原理都是发送ICMP
数据包,traceroute
之所以能列出每一跳的router
统计信息,根本离不开IP
协议的TTL
。
下面让我们来看一个例子:
shell
$ traceroute -I -q 1 www.baidu.com
traceroute: Warning: www.baidu.com has multiple addresses; using 110.242.68.3
traceroute to www.a.shifen.com (110.242.68.3), 64 hops max, 72 byte packets
1 bogon (172.24.159.253) 8.894 ms
2 36.110.17.17 (36.110.17.17) 141.932 ms
3 *
4 *
5 *
6 *
7 219.158.41.1 (219.158.41.1) 67.226 ms
8 *
9 *
10 110.242.66.182 (110.242.66.182) 24.004 ms
11 221.194.45.130 (221.194.45.130) 32.467 ms
12 *
13 *
14 *
15 *
16 110.242.68.3 (110.242.68.3) 38.774 ms
traceroute
基本列出了到达www.baidu.com
所经过每一个router
信息,它是如何做到的呢?
直接来看抓包文件
啊哈,原来如此,从本机发出的ICMP
探测包,它的IP
层的TTL
从1
开始累加。
然后依靠TTL
的原理:
每经过一个router
,TTL
减1
,当TTL
为0
,当时的router
负责返回一个ICMP Time Exceeded
的数据包。
Traceroute sends packets with TTL values that gradually increase from packet to packet, starting with TTL value of one. Routers decrement TTL values of packets by one when routing and discard packets whose TTL value has reached zero, returning the ICMP error message ICMP Time Exceeded
请看ICMP
回复包
果然返回了Time-to-live exceeded
,traceroute
就靠这种逐渐递增TTL
的方式,探测本机与目的主机之间的路径。
不过你可能还有疑惑:
1、traceroute -I -q 1 www.baidu.com
,表示traceroute
指定用ICMP
网络包探测路径,难道还有别的网络包探测方式?
2、为啥中间的几个路由都是****
,难道是出错了?
3、中间出错,为什么后面的还是有能够正常显式的呢?
......
说到这里,我们已经明白,TTL
是实现traceroute
功能的底层支持之一,但关于traceroute
本身还有很多东西可以深究,后面我会专门写文章讨论,敬请期待😏
Summary
我相信通过我的介绍,你会稍微了解TTL
的作用了吧。
那么你还有没有其他应用场景呢,欢迎分享给我~
Reference
- 📚《TCP/IP Illustrated》
- 极客时间《网络排查案例课》
- wiki