我正在尝试从 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.32到52.94.81.193只有和另一个来自52.94.81.134到52.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 输出中单个“跳跃”内的地址顺序完全没有意义。