我正在尝试从 traceroute 输出中了解和绘制网络路径。示例输出如下所示:
假设我想绘制第三跳和第四跳之间的路径。假设不同级别的ip之间会有有序的映射是否正确?
这意味着数据包将从第 3 跳的第一个 ip (et-0-0-2.mpr01.mtlcx03.fibernoire.ca) 到第 4 跳的第一个 ip(et-0-0-4.cre01.mtl1981.fibernoire.ca) ) 并且第二个数据包将从 hop3 的第二个 ip (et-0-0-3.mpr01.mtlcx03.fibernoire.ca) 到第二个 ip (et-0-0-4.cre01.mtlsunl.fibernoire.ca)跳4?这将持续到下一跳?
或者在级别 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 | | | | | | |
tl;博士:不,不能保证。
这些地址是否以任何特定顺序显示实际上取决于您使用的跟踪路由程序。每个人都做自己的事情。(他们甚至可能使用不同类型的探针进行跟踪——例如,Windows tracert 仅使用 ICMP 探针,Linux traceroute 更喜欢 UDP,除非另有说明,在您的情况下,它们将显示略有不同的路径。)
但总的来说,您正在查看的是 ECMP(等价多路径)路由的结果,例如,跃点 2 的路由器在跃点 3 的两个网关之间有 50%:50% 的选择。(然后跃点 3 可能还使用 ECMP 并在两个网关之间为跃点 4 做出另一个独立的选择......所以它可能不仅仅是 2 条路径,而是许多可能的组合。)
这种选择是基于数据包头做出的,试图确保属于同一“连接”的所有数据包都将通过相同的路径——这通常意味着硬币翻转是基于源/目标 IP 地址和 TCP/UDP 端口。(例如,在其他一切都相同的情况下,发送到奇数端口的数据包可能走路径 A,而偶数端口走路径 B。)
(请注意,每一跳都做出完全独立的路由决策——网关 A 可能有一个基于 IP+端口的 2 路 ECMP 路由,但同时网关 C 可能有一个仅基于 IP 的 4 路路由,等等)
如果您的 traceroute 程序使用 UDP 探测并将每个探测发送到不同的 UDP 目标端口,那么结果可能无用 - 有时您可能会看到两条路径混合在一起(如您的示例中),有时您可能不会注意到例如 hop 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>
– 这使用带有本地端口 33000、远程端口 33001 的 UDP,并且只会显示一个路径(我们称之为路径 A);mtr --udp -L 33000 -P 33002 <host>
– 与上述相同,但调整任一端口号可能会显示不同的路径(路径 B)。这是单个跟踪中两个独立 ECMP 实例的示例——首先,您在不同国家/地区的网关之间选择 4 跳(它们汇聚在
uk-hex
;第 6 跳的两个地址很可能只是同一路由器的不同接口),然后你有 7 跳最后在八个不同的路由器之间进行选择。如果您使用 Wireshark/tcpdump 查看此内容,您会看到 mtr 将每个探测发送到不同的 UDP 端口——33000、33001、33002 等等——这就是它最终收集所有可能组合的方式。
但是,如果我为 UDP 探测指定了固定的源/目标端口(或者如果我一开始不使用
--udp
,则从等式中删除端口),那么我可以隔离一个路径:更改其中一个端口号给了我一条不同的路径:
现在回到你原来的问题,注意路径 A 是如何通过 gateways
→ 97.105 → 97.78 →
的,而路径 B 是如何通过的→ 97.80 → 97.125 →
,这显然不对应于初始多路径跟踪中的跃点顺序(在位置 5 中显示 A 然后 B,但是位置 6 则相反)。由于 97.78 和 97.125 实际上是同一个网关(镜子证实了这一点),因此数据包不太可能从 97.105 传输到 97.125,因为该接口仅连接到 97.80。由此我们可以得出结论,mtr 输出中单个“跳”内的地址顺序是完全没有意义的。