mtr和traceroute的区别,以及为什么traceroute不显示路径mtr却可以显示路径
最近工作主要都是网络策略的开通和网络测试,在测试的过程当中发现当网络不通时,用traceroute来看路由路径的时候总是无法显示出来,于是就换了个工具-mtr,发现mtr可以正常显示出路由路径,帮助我解决了网络测试当中遇到的很多问题,十分的方便,于是想要记录一下,写一篇有关traceroute和mtr两个网络测试工具的区别和原理,达到融会贯通的效果。
首先先放两张我在测试过程当中两个工具的测试结果,可以看出两者的结果存在的区别,很明显mtr要比traceroute详细并且好用很多,于是我就上网开始查阅资料,想弄清两者的区别到底是什么。


下面通过网上查阅到的资料,来解释下有关两者的区别,以及一些原理:
如果你traceroute或者mtr两个工具都用过,肯定会比较偏向于使用mtr,因为总感觉traceroute不太好用,经常会出现***的情况。比如我们用IP: 61.135.185.32来做个测试,
使用traceroute得到的结果是:

但是如果用mtr:

通过mtr,我们可以很明确的看到从源到目的IP一共有12跳。但是traceroute却是一堆的******************
在继续下面的内容之前,要先讲一下traceroute和mtr等这种网络探测工具的实现方法:
它们通过发送具有较小ttl的探测数据包,然后侦听来自网关的ICMP“TTL=0”的答复,来跟踪IP数据包到达Internet上的路由。我们从ttl为1开始探测,然后增加1,直到得到ICMP“端口不可达”(或TCP重置或icmp应答或无响应等)。大致过程如下图:

主机1.1.1.10最后收到了1.1.1.1、2.2.2.2、2.2.2.10的icmp响应包,也就相当于知道了发送数据包经过的路由。
知道了实现原理,现在我们来探究它们之间的区别,目前最容易想到的办法:抓个包。
于是traceroute的数据包如下:(traceroute -n 61.135.185.32)

从数据包中可以看到:
traceroute默认请求使用UDP协议,而响应是ICMP协议。
traceroute发包方式是每次同一个TTL数据包连着发三次,并逐步增加TTL。而且请求端口和目的端口一直在变化。
再看一下mtr的数据包:(mtr -n -c 3 61.135.185.32)

从数据包中可以看到:
mtr默认请求和响应都是ICMP协议。
mtr发包方式是先每次发送一个逐步增加TTL的数据包,再循环3次。
这样对比下来之后,他们之间的区别显而易见。
但是你可能还会有下面几个疑问:
为什么上图traceroute第10跳之后,一直都是*?
为什么发送UDP请求包,会响应ICMP包?
为什么目的是同一个IP,traceroute和mtr返回的路径会不一样?
问1:为什么上图traceroute第10跳之后,一直都是*?
从上面的抓包可以看出来,traceroute和mtr的发包方式是不一样的,traceroute是udp包,mtr是icmp包。于是我们测试用traceroute发送icmp包。通过man命令得知使用参数 -I(大写的i)可使用ICMP探测。于是执行:
traceroute -n -I 61.135.185.32

神奇的发现结果和mtr一样了!看到这里,才打消我对traceroute的偏见。原来不是traceroute不好用,而是我使用的方法不当。至此,回到问题,我们大胆推测:从第10跳之后,第11跳这个路由器屏蔽了对UDP包的响应(甚至连ICMP都屏蔽了),而第12跳到了目标IP,它不是路由器,所以收到UDP之后,会尝试寻找主机中对应端口的UDP服务,因为没有此UDP服务,所以目的主机一般会通过icmp协议响应端口不可达,但这里没有返回任何信息(可能是安全策略),到第13跳,还是到了目的主机,依旧没有响应,如此直到第30跳结束(traceroute默认最多30跳)。接下来做个测试来验证假设:
首先在虚拟机192.168.2.104上tranceroute我的一台云主机198.x.x.82:

云主机上没有任何限制,所以可以看到tranceroute正常显示,一共有16跳。接下来我在云主机上配置了一条iptables规则如下:

我们再在虚拟机192.168.2.104上执行tranceroute命令,结果显示如下:
https://pic4.zhimg.com/80/v2-bb13dd1426c5a31a34edd4692605853f_720w.jpg
可以看到第16跳已经显示为了,且后续的结果均为,因为后面的请求都到了这台云主机,在云主机上抓包如下:

共收到 ttl=1到ttl=15的数据包各3个,即对应了tranceroute中的16-30的*。这足以证明之前的假设成立。
问2:为什么发送UDP请求包,会响应ICMP包?
这个东西,其实我也很好奇,但是静下心来想一想,这个ICMP是路由器发送的,并不是我们比较熟悉的主机。所以我们大胆推测:路由器在收到TTL为1的数据包时,会把该数据包TTL-1,此时TTL为0,就不再往后转发了,而是给源主机发送一个ICMP响应,告诉主机这个数据包TTL为0了也没到达目的地址。我们做个测试:使用nping命令发送UDP包给目标主机,然后设置TTL为一个达不到目标主机的值,观察到:
果真收到了路由器发来的ICMP响应。再试一下其他协议:

果然证明了刚刚的假设。路由器不管是什么协议,只要TTL在它那为0了,它就会给源主机发送ICMP响应。当然,前提是路由器没有禁用这个功能。
问3:为什么目的是同一个IP,traceroute和mtr返回的路径会不一样?
上面可以看到traceroute默认使用的UDP协议,返回的内容和mtr不一样,将traceroute改为icmp的方式探测,结果就一样了。这说明使用不同的协议数据包,路由器的转发会有区别。这时就引起了我的思考了,我们平时往往是因为业务服务出现问题了,才会用mtr去排查网络问题。所以假设你的业务是用HTTP协议的的话,它底层用的是tcp,而不是icmp。那么你就应该用tcp的方式探测,否则你得到的结果很可能是不准确的。我们用mtr中的tcp模式探测:
mtr -n -T 61.135.185.32

发现与mtr默认的icmp探测的结果是不一样的。这再一次证明了之前的理论:使用不同的协议数据包,路由器的转发会有区别。*
mtr和traceroute的区别,以及为什么traceroute不显示路径mtr却可以显示路径的更多相关文章
- Tp框架查询分页显示与全部查询出来显示运行时间快慢有区别吗?
8:08:01 青春阳光 2017/4/7 8:08:01 大神在吗? Tp框架查询分页显示与全部查询出来显示运行时间快慢有区别吗? 青春阳光 2017/4/7 8:08:20 还有个问题,上传到pu ...
- c#关于路径的总结(转) 虚拟路径波浪号~和斜杠/的区别
c#关于路径的总结(转) 来源:http://www.cnblogs.com/yugongmengjiutian/articles/5521165.html 前一段时间写代码时经常遇到获取路径问题 ...
- linux下vi与vim区别以及vim的使用-------vim编辑时脚本高光显示语法
vi与vimvi编辑器是所有Unix及Linux系统下标准的编辑器,他就相当于windows系统中的记事本一样,它的强大不逊色于任何最新的文本编辑器.他是我们使用Linux系统不能缺少的工具.由于对U ...
- 网络路径排查工具使用/原理浅析(MTR、traceroute、tracepath、windows下besttrace)
在请求网络资源获取缓慢或者有丢包过程中.经常会使用到网络路径探测工具.linux 下最常用的有mtr.traceroute.tracepath 等. 你是否有一点疑惑,路径探测的原理到底是如何完成的, ...
- 通过wireshark学习Traceroute命令和mtr(UDP,ICMP协议)
traceroute: 通过TTL限定的ICMP/UDP/TCP侦测包来发现从本地主机到远端目标主机之间的第三层转发路径.用来调试网络连接性和路由问题. mtr: traceroute的一个变种,能根 ...
- [转]Traceroute网络排障实用指南(2)
五.优先级与限速 5.1 Traceroute延时判断影响因素 Traceroute延时包括三点: 探测包到达一个特定路由器的时间 路由器生成IPMI TTL Exceed的时间 ICMP TTL E ...
- [转]Traceroute网络排障实用指南(1)
注:本文是同事的大作,虽是翻译的一篇英文PPT,但内容实在精彩,小小的Traceroute竟包含如此大的信息量,真是让人感慨!内容不涉及公司机密,所以一直想转到自己的Blog上来,自己需要时可以再翻阅 ...
- 通过wireshark学习Traceroute命令(UDP,ICMP协议)
traceroute: 通过TTL限定的ICMP/UDP/TCP侦测包来发现从本地主机到远端目标主机之间的第三层转发路径.用来调试网络连接性和路由问题. mtr: traceroute的一个变种,能根 ...
- Linux-(ping,traceroute,ss)
ping命令 1.命令格式: ping [参数] [主机名或IP地址] 2.命令功能: ping命令用于:确定网络和各外部主机的状态:跟踪和隔离硬件和软件问题:测试.评估和管理网络.如果主机正在运行并 ...
- Linux常用网络工具:路由扫描之traceroute
之前两篇<Linux常用网络工具:fping主机扫描>和<Linux常用网络工具:hping高级主机扫描>都是关于主机扫描的,本篇介绍Linux下常用的路由扫描工具tracer ...
随机推荐
- Util 应用框架 UI 全新升级
Util UI 已经开发多年, 并在多家公司的项目使用. 不过一直以来, Util UI 存在一些缺陷, 始终未能解决. 最近几个月, Util 团队下定决心, 终于彻底解决了所有已知缺陷. Util ...
- 02. x86处理器运行方式
[CPU指令] CPU控制器通过读取存储器中的指令确定要执行的功能,CPU运行需要不停的读取指令,计算机启动后CPU会从固定地址处开始读取指令,首先读取 NOR Flash 存储器中的固件,固件执行完 ...
- C语言:水仙花
//水仙花数 也就是指一个 3 位数,它的每个单位上的数字的 3次方之和等于它本身 (例如:1^3 + 5^3+ 3^3 = 153). #include<stdio.h> int mai ...
- 2022最新的Dubbo-Admin各个版本打包方案
目录 前景提要 环境整合 构建工具(参考工具部署方式) 官网查阅 打包 一.编译器打包 二.命令行打包 前景提要 很简单的一个操作很多人还在那整各种收费,明明是个免费开源的,干嘛让他们挣二手钱. 环境 ...
- next-route
在目录结构中,我们精心创建的每一个文件最终都会经过处理,转化为相应的页面路由.然而,值得注意的是,某些特殊文件格式在生成过程中并不会被当作路由路径来处理. app |-auth login page. ...
- echarts(数据可视化图表)
echarts饼图详细 echarts下载 https://echarts.apache.org/zh/index.html echarts官网 http://www.isqqw.com/#/hom ...
- text/event-stream协议
客户端接收 text/event-stream html <!DOCTYPE html> <html> <head> <meta charset=" ...
- datagridview 批量更新、日期设置、指定列弹出右键菜单
需求是这样,只有调整日期,调整金额两列能被修改,其余的列都不能被修改.日期格式要防止用户输错.数字输入了中文也要提示. 数据来源于存储过程里的视图,这里需要注意的一点是:datagridview采用a ...
- Linux中根据关键字获取某一行的行号
[root@localhost ~]# cat test.txt 123213 ehualu.server ehualu.docker 10.0.0.10 ehualu.server ehualu.d ...
- .net core 关于对swagger的UI(Index.html)或接口的权限验证;
背景: 如何在ASP.Net Core的生产环境中保护swagger ui,也就是index.html页面.其实swagger是自带禁用的功能的,只需要设置开关即可.但是有一些场景,是需要把这些接口进 ...
