Tracerotue 作为网络排错的常用工具可以显示出数据包在网络中经过的路由信息,它的工作原理也是网络工程师求职面试时的经典问题。
Traceroute 的实现一共有三种方法,分别是:TCP traceroute(使用 tracetcp 程序可以实现)
UDP traceroute(Cisco 和 Linux 默认情况下使用)
ICMP traceroute ( MS Windows 默认情况下使用)
我们首先来分析基于 UDP 和 ICMP 的 traceroute,然后再来分析基于 TCP 的 traceroute,因为前两者非常类似。
UDP 和 ICMP Traceroute
Traceroute 的基本原理是向外发送带有逐次递增 TTL 的数据包从而获取的路径中每一跳的信息。
Host A 向 Host B 做 traceroute,Host A 第一次会发出一个 TTL=1 的数据包,当该数据包到达 R1 时,TTL 会变为 0 (网络上每经过一跳 TTL 会减去 1),R1 会将 TTL=0 的数据包丢弃并返回一个 ICMP Time Exceeded 给 Host A。Host A 发出第二个数据包并将 TTL 增加1 (TTL=2),该数据包到达 R2 后 TTL=0,R2 向 Host A 返回 ICMP Time Exceeded。依此类推,直到 TTL 增加到一个合适的值让数据包顺利到达 Host B,Host B 会返回一个 Final Replay 给 Host A。
UDP 和 ICMP traceroute 的区别就在于向外发送的数据包(上图中红色标明的 packet)和最后的 final reply。UDP 向外发送的是一个 UDP 数据包,final reply 是 ICMP Destination Unreachable
ICMP 向外发送的是一个 ICMP Echo Request,final reply 是 ICMP Echo Reply
TCP Traceroute
TCP traceroute 同样利用了 TTL 来探测网络路径但是它向外发送的是 TCP SYN 数据包,这样做最大的好处就是穿透防火墙的几率更大因为 TCP SYN 看起来是试图建立一个正常的 TCP 连接。
关于 Cisco 的 traceroute 更详细的资料可以参考 Cisco Using the traceroute Command on Operating Systems (Document ID:22826)。