跟踪路由、ICMP、UDP 和 TCP

跟踪路由、ICMP、UDP 和 TCP

traceroute 什么时候使用 TCP?或者它只使用 UDP,为什么 traceroute 在 MacX 上使用 UDP,而在 Windows 上使用 ICMP?我以为 ICMP 只包含一条消息,说明导致数据包错误的原因,并不像 TCP 和 UDP 那样传输段。

答案1

ICMP 消息仍然是 IP 数据包。TracerouteECHO Request在 Unix 和 Windows 上默认使用 (ICMP 类型 8),并增加 TTL,记录Time Exceeded从路由沿途的跳数中返回的每个 (类型 11) 消息的发送地址。(参见:http://en.wikipedia.org/wiki/Internet_Control_Message_Protocol

这是“正确”的做法,但是如果路由上的某些系统丢弃或以不同的方式处理 ICMP 流量,您可能会遇到问题。

某些实现traceroute(例如在 Linux 上)具有切换到 TCP/UDP 的选项(以及用于指定目标端口的后续参数-T)。这对于更紧密地模拟真实流量很有用,在某些情况下可能会让您获得更准确的结果。-U-p

我怀疑 OSX 实现默认使用 UDP 就是因为这个原因,但我不能肯定。您可能会找到一个开关来改用 ICMP。

答案2

Windows Tracert 通常使用具有特定 TTL 的 ICMP。TTL 会逐跳增加,直到到达目的地。这意味着第一跳的 TTL(最大跳数)为 1。即使数据包未到达目标,第一跳也会丢弃它并发回 TIME EXCEEDED 消息,此消息用于映射路由,下一个 ICMP 的 TTL 为 2。

OSX 和 Linux 默认使用 UDP,端口号不断增加,但都可以配置为使用 TCP、UDP、ICMP 或 GRE 数据包。

答案3

要使 GNU traceroute 像 Windows 一样使用 ICMP,请使用:

traceroute host -I

相关内容