1. 相关ICMP协议概述
这里只讲解与tracert有关的ICMP消息类型,网关发送超时报文(type = 11),主机发送目标不可达报文(type = 3),基本格式如下:
超时报文
其中code = 0,表示由网关发送
目标主机不可达报文
其中code = 3,表示在目的主机,端口不可用
2. Tracert流程
首先明确TTL是IP报头中的字段,TTL表示了数据包的time to live,即还能经由多少跳,所以TTL = 1表示数据包将在下个路由或主机被丢弃,并发送超时报文;
其次为了明确已到达主机,发送时目的端口设为非法端口(如58127),这样主机收到报文后会发送目标不可达报文。
下面是tracert的流程:
1> 构造UDP数据包,设置TTL = 1
2> 发送UDP数据包,记录发送时间t1
3> 接收ICMP差错包,如果是超时报文,则是经过的中间路由,记录路由信息,记录接收时间t2,计算时间(t2 - t1);如果是目标不可达报文,则抵达目的主机,记录势头收时间t2,打印信息,退出
4> 构造UDP数据包,设置TTL += 1,返回第二步
其中,TTL的每个数值(如TTL = 1)发送3次UDP包,即重复2~3步3次;
接收超时,打印"*"表示报文丢失
3. 模拟tracert实现tracerty
• 发送使用UDP报文,每次发送只需设置IP报头的TTL字段
• 接收使用SOCK_RAW
• 对收到数据包处理
首先从IP报头得到IP报头长度
int hlen = ip->ip_hl << 2; // total ip header length
然后定位到ICMP报头,检查各字段合法性,对超时报文处理
对目标不可达报文处理
4. 程序源代码
http://download.csdn.net/source/2194656
5. 最终效果