如何正确解释 tracert 的结果,特别是超时前倒数第二跳

Jam*_*ore 3 networking tcpip routing trace icmp

我正在对不断断开的无线互联网连接进行故障排除。ISP 说无线电信号很好,所以它必须由我的 cisco asa 5505 提供。我不相信他们...

讨论假设如下:

远程站点公网ip为10.1.1.50,默认网关为10.1.1.1

当我从远程位置执行 tracert 到 10.1.1.50 时,tracert 的倒数第二跳是否始终为 10.1.1.1?

当连接断开时,倒数第二个跃点不是 10.1.1.1,但是 10.1.1.1 是可 ping 的,我可以对其进行跟踪。

我认为这是ISP的路由问题。
我的逻辑有效吗?如果 10.1.1.1 是可达的,它不应该是在我超时之前在 tracert 上的倒数第二跳吗?

Mur*_*iar 5

在 99% 的情况下,traceroute 的倒数第二跳不会是目标主机的默认网关。这是因为 traceroute 的工作方式。

所有 IP 数据包都有一个 - 有点错误命名的 - 生存时间( TTL ) 字段。每个转发数据包的路由器都会将该字段递减 1。如果路由器将 TTL 递减为 0,它将丢弃该数据包并生成一个ICMP TTL 超出错误数据包并将其发送回原始数据包的发送者。错误数据包将具有原始数据包源(在这种情况下,启动跟踪路由的主机)的目标 IP。错误数据包的源 IP 通常是输出接口的 IP 地址,即面向网络其余部分的 IP 地址。

Traceroute 利用了这一事实;它发送具有顺序增加的 TTL 的数据包;这会导致源和目标之间路径中的每个路由器将 ICMP 不可达消息发送回执行跟踪路由的主机。每个错误都将具有探测数据包在被丢弃之前到达的最终路由器的源 IP。这允许 traceroute 构建源和目标之间的路径图。

考虑下图(忽略多条路径的可能性):

________     1.1____1.2                2.1____2.2     ________
|Host A|-----|Router 1|--- Internet ---|Router 2|-----|Host B|
--------     ----------                ----------     --------
Run Code Online (Sandbox Code Playgroud)

如果主机 A 正在执行到主机 B 的跟踪路由,则倒数第二跳将是路由器 2,它将接收如下探测数据包:

SrcIP: A | DstIP: B | TTL: 1
Run Code Online (Sandbox Code Playgroud)

Router 2 将 TTL 递减为 0;这将导致它生成一个 ICMP TTL 过期:

SrcIP: 2.1 | DstIP: A | TTL <default>
Run Code Online (Sandbox Code Playgroud)

因此,当 traceroute 收到此错误消息时,它看到的倒数第二跳的 IP 地址将是路由器 2 的面向 Internet 的接口,而不是面向主机 B 的接口。