原来总以为traceroute很简单。现在才发确实是不容易的

traceroute使用了两种不正常的方式来测试,以获得我们预期的结果。一种是TTL=0,另外一种是UDP端口不可达。
在windows下,traceroute使用的是ICMP协议
在unix下,traceroute使用的是UDP协议
windows下,traceroute依次发送icmp报文,TTL=1、2、3...,探测路径。最开始TTL=1,这个报文的类型和代码字段分别是8、0。到遇到第一跳的时候,返回一个类型代码为11、0的差错包,表示TTL=0。然后接着发送TTL=2,探测第二跳。这样一直下去。直到到达目的地
unix下,traceroute发送的是UDP(端口号大于30000)的三个包。同时TTL=1、2、3...,在没到达最终路径之前,过程和windows一样。但是在到达目的地的时候,会发出一个
端口不可达的ICMP差错报文。类型、代码为3、3。
这里需要注意的一点,
三个UDP报文的端口号是不一样的。这样做的好处是,可以查到链路上的负载均衡。绝大多数的负载均衡的设备是基于流的。这三个端口号不一样的包数据三个流,这样可以查看到负载均衡的情况。
还有一点需要注意的就是,traceroute探测到的是 入站接口的IP地址。而ICMP的源站路由检测的是出站接口的IP地址。他们使用的原理是完全不一样的。
ping的源站路由可以记录往返的路径。但是只能记录最多9个地址。