如何在Linux上使用traceroute命令

您可以使用Linux traceroute命令来发现网络数据包传输的慢段,并排除网络连接缓慢的故障。我们会教你怎么做的!

traceroute的工作原理

当您了解traceroute的工作方式时,它会使您更容易理解结果。网络数据包到达目的地的路由越复杂,就越难确定可能发生减速的位置。

小型组织的局域网(LAN)可能相对简单。它可能至少有一个服务器和一两个路由器。在不同位置之间或通过互联网通信的广域网(WAN)上增加了复杂性。然后,您的网络数据包会遇到(并由其转发和路由)许多硬件,如路由器和网关。

数据包上的元数据报头描述其长度、来自何处、去向以及使用的协议等。协议规范定义了报头。如果您可以识别协议,则可以确定报头中每个字段的开始和结束位置并读取元数据。

traceroute使用TCP/IP协议组,并发送用户数据报协议数据包。报头包含生存时间(TTL)字段,该字段包含一个8位整数值。不管名字怎么说,它代表的是计数,而不是持续时间。

信息包通过路由器从其始发地到达目的地。每次信息包到达路由器时,它都会递减TTL计数器。如果TTL值达到1,则接收数据包的路由器会递减该值,并注意到该值现在为零。然后,该分组被丢弃,并且不会转发到其旅程的下一跳,因为它已“超时”。

路由器将互联网消息控制协议(ICMP)超时消息发送回数据包的来源,让它知道数据包超时。超时消息包含原始报头和原始数据包数据的前64位。这在征求意见792的第六页中进行了定义。

因此,如果traceroute将数据包发送出去,但随后将TTL值设置为1,则数据包在被丢弃之前只能到达第一个路由器。它将从路由器接收ICMP超时消息,并且可以记录往返所用的时间。

然后,它在TTL设置为2的情况下重复该练习,该练习将在两跳后失败。traceroute将TTL增加到3,然后重试。重复此过程,直到到达目的地或测试最大跳数(默认为30)。

有些路由器玩得不好

某些路由器有错误。它们尝试转发TTL为零的数据包,而不是丢弃它们并引发ICMP超时消息。

根据思科的说法,一些互联网服务提供商(ISP)对其路由器中继的ICMP消息的数量进行速率限制。

某些设备配置为从不发送ICMP数据包。这通常是为了确保设备不会在不知不觉中被强迫参与分布式拒绝服务,如蓝精灵攻击。

traceroute的默认回复超时时间为5秒。如果在这5秒内没有收到响应,则放弃尝试。这意味着来自非常慢的路由器的响应将被忽略。

安装traceroute

Traceroute已经安装在Fedora31上,但必须安装在Manjaro 18.1和Ubuntu 18.04上。要在Manjaro上安装traceroute,请使用以下命令:

sudo pacman -Sy traceroute

要在Ubuntu上安装traceroute,请使用以下命令:

sudo apt-get install traceroute

使用traceroute

如上所述,traceroute的目的是在从您的计算机到目的地的每一跳从路由器获得响应。有些人可能守口如瓶,什么也不会泄露,而另一些人可能会毫无顾虑地泄露秘密。

作为一个例子,我们将运行一条Traceroute到爱尔兰的Blarney Castle网站,那里是著名的Blarney Stone的故乡。传说,如果你亲吻布拉尼石碑,你就会得到“喋喋不休的礼物”。让我们希望我们一路上遇到的路由器适当地喋喋不休。

我们键入以下命令:

traceroute www.blarneycastle.ie

第一行给我们提供以下信息:

目的地及其IP地址。 traceroute在放弃之前将尝试的跳数。 我们发送的UDP数据包的大小。

所有其他行都包含有关其中一跳的信息。不过,在我们深入挖掘细节之前,我们可以看到,我们的电脑和布拉尼城堡网站之间有大约11个跳跃。11跳还告诉我们我们已到达目的地。

每条跳线的格式如下:

设备的名称,或者,如果设备不识别自己,则为IP地址。 IP地址。 三个测试中的每一个往返所需的时间。如果这里有星号,那就意味着那次测试没有反应。如果设备完全没有响应,您将看到三个星号,并且没有设备名称或IP地址。

让我们回顾一下下面的内容:

第一跳:第一个停靠端口(不是双关语)是本地网络上的DrayTek Vigor路由器。这就是我们的UDP数据包离开本地网络并进入互联网的方式。 第二步:此设备没有响应。可能它被配置为从不发送ICMP数据包。或者,也许它确实有反应,但太慢了,所以Traceroute超时了。 第三跳:一台设备响应了,但我们没有得到它的名称,只得到了IP地址。请注意,这一行中有一个星号,这意味着我们没有收到对所有三个请求的响应。这可能表示数据包丢失。 跳数4和5:更多匿名跳数。 第6步:这里有很多文本,因为我们三个UDP请求中的每一个都由不同的远程设备处理。打印了每个设备的(相当长的)名称和IP地址。当您遇到有很多硬件来处理大量流量的“密集”网络时,就会出现这种情况。这一跳是英国最大的ISP之一。所以,如果同样的远程硬件处理我们的三个连接请求,那将是一个小小的奇迹。 第7跳:这是我们的UDP数据包离开ISP网络时进行的跳跃。 第8跳:同样,我们得到了IP地址,但没有设备名称。所有三个测试都成功返回。 跳数9和10:又有两个匿名跳数。 跳11:我们已经到了布拉尼城堡的网站。城堡位于爱尔兰的科克,但根据IP地址地理位置,网站位于伦敦。

所以,这是一件喜忧参半的事。有些设备玩得团团转,有些回应了,但没有告诉我们他们的名字,而另一些则完全匿名。

然而,我们确实到达了目的地,我们知道它有11跳的距离,旅程的往返时间是13.773毫秒和14.715毫秒。

隐藏设备名称

正如我们已经看到的,有时包括设备名称会导致显示混乱。要更容易地查看数据,可以使用-n(无映射)选项。

要使用我们的示例执行此操作,我们键入以下内容:

traceroute -n blarneycastle.ie

这使得为可能指示瓶颈的往返时间挑选大量数字变得更容易。

HOP 3看起来有点可疑。上一次,它只回应了两次,这次,它只回应了一次。当然,在这种情况下,这不是我们所能控制的。

但是,如果您正在调查您的公司网络,那么深入研究该节点将是值得的。

设置traceroute超时值

如果我们延长默认超时期限(5秒),可能会得到更多响应。为此,我们将使用-w(等待时间)选项将其更改为7秒。(请注意,这是一个浮点数。)

我们键入以下命令:

traceroute -w 7.0 blarneycastle.ie

这并没有太大的不同,所以响应可能超时了。很可能匿名啤酒花是故意保密的。

设置测试次数

默认情况下,traceroute向每跳发送三个UDP数据包。我们可以使用-q(查询数)选项来向上或向下调整该值。

为了加快traceroute测试,我们键入以下命令以将发送的UDP探测数据包数减少到1:

traceroute -q 1 blarneycastle.ie

这会向每一跳发送一个探测。

设置初始TTL值

我们可以将TTL的初始值设置为1以外的值,并跳过一些跃点。通常,第一组测试的TTL值设置为1,下一组测试的TTL值设置为2,依此类推。如果我们将其设置为5,则第一个测试将尝试跳到5跳,并跳过1到4跳。

因为我们知道Blarney Castle网站距离这台计算机有11跳,所以我们键入以下命令直接进入Hop 11:

traceroute -f 11 blarneycastle.ie

这为我们提供了一份关于到目的地的连接状态的精美、简明的报告。

体贴周到

traceroute是调查网络路由、检查连接速度或识别瓶颈的一个很棒的工具。Windows也有一个功能类似的tracert命令。

但是,您不想用大量UDP数据包轰炸未知设备,并且要小心在脚本或无人值守作业中包含traceroute。

traceroute可以对网络施加的负载可能会对其性能产生不利影响。除非你处于“现在就能修好”的情况,否则你可能想在正常工作时间以外使用它。

相关文章