使用ICMP实现路由跟踪
2010-06-27 20:40:36 来源:WEB开发网三、路由跟踪的实现方法
路由跟踪的实现就是巧妙地利用了ICMP报文的TTL超时报文。其实现过程如下:源主机先向目的主机发送一个回应请求报文(类型8),TTL值设为1,第一个路由器收到后将TTL减1,这样TTL变为0,分组被废除,同时路由器向源主机发送一个TTL超时报文(类型为11),报文的IP包头中的源IP地址就是第一个路由器的地址,源主机就可以通过对该报文进行分析,得到第一个路由器的地址。接着发送TTL等于2的报文得到第二个路由器地址,再发TTL等于3的报文,如此下去直到收到目的主机的回应应答报文(类型为0)或目的不可达报文(类型为3),或者到了最大跳数(要检测路由器个数的最大值)。可以看到,对TTL的设置是实现跟踪的关键,使用函数setsockopt(m_Sock, IPPROTO_IP, IP_TTL,(LPSTR)&TTL,sizeof(int)) 可以对其进行设置,m_Sock是所创建的套接字,IP_TTL说明是进行TTL设置,TTL即是要设置的TTL值,为一个整形数值 。其实现流程可用下图2表示:
(图2) 流程图
四、程序实现
本文所介绍的程序是使用了Visual C++6.0编写,其过程如下:
1、创建一个新的基于对话框的AppWizard工程,并命名为RouteTrace。
2、在stdafx.h中加入#include "winsock2.h"。
3、打开选择菜单Project->Setting (ALT+F7),进入Project Setting 对话框,在Link下的 Object/library modules 输入ws2_32.lib,然后点OK。
4、自定义一个ICMP类。点击菜单中的Insert->New Class,进入New Class对话框,在Class type中选择Generic Class,在Name中输入类名CICMP,然后点OK,这样就新建了一个CICMP类。
5、将对话框设置成如图3所示的样子:
(图3 程序界面)
启动Class Wizard 为各控件添加响应函数和关联变量,控件对应的ID及响应函数或变量为:
控件 | ID | 响应函数 | 变量 |
地址组合框 | IDC_COMBO | CComboBox m_comb | |
最大跳数编辑框 | IDC_MAXHOT | int m_maxhot | |
跟踪按钮 | IDC_TRACE | OnTrace() | |
停止按钮 | IDC_STOP | OnStop() | |
列表框 | IDC_LIST | CListCtrl m_list |
更多精彩
赞助商链接