我在 Stack Overflow 上问了这个问题,然后认为这可能是更好的提问地方。
鉴于以下情况:
PC --- |aa RTR1 bb| --- |aa RTR2 bb| --- |aa RTR3 bb| ETC
|aa rtr bb| 中的每一个 意味着是具有两个端口aa和bb的路由器。
我的问题是这个。当您从 PC 进行跟踪路由时,哪个路由器端口地址应该响应超过传输消息中的生存时间?
我似乎记得被教导将路由器视为与端口一样多的部分,因此在我的场景中,当 aa 将数据包转发到 bb 并将 ttl 递减为 0 时,它将是 aa 端口的地址失败消息。我正在努力寻找确定的答案。
谢谢。
无需过多讨论路由的工作原理。您只会看到来自“面向”您机器的界面的响应。
因此,在您的示例中,TTL Exceeded 消息将始终来自“aa”接口之一。基本上处理数据包的逻辑发生在两个接口之间,然后任何响应或转发都发送到正确的接口。在您的情况下,将从“aa”发送一条 TTL 超出消息,因为这是返回您的机器的唯一方法。
确定的反应,也许不是,但在我所做的所有测试中都是如此。我认为路由器无法路由,因为 TTL 为空,所以在路由之前,发送 ICMP 数据包。所以它是路径中找到的第一个 IP。
«RTR1 将响应端口 aa 的地址还是端口 bb 的地址»
这完全是武断的,而且是一个有点愚蠢的问题。
考虑一下 ICMP 通过端口“aa”进入但它实际上是针对端口“bb”的地址的情况:哪个应该是 ICM 回复中的源地址?“啊”?'bb'?或路由器获得的任何其他地址?
»将路由器想象成与端口一样多的部分»
在 TCP 设计中,节点(路由器或计算机)没有地址,只有接口有地址,但 ICMP 是由节点而不是接口完成的。这带来了相当多的歧义。它们实际上是故意的。请注意,Linux TCP/IP 堆栈的设计有些不同,但它有偏差。
正如其他人指出的那样,大多数时候路由器会从“aa”接口回答。由于我还不能发表评论,我将在这里补充以前的答案。如果您想节省一些 IP 地址,并且您对单独 ping 接口不感兴趣,也可以在路由器之间的点对点链路上具有未编号的接口。在这种情况下,您可以通过分配给环回接口的 IP 地址访问路由器,该地址也是您在 traceroutes 中看到的地址。
然而,这是一个例外情况,并不是一个特别好的操作实践。