Traceroute 输出:正确的路径是什么?

Traceroute 输出:正确的路径是什么?

我正在尝试从 traceroute 输出中理解并绘制网络路径。示例输出如下所示:

假设我想绘制第 3 跳和第 4 跳之间的路径。是否可以假设不同级别的 IP 之间会有有序映射?

这意味着数据包将从跳 3 的第一个 IP(et-0-0-2.mpr01.mtlcx03.fibrenoire.ca)传输到跳 4 的第一个 IP(et-0-0-4.cre01.mtl1981.fibrenoire.ca),而第二个数据包将从跳 3 的第二个 IP(et-0-0-3.mpr01.mtlcx03.fibrenoire.ca)传输到跳 4 的第二个 IP(et-0-0-4.cre01.mtlsunl.fibrenoire.ca)?并且这将继续传输到下一跳?

或者第二个例子在第 7 级和第 8 级之间,数据包是否保证从52.94.82.3252.94.81.193只有和另一个来自52.94.81.13452.94.81.191

| #  | Hostname                              | Loss% |  Snt | Last |  Avg | Best |  Wrst |
+----+---------------------------------------+-------+------+------+------+------+-------+
| 1  | 192.168.1.1                           |  72.8 | 2220 |  3.2 |  2.0 |  0.6 |  34.4 |
| 2  | CUST01-C1.asr02.mtl1080.fibrenoire.ca |   0.0 | 2220 |  2.0 |  3.6 |  1.6 |  51.0 |
| 3  | et-0-0-2.mpr01.mtlcx03.fibrenoire.ca  |   0.0 | 2220 |  1.4 |  4.5 |  1.0 |  66.7 |
|    | et-0-0-3.mpr01.mtlcx03.fibrenoire.ca  |       |      |      |      |      |       |
| 4  | et-0-0-4.cre01.mtl1981.fibrenoire.ca  |   0.0 | 2220 |  1.2 |  5.6 |  1.1 |  84.9 |
|    | et-0-0-4.cre01.mtlsunl.fibrenoire.ca  |       |      |      |      |      |       |
| 5  | et-0-0-2.mpr02.mtlcx03.fibrenoire.ca  |   0.0 | 2220 |  1.4 |  5.6 |  1.2 | 135.0 |
|    | et-0-0-3.mpr02.mtlcx03.fibrenoire.ca  |       |      |      |      |      |       |
| 6  | 52.95.219.62                          |   0.0 | 2220 |  3.3 |  4.3 |  1.1 |  78.2 |
| 7  | 52.94.82.32                           |   0.0 | 2220 |  2.7 |  4.4 |  1.8 |  67.4 |
|    | 52.94.81.134                          |       |      |      |      |      |       |
| 8  | 52.94.81.193                          |   0.0 | 2220 |  7.8 |  3.3 |  1.4 |  56.3 |
|    | 52.94.81.191                          |       |      |      |      |      |       |
| 9  | 52.94.82.69                           |   0.0 | 2220 | 28.2 | 26.4 | 22.4 |  60.5 |
|    | 54.239.44.18                          |       |      |      |      |      |       |
| 10 | 150.222.242.150                       |  48.6 | 2220 | 28.9 | 26.4 | 22.3 |  50.5 |
|    | 150.222.242.118                       |       |      |      |      |      |       |
| 11 | 150.222.242.150                       |  89.1 | 2220 | 28.9 | 26.1 | 22.4 |  37.7 |
|    | 150.222.242.152                       |       |      |      |      |      |       |

答案1

数据包是否保证仅从 52.94.82.32 到 52.94.81.193,另一个数据包是否从 52.94.81.134 到 52.94.81.191

总结:不,这并不能保证。

这些地址是否按特定顺序显示实际上取决于您使用的 traceroute 程序。每个程序都有自己的功能。(它们甚至可能使用不同类型的探测器进行跟踪 - 例如,Windows tracert 专门使用 ICMP 探测器,Linux traceroute 更喜欢 UDP,除非另有说明,并且根据您的情况,它们将显示略有不同的路径。)

但一般来说,您所看到的是 ECMP(等价多路径)路由的结果,例如,跳 2 处的路由器在跳 3 的两个网关之间有 50%:50% 的选择。(然后跳 3 可能也会使用 ECMP 并在跳 4 的两个网关之间做出另一个独立的选择……所以它可能不仅仅是 2 条路径,而是许多可能的组合。)

此选择基于数据包头,旨在确保属于同一“连接”的所有数据包都将沿同一路径传输 - 这通常意味着抛硬币是基于源/目标 IP 地址和 TCP/UDP 端口。(例如,在其他所有条件相同的情况下,发往奇数端口的数据包可以采用路径 A,而发往偶数端口的数据包可以采用路径 B。)

(请注意,每一跳都会做出完全独立的路由决策 - 网关 A 可以具有基于 IP + 端口的双向 ECMP 路由,但同时网关 C 可以具有仅基于 IP 的四向路由,等等。)

如果您的跟踪路由程序使用 UDP 探测并将每个探测发送到不同的 UDP 目标端口,那么结果可能是无用的——有时您可能会看到两条路径混合在一起(就像在您的示例中一样),有时您可能不会注意到例如跳 3 来自路径 A,跳 4 来自路径 B,跳 5 再次来自路径 A。

因此,在像你这样的输出中,我不会假设第 4 跳的地址顺序与第 5 跳的地址顺序有关系。

你应该做的是告诉你的 traceroute 工具使用固定的 UDP 源/目标端口,并在手动更改端口的同时多次运行跟踪之间每个跟踪。这样,单个跟踪的所有探测都将采用单个路径。例如,如果您正在使用mtr(其默认值实际上是 ICMP),请尝试:

  • mtr <host>– 这使用 ICMP 并且应该始终显示一条路径;
  • mtr --udp <host>– 这使用具有不同端口的 UDP,并且会同时显示多条路径,而无法区分它们;
  • mtr --udp -L 33000 -P 33001 <host>– 这使用 UDP,本地端口为 33000,远程端口为 33001,并且只显示一条路径(我们称之为路径 A);
  • mtr --udp -L 33000 -P 33002 <host>– 与上述相同,但调整任一端口号可能会显示不同的路径(路径 B)。

以下是单个跟踪中两个独立 ECMP 实例的示例 – 首先,您需要在不同的网关之间进行跳 4 选择国家(它们会聚在uk-hex;第 6 跳的两个地址很可能只是相同的路由器),那么你有跳7选择最终是不同的路由器。

$ mtr --udp -c 100 --report-wide 212.71.255.###
                                                       Loss%   Snt   Last   Avg  Best  Wrst StDev
  1.|-- _gateway (10.128.0.1)                           0.0%   100    0.5   0.4   0.2   0.7   0.1
  2.|-- uxxx.lxxxxx.lx (193.219.###.###)                0.0%   100    0.8   0.7   0.4   1.1   0.1
  3.|-- ktu-itd-gw (193.219.153.182)                    0.0%   100    6.0   6.1   5.4  22.2   1.9
  4.|-- de-hmb.nordu.net (109.105.98.126)               0.0%   100   31.8  31.2  30.5  34.6   0.7
  5.|-- de-ffm.nordu.net (109.105.97.105)               0.0%   100   40.3  39.0  37.0  63.8   2.8
        nl-ams.nordu.net (109.105.97.80)              
  6.|-- uk-hex.nordu.net (109.105.97.125)               0.0%   100   45.9  46.4  45.4  54.5   1.6
        uk-hex.nordu.net (109.105.97.78)              
  7.|-- 5.57.81.142                                     0.0%   100   47.2  49.0  46.1  78.5   4.0
  8.|-- if-3-3.router1-lon1.linode.com (109.74.207.19)  0.0%   100   50.5  48.8  46.3  51.6   1.9
        if-3-23.router1-lon1.linode.com (109.74.207.23)
        if-3-19.router2-lon1.linode.com (109.74.207.3)
        if-3-23.router2-lon1.linode.com (109.74.207.25)
        if-3-3.router2-lon1.linode.com (109.74.207.21)
        if-3-22.router2-lon1.linode.com (109.74.207.15)
        if-3-19.router1-lon1.linode.com (109.74.207.1)
        if-3-17.router1-lon1.linode.com (109.74.207.11)
  9.|-- wxxxx.nxxxxxxxx.xx (212.71.255.###)             0.0%   100   46.2  48.3  46.0  51.3   1.9

如果您使用 Wireshark/tcpdump 查看此信息,您会看到 mtr 将每个探测发送到不同的 UDP 端口 - 33000,然后是 33001,然后是 33002 等等 - 这就是它最终随着时间的推移收集所有可能的组合的方式。

--udp但是,如果我为 UDP 探测指定固定的源/目标端口(或者如果我一开始就不使用,则从等式中删除端口),那么我可以隔离一条路径:

$ mtr --udp -L 33000 -P 33000 -c 10 --report-wide 212.71.255.###
                                                        Loss%   Snt   Last   Avg  Best  Wrst StDev
  1.|-- _gateway (10.128.0.1)                            0.0%    10    0.4   0.4   0.4   0.6   0.1
  2.|-- uxxx.lxxxxx.lt (193.219.###.###)                 0.0%    10    0.7   0.7   0.6   0.8   0.1
  3.|-- ktu-itd-gw (193.219.153.182)                     0.0%    10    6.4   5.9   5.7   6.5   0.3
  4.|-- de-hmb.nordu.net (109.105.98.126)                0.0%    10   30.8  30.9  30.8  31.4   0.2
  5.|-- de-ffm.nordu.net (109.105.97.105)                0.0%    10   39.3  40.4  39.3  49.3   3.1
  6.|-- uk-hex.nordu.net (109.105.97.78)                 0.0%    10   46.0  47.4  45.8  51.4   1.9
  7.|-- 5.57.81.142                                      0.0%    10   51.7  50.5  50.1  51.7   0.4
  8.|-- if-3-17.router1-lon1.linode.com (109.74.207.11)  0.0%    10   50.4  50.6  50.3  51.6   0.4
  9.|-- wxxxx.nxxxxxxxx.xx (212.71.255.###)              0.0%    10   50.3  50.3  50.2  50.5   0.1

更改其中一个端口号会给我带来不同的路径:

$ mtr --udp -L 33000 -P 33002 -c 10 --report-wide 212.71.255.###
                                                       Loss%   Snt   Last   Avg  Best  Wrst StDev
  1.|-- _gateway (10.128.0.1)                           0.0%    10    0.6   0.4   0.4   0.6   0.1
  2.|-- uxxx.lxxxxx.lx (193.219.181.254)                0.0%    10    0.7   0.6   0.5   0.8   0.1
  3.|-- ktu-itd-gw (193.219.153.182)                    0.0%    10    5.8   6.0   5.8   6.7   0.4
  4.|-- de-hmb.nordu.net (109.105.98.126)               0.0%    10   30.8  30.8  30.7  31.0   0.1
  5.|-- nl-ams.nordu.net (109.105.97.80)                0.0%    10   37.4  39.5  37.2  56.1   5.9
  6.|-- uk-hex.nordu.net (109.105.97.125)               0.0%    10   45.9  46.0  45.7  47.4   0.5
  7.|-- 5.57.81.142                                     0.0%    10   46.6  48.1  46.5  57.5   3.6
  8.|-- if-3-3.router1-lon1.linode.com (109.74.207.19)  0.0%    10   47.1  46.9  46.4  48.2   0.5
  9.|-- wxxxx.nxxxxxxxx.xx (212.71.255.###)             0.0%    10   46.6  46.5  46.3  46.6   0.1

现在回到你最初的问题,注意路径 A 如何通过网关→ 97.105 → 97.78 →,而路径 B 如何通过网关→ 97.80 → 97.125 →,这显然才不是对应于初始多路径跟踪中的跳数顺序(在位置 5 显示先是 A 然后是 B,但在位置 6 则相反)。

由于 97.78 和 97.125 实际上是同一个网关(镜子(证实了这一点),数据包不太可能从 97.105 传输到 97.125,因为该接口仅连接到 97.80。由此我们可以得出结论,mtr 输出中单个“跳跃”内的地址顺序完全没有意义。

相关内容