![关于到达目标的实际路径,traceroute 输出是否正确](https://linux22.com/image/1401831/%E5%85%B3%E4%BA%8E%E5%88%B0%E8%BE%BE%E7%9B%AE%E6%A0%87%E7%9A%84%E5%AE%9E%E9%99%85%E8%B7%AF%E5%BE%84%EF%BC%8Ctraceroute%20%E8%BE%93%E5%87%BA%E6%98%AF%E5%90%A6%E6%AD%A3%E7%A1%AE.png)
这手册页对于 traceroute 来说“ traceroute 跟踪从 IP 网络到给定主机的路由数据包。”,但是在研究这个主题时,我无法找到任何统计数据/科学工作来表明 Traceroute 实际上有多精确,显示的路由是否是实际采取的路由(也许不同的数据包使用完全不同的路由)以及误差幅度是多少,以及是否有可能由于不同的路由协议,Traceroute ping 可能会显示与后续 TCP 请求甚至实际 ping 数据包所采用的完全不同的路径。
我发现的唯一一个暗示 Ping 跟踪可能不完美的工作是关于 scamper 的文档这句话的意思是“ping 可用于测量端到端延迟和丢失、搜索响应 IP 地址以及通过检查主机如何响应探测来对主机的行为进行分类。”并且(据我所知)使用 MDA traceroute 进行路径检测。因此,这意味着使用 PING 可能不会得到预期的结果。
因此我的问题是:使用 Traceroute 进行路径检测的可靠性如何(为什么)?我将非常感激有关该主题的详细信息的链接,但是一般性解释一下为什么或为什么不这样也足够了。
答案1
最重要的是要记住路线不是静态的。根据设计,公共互联网上的路由一直在变化。有时路由会因负载平衡而改变;有时路由会因节点故障而改变;有时路由会因为路由器随机决定更改路由规则(只是为了改变现状)而改变。
从没有系统管理员级别访问权限(访问数据包的起点和终点之间的每个中间路由器和互联网集线器)的最终用户的角度来看,您必须将其视为海森堡不确定性原理。
需要考虑的事项:
根据数据包中声明的 IP“目的地”,中间路由器可能会决定为你安排不同的路线。因此,如果跟踪路由尝试按顺序映射源和目标之间的路由器,则根据您尝试到达的节点,路由可能会采取不同的路径,从而使跟踪路由偏离路线。
并非所有路由器都会监听 ICMP 或 UDP ping。它们可能会选择默默忽略此流量,并将其丢弃在 NIC 上(通常是为了帮助抵御 DDoS)。这可能会使您映射路由的尝试失败。
即使您成功映射了一条路由,并且所有中间节点都回复了您的 ping 并且没有尝试去操作您的映射尝试,那么在您使用某些“真实”协议发送的下一个数据包时(或者即使您第二次尝试跟踪路由),该路由也可能会发生变化。
QoS 可能会导致正常运行的网络以不同的方式路由流量。例如,VoIP 或流媒体视频可能采用一条路径,而常规网页浏览可能采用另一条路径。
这类型流量的差异可能会导致路由不同。例如,即使不考虑 QoS,FTP 的路径也可能与 SSH 的路径不同。中间节点可以行使任何酌处权(在确定从每一跳路由流量到何处时,可以是完全随机选择的路线,也可以是恶意尝试减慢您的流量,或是通过路由到负载最小的节点来加快您的连接速度的诚实尝试)。
理论上,如果中间路由器愿意,它们也可以将您的跟踪路由尝试变成无限循环:节点 A 指向节点 B,节点 B 指向节点 C,节点 C 指向节点 A。没有什么可以阻止路由器对被检测为“跟踪路由”(ICMP 或 UDP ping)的数据包执行此操作(我不确定它们为什么会选择这样做,但这是一种可能性)。它可以这样做以试图挫败您的努力,或出于任何其他原因。
多路径发现算法很有用,但它无法克服这些理论上的局限性。
基本上,为了确定路径,你必须发送一个或多个数据包。这些数据包可以按照中间节点认为合适的任何方式路由。但是,一旦你发送另一个数据包,就绝对没有什么可以阻止路由器改变路径。这有点像海森堡不确定性原理的网络类比。
路径是短暂的和短暂的。您不应该依赖从跟踪路由收到的任何重要信息,除非诊断您已经深入了解拓扑结构(例如,在复杂的企业局域网上)的网络的连接问题,并且可以控制参与节点的行为。如果任何参与节点不是“您的”(如果您无法使用系统管理员权限登录它们),则跟踪路由的结果实际上是任意的。
另一方面,如果所有参与节点是作为管理员,您可以控制每个节点的确切行为。例如,您可以启用 ICMP,并设置静止的路由(不变的路由)。然后您可以确信您的跟踪路由是准确的。但是,如果您将负载均衡器放在中间,那么您将必须了解负载均衡器的行为以及它可以根据需要切换路由的方式(尽管它通常不是随机的,并且通常不会故意欺骗您)。