- traceroute介绍
Traceroute是一种常规的网络分析工具,用来定位到目标主机之间的所有路由器。基本的原理是IP路由过程中对数据包TTL(Time to Live,存活时间)的处理。当路由器收到一个IP包时,会改动IP包的TTL(头部检验和checksum变化)。每收到一个包,检查这个 的TTL是否是0或非0,为0时即进行丢弃,不再进行转发。
Traceroute目前有两种实现方法,即基于UDP和ICMP。基于UDP的实现一般是在linux环境下,即网络设备;而基于ICMP的一般为windows环境,大多是终端设备。
- 基于UDP实现
在客户端输入 traceroute ip, 客户端就发起一个UDP报文,使用一个大于30000的端口号(选这么端口号,目的端一般都是未使用,到达目标主机后就收到一个端口不可达信息。),一般从33434端口开始。目标主机收到这个UDP报文后就会返回ICMP端口不可达的错误信息。同时,第一个数据包,TTL=1,这样第一跳路由器收到后,要转发出去时,会将TTL减一,即TTL=0, 就丢弃,然后第一跳路由器就返回一个ICMP超时的错误信息,所以,客户端通过判断收到ICMP端口不可达报文来确定数据包已到达目的地,如果是收到ICMP超时错误信息报文,说明还没到达目的地,就会将TTL加1,继续发送UDP报文,以此类推。
ICMP报文类型
ICMP端口不可达报文
ICMP超时报文
下面根据一个例子介绍基于UDP的traceroute原理
如上图所示,traceroute 10.20.25.142经过一个路由(网关)便找到了目标主机,下面对报文进行分析。
刚开始会发送以33434为目的端口的UDP报文,且连续发送多个,每三个UDP报文的TTL值相同,即前三个UDP报文的TTL值为1,后面三个的UDP报文的TTL依次加1,以此类推。
在10.20.73.254路由收到TTL值为1后,会将TTL值减去1,此时10.20.73.254不是目标主机,因此会发送三个ICMP超时报文给客户端,且ICMP携带的UDP报文中的目的端口依次为33434/33435/33436。
因此,客户端会进行记录10.20.73.254为到达目标主机的其中一条路由。
由于刚开始客户端发送多个UDP报文,所以TTL=2的UDP报文会继续进行探测,寻找目标主机。
在10.20.73.254收到TTL=2的报文后,会将TTL减1,此时TTL值为非0,因此会继续转发,此时10.20.73.254可以找到目标主机10.20.25.142,因此目标主机会收到三个TTL值为1的UDP报文,但此时端口没有在使用,因此会回三个端口不可达的报文。此时端口为33437/33438/33439。
此时客户端收到端口不可达报文,即确认找到了目标主机。
由于路由和目标主机回复报文的延时误差,因此会出现目标主机回复客户端比路由回复的ICMP报文快。且由于发送多个UDP报文,因此可能会出现目标主机二次回复ICMP端口不可达的报文,但不会出现太多。可根据接收ICMP超时报文和端口不可达报文的目的端口号来判断相关路由的具体位置。
由此确认10.20.73.166到目标主机10.20.25.142的路径为
- 基于ICMP实现
ICMP实现traceroute是根据回显请求和回显应答这两种报文。原理跟前面介绍UDP差不多,换汤不换药。都是根据TTL值来判断是否进行转发,TTL值为0不再转发,进行丢弃,非0即进行转发,继续寻找目标主机。找不到目标主机时,路由会发送ICMP超时报文给客户端;在确认找到目标主机后,目标主机会回复Echo reply回显应答报文。和UDP报文原理类似,客户端发送和接收的ICMP报文也是以3个报文共同一个TTL值来处理的。
下面使用一个简单的例子进行介绍基于ICMP的traceroute原理
windows环境下的traceroute命令为tracert,即tracert ip。
客户端会发送3个回显请求报文(Echo request),此时携带的TTL值为1。
20.20.55.254收到TTL为1的ICMP报文后,会将TTL值减1。此时TTL值为0,即不再转发,进行丢弃,并回复客户端一个ICMP超时报文。
ICMP是发送一个接收一个报文,不是连续的发送3个接收3个报文。
客户端在收到ICMP超时报文后,发现目标主机并未发现,于是将TTL值加1,继续发送ICMP回显请求报文。
此时20.20.55.254收到TTL为2的报文,将TTL减1后,TTL值非0,于是继续转发。20.20.136.49收到了客户端的回显请求报文,则回复回显应答报文(Echo reply)。由于ICMP还是继续以3个报文为单位发送和接收的,因此目标主机回复3个回显应答报文给客户端。客户端收到后,则发现已经找到了目标主机,因此不再发送回显请求报文。
因此,在接收到回显应答报文对应的请求报文中,根据TTL值即可判断经过了多少个路由,便可绘制出客户端到目标主机的相关路径。
- 相关说明
有些数据包已经到达目标服务器了,但是因为安全问题大部分的应用服务器都不提供UDP服务(或者被防火墙挡掉),所以我们拿不到服务器的任何返回,因此中间路径会丢失,traceroute理所当然的认为还没有结束,一直尝试增加数据包的TTL,但增加到一定值后便不再增加,默认为30。