![跟踪路由、ICMP、UDP 和 TCP](https://linux22.com/image/801108/%E8%B7%9F%E8%B8%AA%E8%B7%AF%E7%94%B1%E3%80%81ICMP%E3%80%81UDP%20%E5%92%8C%20TCP.png)
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