Linux命令:traceroute命令(路由跟踪)

Posted Running Sun丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux命令:traceroute命令(路由跟踪)相关的知识,希望对你有一定的参考价值。

traceroute是用来检测发出数据包的主机到⽬标主机之间所经过的网关数量的工具

traceroute的原理是试图以最小的TTL(存活时间)发出探测包来跟踪数据包到达目标主机所经过的网关,然后监听⼀个来自网关ICMP的应答,发送数据包的大小默认为38个字节。

原理:程序利用增加存活时间(TTL)来实现其功能。每当数据包(3个数据包包括源地址,目的地址和包发出的时间标签)经过⼀个路由器,其存活时间就会减1。当其存活时间是0时,主机便取消数据包,并传送一个ICMP(Internet控制报文协议:它是TCP/IP协议族的⼀个子协议,用于在IP主机、路由器之间传递控制消息,控制消息是指:络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。) TTL数据包给原数据包的发出者。

traceroute程序完整过程:首先它发送⼀份TTL字段为1的IP数据包给目的主机,处理这个数据包的第⼀个路由器将TTL值减1,然后丢弃该数据报,并给源主机发送⼀个ICMP报文(“超时”信息,这个报⽂包含了路由器的IP地址,这样就得到了第⼀个路由器的地址),然后 traceroute发送⼀个TTL为2的数据报来得到第二个路由器的IP地址,继续这个过程,直至这个数据报到达目的主机。

1.命令格式:

traceroute [参数] [主机]

2.命令功能:

traceroute指令让追踪网络数据包的路由途径,预设数据包大小是40Bytes,用户可另行设置。

具体参数格式: 

traceroute [-dFlnrvx][-f<存活数值>][-g<网关>…][-i<网络界⾯>][-m<存活数值>][-p<通信端⼝>][-s<来源地址>][-t<服务类型>][-w<超时秒数>][主机名称或IP地址][数据包大小]

3.命令参数: 

-d 使⽤Socket层级的排错功能。

-f 设置第⼀个检测数据包的存活数值TTL的大小。

-F 设置勿离断位。

-g 设置来源路由网关,最多可设置8个。

-i 使⽤指定的⽹络界面送出数据包。

-I 使用ICMP回应取代UDP资料信息。

-m 设置检测数据包的最大存活数值TTL的大小。

-n 直接使⽤IP地址而非主机名称。

-p 设置UDP传输协议的通信端⼝。

-r 忽略普通的Routing Table,直接将数据包送到远端主机上。

-s 设置本地主机送出数据包的IP地址。

-t 设置检测数据包的TOS数值。

-v 详细显表示指令的执行过程。

-w 设置等待远端主机回报的时间。

-x 开启或关闭数据包的正确性检验。 

4.实例

例子4.1 : traceroute www.baidu.com 结果: 

说明:

记录按序列号从1开始,每个纪录就是⼀跳 ,每跳表示一个⽹关,看到每行有三个时间,单位是ms,其实就是-q的默认参数。探测数据包向每个⽹关发送三个数据包后,网关响应后返回的时间;如果用 traceroute -q 4 www.58.com ,表示向每个⽹关发送4个数据包。

见下图:

       有时traceroute 主机时,会看到有⼀些行是以星号表示的,出现这样的情况,可能是防火墙封掉了ICMP的返回信息,所以得不到什么相关的数据包返回数据。

       有时在某一⽹关处延时比较长,有可能是某台网关比较阻塞,也可能是物理设备本身的原因,当然如果某台DNS出现问题时,不能解析主机名、域名时,也会有延时长的现象;可以加-n参数来避免DNS解析,以IP格式输出数据。

       如果在局域网中的不同⽹段之间,我们可以通过traceroute 来排查问题所在,是主机的问题还是网关的问题。如果通过远程来访问某台服务器遇到问题时,用到traceroute 追踪数据包所经过的网关,提交IDC服务商,也有助于解决问题;但目前看来在国内解决这样的问题是比较困难的,发现问题所在,IDC服务商也不可能帮助解决。

实例4.2:跳数设置 命令:traceroute -m 10 www.baidu.com结果:

说明:通过结果可以看到存活数值=10,当存活数值=0时,主机便取消数据包

实例3:探测包使用的基本UDP端口设置6888命令:

traceroute -p 6888 www.baidu.com 结果:

实例4:把对外发探测包的等待响应时间设置为3秒命令:

traceroute -w 3 www.baidu.com结果:

 

本文参考资料:

知识扩展:目的主机接受在接收到TTL值为1的IP数据包是不会丢失的吧,这样也不会产生⼀个超时的ICMP数据报文了,那么程序如何判断是否已经到达目的主机了呢?

      在Linux下,traceroute程序发送⼀个UDP数据报给目的主机,但是它选择⼀个不可能的值作为UDP端口号(大于30000),使目的主机的任何⼀个应应程序都不可能使用该端口,因此该数据报到达目的主机时,目的主机会产生⼀个“端口不可达”错误的ICMP报文,这样traceroute程序要做的就是区分接收到的ICMP报文是超时还是端口不可达,从而来区分是路由器还是目的主机。

Linux关于路由跟踪指令traceroute

本文所有命令实施的大前提是:你现在能够上网。

稍有计算机常识的人都知道ping命令,是用来检查自己的主机是否与目标地址接通,自己的主机与目标地址的通讯包通讯速率,所谓的通讯包也就是那些什么TCP/IP,UDP包,这里说得通俗一点,比如,就拿这个IT网站csdn来测试一下,则得到如下效果:


但是路由跟踪指令traceroute,在windows则是tracert,对于非计算机网络内行,就不太知道这是干什么了。

其实路由跟踪指令,更能展示出自己的主机与目标地址的通讯详细情况。

在Ubuntu12.04中,Ctrl+Alt+T打开终端,输入traceroute,如果如下图所示提示没有安装。


那么,则输入如下命令,先安装traceroute,Linux除了必要的东西之外,真的什么都没有安装的!

sudo apt-get install traceroute
如下图所示,迅速被刷屏之后,因为这个路由跟踪组件,才51KB,你正式可以在Linux中使用traceroute命令


此时,输入如下命令,测试我的Ubuntu12.04与www.csdn.net的通讯详细情况,

traceroute -n www.csdn.net

其中-n代表,仅要看ip地址,不要显示主机名、域名那些东西,也就是说不要给我显示网址,则得到如下效果:


可以发现第一条记录之后,就一堆不可达,那是因为,我的Ubuntu12.04处于虚拟机中,通过桥接的方式与我的主机Windows 7通讯,虚拟机Ubuntu12.04所有网络状态直接继承主机Windows 7的网络,根本就不知道Windows 7做什么,因此只能在Windows 7的cmd中使用相同的tracert路由跟踪指令做这个实验。

首先,运行cmd,输入tracert,发现cmd提示,这不是可运行程序或命令或批处理文件,也就是找不到tracert。这是因为我的Windows 7x64没有把windows/system32这个文件夹的内容设置为cmd的全局变量。


与配置Java、Mysql之流一样,如下图所示,右键“我的电脑或者计算机”,选择“属性或者管理”,选择“高级”选项卡,打开“环境变量”,在“系统变量”那一栏中找到Path,编辑,补上一个c:\\windows\\system32\\;然后就是各种“确定”。


之后,再运行cmd,输入tracert,这时候显示tracert命令的说明,终于可以愉快地进行玩耍了。


输入如下指令,要求显示,如果本主机要和www.csdn.net这个网址通讯,整个通讯包的流向。

tracert -d -h 15 www.csdn.net

其中,要求只显示IP,别给我显示网址,追踪15次,无论如何都打断。

那么,得到如下结果。这个结果怎么看呢?

首先第一列,也就是最左列那个1,2,3,4,5...就是通讯包第1,2,3,4,5...站,也就是通讯包第1,2,3...跳处于的路由器。最后一列,也就是最后一列,也就是一个一个通讯包的车站,也就是传说中的路由器。中间的3个时间,分别代表3个被实验的通讯包,彼此之间相互不影响,站与站之间的通讯时间,也就是上一个路由器到下一个路由器的通讯时间。

其中,这个路由器的IP,你完全可以打开某个搜索引擎,直接输入,则能够马上显示其IP对应的位置。

综上所述,以下结果所对应的真实情况为:

1、一开始通讯包从本主机出发,也就是从广州某高校内的某个单位的主机出发,

2、来到了网关,也就是广州某高校内的某个单位的总路由器

3-7、之后根据本高校的网络设置,找到本高校的外网出口,来到广州电信的路由器。

8-10、广州电信接到这个通讯包,就帮我寻找www.csdn.net这个地址的IP,IP可以明显看到从183.63.96.129迅速跳到61.144.3.53,很明显是从区级单位的路由器跳到省级单位的路由器。尽管这些都是广州电信的IP,但谁叫广州是省会,如果我在某个非省会的城市做这个实验。我很有预感通讯包肯定被扔到省级单位的路由器。

11、由于CSDN在广东没有配自己的服务器嘛,因此广州电信一直未能帮我找到其服务器所在地址。所以广州电信就把我这个包扔到中国总的路由器,寻找其位置。

12-13、之后,在国家级的路由器,搞了“很久”,超过100ms对于光纤来说就是“很久”,都没有给我反馈出结果,然后我的主机一直在等待。

14-15、之后国家级的路由器不知道为何先去探测澳洲IP,然后没找到才给我扔到北京总部路由器。大概是14-15同时进行的。也就是国家级的路由器在探测国内IP的同时,在探测国外IP。


之后由于我设置了追踪15次,无论如何都打断,因此路由到这里就停止了。我当然不爽,这个通讯包来到北京之后还没有输出来,于是再输入如下指令,不限制追踪次数,再测一次。

tracert -d www.csdn.net

很明显前15次,除了时间以外,根本就不会有任何差别的。就像你平时怎么上班下班的,你今天还是会怎么上班下班,除非你是刚上班的,还没有找到一条通勤路线,或者有什么事情。以下是接下去的结果:


16、来到北京联通之后,发现csdn的服务器是电信服务器,则扔到电信。其实综合15与16两步已经可以推测到北京地区的总服务器居然是联通服务器?电信的包居然要联通经手才到电信?不知道为什么呢?

17、之后更有意思的是,来到北京电信之后,发现这个包,还有所谓“263网络通信”经手,用某搜索引擎查了下,发现这个“263网络通信”原来是提供网络支持、云服务等公司。我开始推测csdn应该是利用,云,来为我们广大的程序猿提供服务的。

18、最后才到达114.112.73.194,csdn.net的路由器。

这与上面的ping结果是一致的:


虽然我们人看起来,这似乎是一个很漫长的过程,毕竟我们人,现在从广州到北京,最快也要3个小时,还没算市内通讯时间,还要耗费千五大洋上下……但是,对于网络的通讯包来说,仅仅是1s内的事情。这必须先谢郭嘉,让我们2000公里之外的网民能在1s内,几乎没花几个钱就能通讯。

下面再对一个你的网址进行tracert实验结束本文,比如,我对我的主机说,我要与www.google.com.hk这个网址通信会出现什么结果呢?

结果如下所示:


去到广州电信省级路由的时候,还是好好的,与上面与www.csdn.net愉快玩耍一样,顺顺利利地来到了广州省级路由。

然后,不知道为何马上给扔到尼泊尔灾区呢?

这……

估计这个IP是伪装的,如果去到这个IP,通讯包就再也找不到任何通讯路由器,被关进小黑屋了……

原因是什么你懂得

以上是关于Linux命令:traceroute命令(路由跟踪)的主要内容,如果未能解决你的问题,请参考以下文章

Linux关于路由跟踪指令traceroute

Linux常用网络命令

31.traceroute命令进行路由跟踪

31.traceroute命令进行路由跟踪

关于路由跟踪指令---traceroute

linux中网络测试命令