本文介绍一个linux命令–traceroute的作用和原理。
1.traceroute命令的作用
tracerouter是linux的一个命令,顾名思义,是用来跟踪包走过的路径的,使用起来很简单,不加任何参数的话:
traceroute target-ip
这个命令可以查看数据包从本机到target-ip经过的路由路径,比如:
traceroute 223.87.26.49
traceroute to 223.87.26.49 (223.87.26.49), 64 hops max, 52 byte packets
1 117.174.122.1 (117.174.122.1) 4.005 ms 4.929 ms 4.498 ms
2 221.182.42.129 (221.182.42.129) 4.088 ms 5.518 ms 5.312 ms
3 223.87.26.33 (223.87.26.33) 5.985 ms 5.732 ms 6.568 ms
4 223.87.26.49 (223.87.26.49) 5.941 ms 4.790 ms 6.514 ms
可以看到从源主机到目标主机 223.87.26.49,需要经过4个路由器,第一个路由器是117.174.122.1,发了三个包去试探路线,包从去到回需要的时间分别的 4.005 ms,4.929 ms, 4.498 ms,以此类推,最后一个路由器是 223.87.26.49,也就是目的地。
2.traceroute的原理
traceroute是基于ICMP(Internet Configuration Message Protocol)协议的,这个协议是用来检测网络的状态和性能的,比如测试网络是否可达,主机是否可达,网络传输时间等指标,具体内容可以参考文章Wireshark分析ICMP协议。
我们熟悉的ping命令也是基于ICMP的,ping是基于ICMP的查询报文的,在ICMP的基础上加上一些封装,比如封装Sequence Number等信息,可以用来跟踪ping报文的顺序。
traceroute也是基于ICMP协议的,不过它是基于ICMP的错误报文的,也就是利用ICMP错误报文的机制来检测路由的路径,具体的说是着两种错误报文:
- 传输期间生存时间为0(TTL=0),当路由器收到一个过期的报文后,会向源主机发送这个类型的ICMP报文
- 端口不可达,当目标主机收到一个不存在的端口时,就会向源主机回复一个端口不可达的错误报文
预备知识:
1.由于要有借助端口,所以我们是需要传输层的协议支持的,traceroute借助的是UDP协议。
2.TTL(Time To Live)是数据包在传输期间的生存时间,数据包每经过一个路由器,TTL就会减1。
3.traceroute的具体过程
有了上述的铺垫,让我们来看一下具体的过程具体过程是:
- Step1.源主机src host(172.20.5.31)发送一个UDP包要到目标的主机(223.87.26.49),设置TTL=1
- Step2.由于不在同一个子网中,源主机所处的子网的默认网关会将这个包发到路由器Router1。到了路由器Router1拿到包之后,将此包的TTL减1,发现TTL等于0了,就给源主机发送ICMP错误报文,表示这个包已经没有生存时间了。