动态图解 | 9分钟让你明明白白看懂Traceroute(路由追踪)的原理与实现

简介: 动态图解 | 9分钟让你明明白白看懂Traceroute(路由追踪)的原理与实现


目录


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


ICMP分3大类



ICMP报文类型

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



tracert会用到的报文如下:









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


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




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






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、由于客户端仍然还没收到端口不可达的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



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


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




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




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


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




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路由协议,全网可达就行。






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


PC1收到TTL 超时报文:


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




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


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


PC1收到的TTL 超时报文:



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




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






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


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



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


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


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


PC1收到的TTL 超时报文:



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



相关文章
|
7月前
|
Linux 网络虚拟化 Windows
网工记背命令(6)----链路聚合配置
网工记背命令(6)----链路聚合配置
68 0
|
7月前
|
存储 Web App开发 运维
原来10张图就可以搞懂分布式链路追踪系统原理
原来10张图就可以搞懂分布式链路追踪系统原理
|
网络协议 网络虚拟化
【每日一记】OSPF邻居无法建立的排错思路
【每日一记】OSPF邻居无法建立的排错思路
126 1
|
负载均衡 网络协议 算法
动态路由协议知识点梳理
动态路由协议知识点梳理
228 0
|
ARouter 网络协议 定位技术
硬核干货:6000字 30张图,带你彻底搞懂BGP动态路由!
BGP在数通这块还是比较难的,本文差不多写了5000多字,但是也只是粗略的概括了BGP的技术点,适合大家收藏去入门理解和归纳,对于详细的介绍,还希望大家去好好读读思科的书,彻底理解BGP这个协议,读英文版有困难的童鞋可以去看看华为的文档,或者H3C的文档,看起来稍微轻松点,不过还是建议读思科的书。
830 0
硬核干货:6000字 30张图,带你彻底搞懂BGP动态路由!
|
存储 数据可视化 IDE
我把「链路追踪」整明白了
我把「链路追踪」整明白了
402 0
我把「链路追踪」整明白了
|
消息中间件 Prometheus 监控
监控、链路追踪、日志的区别,傻傻分不清?
对于一个系统来说,监控、链路追踪、日志的这三者需求都是必然存在的,而有的时候我们会搞不清楚这三者相互之间是什么关系。 我之前在做系统设计的时候也考虑过,是不是有必要引入那么多组件,毕竟如果这三者完全分开每一个一项的话,就有三个组件了(事实上就是:Prometheus+Grafana、Jaeger、ELK)。
648 0
|
Web App开发 JSON 网络协议
Android网络收集和ping封装库
Android网络收集和ping封装库
1139 0
Android网络收集和ping封装库