用 python 写的 Traceroute 程序。输入指定 ip 地址,程序会自动列出中间经过的路由器、往返时延。
用到的模块主要有 socket、struct、select等。
核心:ICMP网际控制报文协议、python socket编程。
思路:当路由器收到一份 ip 数据报,如果该报文的 ttl 字段值为 1 ,则意味着它在网路中的生存周期已经消耗殆尽了,本路由处理后还未到达目的主机的话,需要将该数据报丢弃,并给信源主机发送一份 ICMP 超时报文(包含该中间路由器的地址)。
这意味着:发送一份 ttl 字段为 n 的 ip 数据报给目的主机,就可以得到该路由路径中的第 n 个路由器的 ip 地址。那么我们 ip 数据报的 ttl 字段值从 1 开始依次递增,就可以获得所有中间路由的 ip 地址。 当 ip 数据报到达目的主机时,由于已经到达目的主机,因此不会再发送 ICMP 超时报文了,而是 ICMP 应答报文。 通过区分收到的 ICMP 报文是超时(type = 11)还是目的不可达(type = 3),以判断程序应该何时结束。
操作系统:centOS 6
开发平台:python 2.7
在 windows 机器上,可能会因为默认的防火墙设置导致程序不正常运行,最好用 Linux 运行吧。