Answers:
发送的数据包类型取决于实现方式。默认情况下,Windows tracert
使用ICMP,而Mac OS X和Linux都traceroute
使用UDP。我没有手头的BSD或Solaris机器或任何其他OS,但是Mac OS X版本的手册页提到其出处是BSD 4.3。
我提供的Mac和Linux版本能够选择各种不同的协议,包括ICMP,TCP,UDP和GRE数据包。可以通过名称或编号指定其他协议,但traceroute对其他协议的工作原理一无所知。它只是盲目地发送给他们。
他们还可以更改有效负载以及源端口和目标端口,以避开防火墙或发现路径上哪台路由器正在丢弃一定大小的数据包。
所有版本的traceroute都依赖于路由中每个跃点的ICMP 11类(超过时间)响应。如果防火墙阻止了ICMP 11类响应,则traceroute将不起作用。这些数据包是入站的,不是出站的。
ICMP类型30专为跟踪路由指定,并标记为“信息请求”。我还找不到任何实际使用它的地方。Mac OS X和Linux版本的手册页上说-I
将发送ICMP类型8(回显请求)。维基百科说Windows tracert
也使用ICMP回显请求。ICMP类型30或类型8是出站数据包,不是入站数据包。
当TTL完全等于跳数时,ICMP类型0(回波响应)可能作为最后一个数据包返回。当Traceroute接收到其中之一时,它将知道它已经完成。这是入站数据包。
TCP SYN数据包到达目的地时,将导致一个RST
数据包或一个SYN ACK
数据包作出响应。如果您收到一个SYN ACK
数据包,则最好跟进一个RST
数据包,以免在服务器上留下半开的连接。
如果发送设置了“请勿分段”标志的大数据包,则可能会返回ICMP 3类型的代码4响应,而不是ICMP 11类型的响应,但是,这很可能只允许您找到MTU最小的跃点。通常,您只会从沿路线的一跳处得到这种响应。不是所有的人。