查看原文
其他

图解 | 9分钟看懂traceroute(路由追踪)的原理与实现

黄庆龙 网络工程师阿龙 2022-08-17

关于阿龙

一个专注于计算机网络的非著名砖家,2016年拥有HCIE认证(数通方向),全球唯一编号:3558,分享计算机网络知识,让枯燥的技术知识变得更有趣,让文字动起来,让网络变得更简单。欢迎关注,一起交流,共同进步。




大家好,我是网络工程师阿龙,一个喜欢专研网络技术的攻城狮。
今天想与大家分享一下关于traceroute的原理,希望小白看完我的文章后,能有所收获。

关于traceroute这个程序,相信很多已经工作的网工处理故障的时候,经常会用到(谁敢说,ta一次都没用过,我就把路由器吃了)

细心的同学会发现,在window系统时,使用的是tracert,而在一些网络设备Unix系统使用的traceroute,别看命令不一样,其实他们的实现过程中使用的报文也是所区别的,但大致原理都差不多,有点换汤不换药的意思。

因为traceroute主要使用的ICMP报文,所以在介绍traceroute原理之前,请允许我带大家一起回顾洗ICMP报文格式吧!龙哥,这个人没事就喜欢研究报文格式,没研究报文,我就会感觉学得很虚,似懂非懂,只有看一下报文,心里才能踏实一些。也希望能带大家一起脚踏实地,实打实地掌握技术。

(目录)


一、报文介绍


ICMP报文




关于ICMP协议,本期就不在这里具体介绍,这里只是简单回顾一下报文类型。ICMP报文大致3大类,当然也可以分为2类:查询报文差错报文。(也就说,一个ICMP报文,要么是查询报文,要么就是差错报文。)

ICMP分3大类


ICMP报文类型

ICMP 报文由首部数据组成。首部为定长 8字节(前4字节是通用部分,后4字节随类型不一样有所差异。)ICMP报文的一般格式如图所示:



tracert会用到的报文如下:




超时差错控制报文(type 11 code 0或1)







请求回显报文(type 8 code 0)








回显应答报文(type 0 code 0)








端口不可达报文(type 3  code 3)








UDP报文格式




tracert原理除了会涉及上述报文,还涉及到一个机制,就是IP报文首部的TTL字段

TTL是 Time To Live的缩写,该字段指定IP包被路由器丢弃之前允许通过的最大网段数量。TTL是IPv4报头的一个8 bit字段。TTL的作用是限制IP数据包在计算机网络中的存在的时间。TTL的最大值是255,TTL的一个推荐值是64。











二、原理图解


traceroute的实现原理,有两种方法:1、基于UDP报文实现的;2、基于ICMP报文实现。接下来分别与大家介绍一下这2种方法是如何实现的?

基于UDP报文实现




基于UDP报文的traceroute是这样实现的:让你在客户端输入 traceroute 命令+ip时, 客户端就发起一个UDP报文,使用一个大于30000的端口号(选这么端口号,目的端一般都是未使用,所以待会就收到一个端口不可达信息。)这样子,服务器端收到这个UDP报文后就会返回ICMP端口不可达的错误信息。同时,第一个数据包,TTL=1,这样第一跳路由器收到后,要转发出去时,会将TTL减一,即TTL=0, 就丢弃,然后第一跳路由器就返回一个ICMP超时的错误信息,所以,客户端通过判断收到ICMP端口不可达报文来确定数据包已到达目的地,如果是收到ICMP超时错误信息报文,说明还没到达目的地,就会将TTL加1,以此类推。

下面,龙哥将通过动态图给大家演示,traceroute基于UDP的实现原理:希望大家看完能更加直观地掌握。

1






1、客户端发送第一个端口大于30000,TTL=1的UDP数据报文,第1跳路由器收到后,查看目的地址进行转发,转发前会将TTL会减1,减完后TTL=0,就丢弃该数据包,并向客户端返回TTL超时的ICMP报文。
客户端收到,TTL超时ICMP报文,从报文里面的源地址,得到第1跳地址:10.10.10.10


2






2、由于客户端发现还没收到 端口不可达的ICMP报文,于是继续尝试发送,端口号比上次发送的进行加1,TTL也进行加1。第1跳路由器收到后,根据目的地址进行转发,转发出去时,TTL减1,减完后TTL=1。第2跳路由器收到后,查看目的地址进行转发,转发前会将TTL会减1,减完后TTL=0,就丢弃该数据包,并向客户端返回TTL超时的ICMP报文。

客户端收到,TTL超时ICMP报文,从报文里面的源地址,得到第2跳地址:20.20.20.20

3




3、由于客户端仍然还没收到 端口不可达的ICMP报文,于是继续尝试发送,端口号比上次发送的进行加1,TTL也进行加1。第1跳路由器收到后,根据目的地址进行转发,转发出去时,TTL减1,减完后TTL=2。第2跳路由器收到后,查看目的地址进行转发,转发前会将TTL会减1,减完后TTL=1, TTL不是0,路由器就继续转发。数据包终于到达服务器啦!服务器查看目的地址,就是找我的,于是继续解封装,查看UDP报文的数据部分,发现端口号不可达,于是向客户端发送一个 端口不可达的ICMP报文。

客户端收到,端口不可达的ICMP报文,确认UDP数据包已成功到达服务器了,traceroute结束,并记录源IP地址:192.168.2.1




基于ICMP报文实现




这一次,我们不再使用UDP报文了,而是使用ICMP的 回显请求回显应答 这两种报文。原理跟 前面介绍UDP差不多,换汤不换药。

基于ICMP报文的traceroute是这样实现的:让你在客户端输入 traceroute 命令+ip时, 客户端就发起一个ICMP回显请求报文,第一个数据包,TTL=1,这样第一跳路由器收到后,要转发出去时,会将TTL减一,即TTL=0, 就丢弃,然后第一跳路由器就返回一个ICMP超时的错误信息,客户端收到后,会判断是否收到ICMP 回显应答 报文?  如果还没收到,就会继续发送 回显请求报文,TTL加1进行尝试,当到底服务器后,服务器就会发送 ICMP 回显应答报文。


1




1、客户端发送第一个TTL=1的ICMP 回显请求报文,第1跳路由器收到后,查看目的地址进行转发,转发前会将TTL会减1,减完后TTL=0,就丢弃该数据包,并向客户端返回TTL超时的ICMP报文。
客户端收到,TTL超时ICMP报文,从报文里面的源地址,得到第1跳地址:10.10.10.10



2





2、由于客户端发现还没收到 回显应答 的ICMP报文,于是继续尝试发送,TTL进行加1。第1跳路由器收到后,根据目的地址进行转发,转发出去时,TTL减1,减完后TTL=1。第2跳路由器收到后,查看目的地址进行转发,转发前会将TTL会减1,减完后TTL=0,就丢弃该数据包,并向客户端返回TTL超时的ICMP报文。

客户端收到,TTL超时ICMP报文,从报文里面的源地址,得到第2跳地址:20.20.20.20




3



3、由于客户端仍然还没收到 回显应答 的ICMP报文,于是继续尝试发送,TTL进行加1。第1跳路由器收到后,根据目的地址进行转发,转发出去时,TTL减1,减完后TTL=2。第2跳路由器收到后,查看目的地址进行转发,转发前会将TTL会减1,减完后TTL=1, TTL不是0,路由器就继续转发。数据包终于到达服务器啦!服务器查看目的地址,就是找我的,于是继续解封装,查看IP数据部分(ICMP),发现是回显请求的ICMP报文,于是向客户端发送一个 回显应答的ICMP报文。

客户端收到,回显应答的ICMP报文,确认UDP数据包已成功到达服务器了,traceroute结束,并记录源IP地址:192.168.2.1


三、实验演示



拓扑图








配置步骤




配置很简单,这里不再列出。
1、配置直连接口IP地址、设备名。
2、把路由打通,我随便配了OSPF路由协议,全网可达就行。



抓包测试




1、PC1 tracert PC 2,然后再每个进方向的接口处抓包:







                             

1


R1处抓包:TTL=1 , ICMP请求报文。

PC1收到TTL 超时报文:


实现中,traceroute每次会发3个同样的数据包,这里只列举一个。

2


R1处抓包:TTL=2, ICMP请求报文。


R2处抓包:TTL=1, ICMP请求报文。


PC收到的TTL 超时报文:



3


中间的多跳路由器,收到的ICMP 回显请求报文,这里不在列举。这列举一下,PC1收到的回显应答报文:








2、在路由器上R1 tracert PC 2,然后再每个进方向的接口处抓包:







1


发送UDP报文,TTL=1 ,端口号 33434



收到TTL超时报文,并且会把刚刚请求报文的头部信息放在数据部分:



2


每一次会发3个同样的UDP报文,TTL一样,端口会再上一个基础上加1::


发送UDP报文,TTL=2,端口号 334347


第2跳路由器收到的UDP报文:TTL=1,端口号 334347



PC收到的TTL 超时报文:



3


中间的多跳路由器,收到的很多UDP报文,这里不在列举。这列举一下,PC1收到的端口不可达报文:





总结一下



基于UDP实现:使用UDP报文、TTL超时报文、端口不可达报文。

基于ICMP实现:使用ICMP回显请求报文、TTL超时报文、回显应答报文。



基于UDP实现:一般是Unix系统,网络设备。

基于ICMP实现:一般是window系统,终端设备。



原创作品不易,如果对您有帮助,麻烦给个赞,支持一下龙哥!也欢迎留言,一起交流技术!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存