日期:2014-05-16  浏览次数:20668 次

Linux 下 traceroute 的实现原理
traceroute是一个非常好用的用于跟踪路由包的工具,最基本的用法是 traceroute xxx.xxx.xxx.xxx
这条命令会输出从本机到指定ip地址所经过的所有路由节点的ip,以及一些时间等额外信息。

tranceroute的实现原理,主要是依赖了ICMP(Internet Control Message Protocol)协议,该协议
主要用于在网络中传递控制信息,包括一些出错信息等。协议定义了一些标准错误类型,其中有一项为:
ICMP_TIME_EXCEEDED,该类型包含两个子类型:
ICMP_EXC_TTL        超过TTL
ICMP_EXC_FRAGTIME   超过片段重组时间

ICMP_EXC_TTL 是traceroute实现的根本基础,原理如下:
假设A主机使用traceroute来跟踪至E主机的路由途径,则A会发送携带ICMP_ECHO(这是ping命令的实现基础),且TTL为1的IP包
显然,路由B在收到该包时,由于TTL=1,则拒绝转发该包,并发送ICMP_EXC_TTL代码给源地址。当A收到该反馈后,会继续发送ICMP
包,并递增TTL,使其加1,这样,则会找到路由表中的下一个路由跃点。以此方法,则可以获得全部的路由节点。

当然,这种方法返回的路径并不一定是完全正确,主要是因为复杂网络中的一些不可控因素或者动态路由的原因,使得结果不一定100%
和实际情况吻合。