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