如何在 Linux 上使用 traceroute 命令

您可以使用 Linux traceroute 命令来发现网络数据包传输过程中的缓慢部分,并对缓慢的网络连接进行故障排除。 我们会告诉你怎么做!

跟踪路由的工作原理

当您了解 traceroute 的工作原理时,就会更容易理解结果。 路线越复杂 网络数据包 必须采取到达目的地,越难确定可能发生减速的地方。

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

数据包上元数据的标头描述了它的长度、它的来源、它的去向、它使用的协议等等。 协议的规范定义了标头。 如果你能识别协议,你就可以确定头部中每个字段的开始和结束,并读取元数据。

traceroute 使用 TCP/IP 一套协议,并发送 用户数据报协议 数据包。 标头包含 生存时间 (TTL) 字段,它包含一个八位整数值。 尽管顾名思义,它代表的是计数,而不是持续时间。

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

路由器发送一个 因特网消息控制协议 (ICMP) 超过时间 消息返回数据包的来源,让它知道数据包超时。 Time Exceeded 消息包含原始报头和原始数据包数据的前 64 位。 这是在第六页定义的 征求意见 792.

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

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

  如何使用 MelonDS 在 Linux 上玩 Nintendo DS 游戏

有些路由器玩得不好

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

根据 思科,某些 Internet 服务提供商 (ISP) 对其路由器中继的 ICMP 消息数量进行了速率限制。

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

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

安装跟踪路由

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

sudo pacman -Sy traceroute

这

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

sudo apt-get install traceroute

这

使用跟踪路由

正如我们上面提到的,traceroute 的目的是在从您的计算机到目的地的每一跳处引发路由器的响应。 有些人可能守口如瓶,什么也不泄露,而另一些人可能会毫不犹豫地把豆子撒出来。

例如,我们将运行一个跟踪路由到 布拉尼城堡 爱尔兰网站,著名的故乡 布拉尼·斯通. 传说如果你亲吻 Blarney Stone,你会得到“能言善辩的恩赐”。 让我们希望我们一路上遇到的路由器是适当的喋喋不休。

我们输入以下命令:

traceroute www.blarneycastle.ie

这

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

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

所有其他行都包含有关其中一个跃点的信息。 不过,在我们深入研究细节之前,我们可以看到我们的计算机和 Blarney Castle 网站之间有 11 个跃点。 11 跳也告诉我们,我们到达了目的地。

每一跳线的格式如下:

设备的名称,如果设备无法识别自身,则为 IP 地址。
IP 地址。
三个测试中每一个的往返时间。 如果此处有星号,则表示该测试没有响应。 如果设备根本没有响应,您将看到三个星号,并且没有设备名称或 IP 地址。

  如何修复 macOS 和 Linux 上的 Corsair 鼠标和键盘问题

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

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

所以,这是一个混合包。 一些设备打球,一些回应但没有告诉我们他们的名字,还有一些完全匿名。

然而,我们确实到达了目的地,我们知道它有 11 个跃点,并且旅程的往返时间是 13.773 和 14.715 毫秒。

隐藏设备名称

正如我们所见,有时包含设备名称会导致显示混乱。 为了更容易查看数据,您可以使用 -n(无映射)选项。

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

traceroute -n blarneycastle.ie

这

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

跳 3 开始看起来有点可疑。 上次它只响应了两次,而这一次,它只响应了一次。 在这种情况下,它当然是我们无法控制的。

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

设置 traceroute 超时值

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

  如何将 Steam 游戏串流到你的 Linux 桌面

我们输入以下命令:

traceroute -w 7.0 blarneycastle.ie

这

这并没有太大的区别,因此响应可能会超时。 匿名啤酒花很可能是故意保密的。

设置测试次数

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

为了加快 traceroute 测试,我们键入以下内容以将我们发送的 UDP 探测数据包的数量减少到一个:

traceroute -q 1 blarneycastle.ie

这

这会向每个跃点发送一个探测。

设置初始 TTL 值

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

因为我们知道 Blarney Castle 网站距离这台计算机有 11 个跃点,所以我们输入以下内容直接进入第 11 个跃点:

traceroute -f 11 blarneycastle.ie

这

这为我们提供了一份关于与目的地的连接状态的简明扼要的报告。

体贴

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

但是,您不希望用大量 UDP 数据包轰炸未知设备,并警惕在脚本或无人值守作业中包含 traceroute。

可以放置在网络上的负载跟踪路由可能对其性能产生不利影响。 除非您处于立即修复的情况,否则您可能希望在正常工作时间之外使用它。