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 ...
随机推荐
- 深入学习和理解Django模板层:构建动态页面
title: 深入学习和理解Django模板层:构建动态页面 date: 2024/5/5 20:53:51 updated: 2024/5/5 20:53:51 categories: 后端开发 t ...
- kali linux 渗透测试 01 kali介绍
安全问题的根源 分层思想------盲人摸象 只追求功能实现----比较片面 最大的安全威胁是人---- 安全目标 先于攻击者发现和防止漏洞出现 攻击型安全 防护性安全 渗透测试 尝试击破安全防御机制 ...
- cesium教程4-用entity加载glb和gltf格式的小模型
示例完整代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 海康iSC综合安防平台-视频web插件调试
综合安防管理平台 视频WEB插件 1.demo_window_simple_playback.html.demo_window_simple_preview.html为简化版demo,可在此基础上开发 ...
- 关于ESLint: Delete `␍`(prettier/prettier) 错误解决方案(3种)
1.点击VSCode右下角LF/CRLF然后根据弹窗修改成LF即可 2.在.eslintrc.cjs中增加配置 "rules": { "prettier/prettier ...
- 数据库中存储bool对象的数据,使用Bit和Integer有什么区别,性能上有多大的差异
在数据库中存储布尔(Boolean)值时,常见的两种选择是使用 BIT 类型或 INTEGER 类型.两者在存储.性能和使用上的区别如下: 1. BIT 类型 存储:BIT 类型专门用于存储布尔值.通 ...
- Istio(十):istio多集群部署模式
目录 一.模块概览 二.多集群部署 2.1 多集群部署 2.2 网络部署模式 2.3 控制平面部署模型 2.4 网格部署模型 2.5 租户模式 2.6 最佳多集群部署 一.模块概览 在本模块中,我们将 ...
- AIRIOT智慧变电站管理解决方案
随着社会电气化进程的加速,电力需求与日俱增,变电站作为电网的关键节点,其稳定性和智能化管理水平直接关系到整个电力系统的高效运作.传统变电站管理平台难以适应现代电力系统复杂管理需求,存在如下痛点: 数据 ...
- [chatGPT]unity中,我希望一个角色有一个链表能获取到场上所有“creature”的transform,当creature增加或减少时刷新这个链表,我该怎么做?
关键字:unity游戏对象管理,unity,unity实例管理,unity触发方法 我 unity中,我希望一个角色有一个链表能获取到场上所有"creature"的transfor ...
- 性能优化陷阱之hash真的比strcmp快吗
最近网上冲浪的时候看到有人分享了自己最近一次性能优化的经验.我向来对性能是比较敏感的,所以就点进去看了. 然而我越看越觉得蹊跷,但本着"性能问题和性能优化要靠性能测试做依据",我不 ...
