traceroute程序设计与实现(20210119152644)_第1页
traceroute程序设计与实现(20210119152644)_第2页
traceroute程序设计与实现(20210119152644)_第3页
traceroute程序设计与实现(20210119152644)_第4页
traceroute程序设计与实现(20210119152644)_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、traceroute程序设计 与实现 Traceroute程序设计与实现 学生姓名:樊冠宇 指导老师二姜文超 摘要本文主要讲述了路山追踪的基本程序设计与实现,并给出了一种基 于IP网络的路III追踪命令Tracert,详细分析了实现路山追踪的基本原理,归纳了 路由追踪的基本流程。Tracert通过ICMP协议和I P header中T T L (存活时 间)利用路山器对数据报存活时间的处理方式来实现路山探测的。首先根据任 务书设计好流程图,然后编写程序代码,运行得到Traceroute的命令窗口。提取 tracert的输出,再结合现有IP数据库及自建地名-坐标数据库对路山中各节点IP进 行定位

2、,最终实现了动态显示追踪的详细信息和路径。 关键词:IP地址,ICMP协议,TTL, Tracert路由追踪 Internet,是LI前世界上最大的讣算机网络,更确切的说是网络中的网络,它 山遍布全球的儿万局域网和数白万台讣算机组成,并通过用于异构网络的 TCP/IP协议进行网间通信。互联网中,信息的传送是通过网中许多段的传输介 质和设备从一端到达另一端。每一个连接在Internet 的设备,如主机、路由 器、接入服务器等一般情况下都会有一个独立的IP地址。通过Traceroute我们 可以知道信息从你的讣算机到互联网另一端的主机是走的什么路劲。当然每次 数据包山某一同样的出发点到达某一同样的

3、LI的地走的路劲可能会不同,但基 本上来说大部分时候所走的路由是相同的。随着Internet (国际互联网)的发 展,越来越多的服务通过网络提供给大众,与此同时,针对互联网的攻击事件 也越来越频繁。所谓路山追踪实际上就是在IP网络上判断从源到达LI的所经过 的路山器的IP地址,其基本的实现手段都是向口的地发送数据包以获取经过的 路由器的IP。山于Internet 的路山协议是动态的,所以每次形成的数据包从 同一个出发点到达目的地的路由可能会不一样,但由于路由算法有一定的稳定 性,在大部分时侯所走的路山会是相同的。 课程设计目的 1. 这次课程设汁,主要为了加深同学们对计算机网络网络的理解和认识

4、 2. 了解信息在计算机网络与网络之间的传送和接收 3. 进一步加深了解网络与网络之间的协议 4. 理解网络中的IP地址以及路山之间的相关命令。 课程设计内容 1 .已知参数:输入:目的节点IP地址或主机名;输出:从控制台屏幕输出IP报 文山本机出发到达LI的主机所经过的路山信息。 2.设计要求:通过原始套接字编程,实现Tracert的基本功能 初始化Windows Sockets网络环境; 解析命令行参数,构造U的端socket地址; 定义IP、ICMP报文; 接收ICMP差错报文并进行解析。 课程设计要求 (1)按要求编写课程设讣报告书,能正确阐述设讣结果。 (2)通过课程设计培养学生严谨

5、的科学态度,认真的工作作风和团队协作精 神。 (3)学会文献检索的基本方法和综合运用文献的能力。 (4)在老师的指导下,要求每个学生独立完成课程设计的全部内容。 2设计原理 raceroute是一个路由跟踪命令,它通过ICMP协议和I P header中T T L (存活时间)来实现的。具体而言就是:发送方发出一个TTL是I的IP Datagram (事实上每个数据包发送三次,大小为40字节,包括本机的IP地 址,目的主机的IP地址以及时间戳),当经由第一个路曲器时,路由器将该数 据包的TTL减1,发现此时的TTL为0,将数据包丢失,同时向源主机发送一个 ICMPTime-to-Exceed报

6、文(包括源主机的IP地址、路由地址以及路由的相关消 息),源主机收到这个数据包后就知道了这个路由器在这条路径上。同理发送 第二个、第三个.第n个。源主机将每次I P数据报的TTL+ 1 ,直到某个 数据报到达了目的地址,此时不知发回一个I CMP T i me- t o-E x c e e d ,而是发送一个数据报的响应报文。当源主机收到这样一个报文后便 知道数据包已经到达了口的地。Traceroute提取发ICMPTTL到期消息设备的IP 地址并作域名解析。每次,Traceroute都打印出一系列数据,包括所经过的路由 设备的域名及IP地址,三个包每次来回所花时间。Traceroute有一个

7、固定的时间 等待响应(ICMPTTL到期消息)。如果这个时间过了,它将打印出一系列的*号表 明:在这个路径上,这个设备不能在给定的时间内发出ICMPTTL到期消息的响 应。然后,Traceroute给TTL记数器加1,继续进行。 简介和基本原理 ICMPflnternet Control Message Protocol),B卩 Internet 控制报文协议,它是 TCP/IP协议族的一个子协议”属于网络层面向无连接的协议,主要用于在主机与 路山器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到 IP数据无法访问U标、IP路山器无法按肖前的传输速率转发数据包等情况时, 会自动

8、发送ICMP消息。ICMP报文被包装成IP数据包传到数据链路层进行传 输。通过ICMP协议,主机和路由器可以报告错误并交换相关的状态信息。 ICMP对于TCP/IP协议的可靠运行是至关重要的。ICMP报文结构如图1所示: p7815 1631 位类型|8位代码 |16位校验和 (不同类型和代码有不同的内容) 图1 ICMP报文結构 程序的基本原理 路山追踪的主要原理是根据路径上各路山器对数据报的存活时仃imeto Live, TTL)做不同的处理,使其产主超时ICMP消息响应,反馈至源主机从而获得 此跳路由器或主机的IP。照此再发送下一个TTL经过自增的数据报,直至获得整 个路由中各节点的IP

9、或者接收到错误的消息。详细过程描述如下: 1)置n =假设该过程中共经过M个路曲器。 2)源主机S向口标主机D发送一个TTL为n的UDP数据报。并设定端口号 (一般大于30 000)。 3)路曲器(或者网关、主机)Rn对接收到的数据报的TTL值n做减1处理。 4)若n = 0,则丢弃UDP数据报,向源主机S发送ICMP超时报文。 5)若n$l,继续向LI标主机D发送经过处理的数据报。 6)源主机S分析返回的ICMP报文,从中提取出发送者Rn的地址IPn并做记 录。 7) 若收到“端口不可达”的ICMP报文,则发送方即H标主机D,记录其地址 IPn,追踪完成。 8) 置n = n +1,继续向目

10、标主机D发送TTL为n的数据报。 注意,这里使UDP数据报的端口号大于30000,是因为一般的应用程序不可能 使用如此高的端口号。当然这并非绝对,若出现例外,则源主机会发现等待超时, 于是随机改变此UDP数据报的端口号,再次发送。这样最终可以在标主机上找 到一个空闲的端口号。另外,这里假设路由器和U标主机没有被配置为“过滤 ICMP”或者做了其他的非常规处理,如果被做了类似的配置,则上面的追踪机制 就无能为力了。 实现的功能 IP数据报的首部山两部分构成:固定部分和可变部分。固定部分的长度是 20个字段,可变部分由许多选项构成,最长可达40个字节。虽然选项并不是 IP数据报的必需部分,但选项的

11、处理却是IP软件的必需部分。 在现在的TCP/IP协议中,只定义了六种选项,对于我们进行路由追踪技术 有用的是记录路山选项,一个记录路山选项是用来记录处理IP数据报的互联网 路由器的IP地址。因为首部的最大长度是60个字节,它包括20个字节的基本 首部。这就意味着只剩下40个字节留下给选项部分,所以通过选项字段最多能 够记录9个路山器的IP地址。源站在选项中创建一个位标置(placeholder),用 来填入所经过的各路III器,图2给出了记录路山选项的格式。 向目的主机发送一个ICMP报文,这种方法只要求使用一个套接字。ICMP即 Internet控制报文协议,是一种用于特殊用途的报文机制,

12、可以使互联网中的路 山器或主机报告差错或提供有关意外情况的信息。尽管UDP和ICMP工作在 TCP/IP的不同层次上,但他们的封装是类似的。ICMP报文为两级封装ICMP报文 放在IP数据报的数据部分,数据报则放在帧的数据中进行网络传输(如图3所 示)ICMP报文与其他普通报文一样,具有相同的路山选择,并没有特殊的优先 权和增加可黑性。通过路III选项的方法记录路山的实现同UDP数据报是相似 的,这里主要说明通过TTL方法的实现。 分析本次课程设计的任务书,整个课程设计的过程大致可以分为三个步 骤:第一步主要是设讣好流程图;笫二步是根据流程图编写程序代码;笫三步 是在程序编译通过后,运行程序结

13、果,在对话框中输入要追踪的IP地址,观察 路111追踪命令追踪IP地址在网络中的运行。其中第一步跟第二步是关键,只有 完整的流程图和根据要求编写好正确的程序,才能运行得到正确的结果。下面 是整个设计过程中各个步骤的详细分析。 流程图 根据要求设计好的流程图如图4所示: 图4流程图 的核心程序 整个设讣过程的核心程序代码: include ,u, include include include #讦 def _DEBUG #undefTHIS_FILE static char THIS_FILE=_FILE_; #define new DEBUG.NEW #endif void CPing:Pi

14、ng(int timeout) m_hSocket = WSASocket (AFJNET, SOCK_RAWZ IPPROT0CMP, NULL, 0,WSA_FLAG_OVERLAPPED); 讦(m_hSocket = INVALID_SOCKET) AfxMessageBox(socket 创建失败! return ; Start sending/receiving ICMP packets 开始发送/接收 ICMP 的数据包 拴TraceRoute 路由跟喘 |www. sina. com| 跟踪报告 #define new DEBUG_NEW #end 讦 llllllllllll

15、llllllllllllllllllllllllllllllllllllllllllllllllllllllllll / Construction/Destruction llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll /IP struct IPHEADER unsigned int hen:4;/ 首部长度 unsigned int version:4; / 版本 unsigned char tos; 服务类型 unsigned short total_len; 报文总长度 unsigned sho

16、rt ident; /标识 unsigned short frag_and_flags; 偏移量 unsigned char ttl; 寿命 unsigned char proto; 协议 unsigned short checksum;首部校验和 unsigned int sourcelP; 源站IP unsigned int destIP; /目的站IP ; /ICMP首部数据结构 struct ICMPHEADER BYTE Ltype;类型 BYTE Lcode;代码 USHORT i_cksum; USHORT ijd; USHORT Lseq; ULONG timestamp; ;

17、 首部校验和 /标识 序列号 时间戳(选用) CTracer:CTracer() Seq=l; icmpData=NULL; icmpRcvBuf=NULL; m_hSocket=INVALID_SOCKET; 初始化socket WSADATA wsaData; if(WSAStartup(MAKEWORD(2,2)/ CT racer: :CT racer() 关闭 Socket 讦(m_hSocket!=NULL) closesocket(m_hSocket); WSACIeanup(); /Checksum USHORT CTracer:CheckSum(char* pBuffer,i

18、nt size) USHORT* buffer=(USHORT*)pBuffer; unsigned long cksum=O; while(size 1) cksum += *buffer+; size -= sizeof(USHORT); 讦(size ) cksum += *(UCHAR*)buffer; cksum = (cksum 16) + (cksum cksum += (cksum 16); return (USHORT)(cksum); /FillAddress BOOL CTracer:FillAddress(char *addrDest) memset( =AFJNET;

19、 if(in et_addr(addrDest)=INADDR_NONE) - 输入的地址为计算机名字 HOSTENT* hp=NULL; hp=gethostbyname(addrDest); if(hp) memcpy( =hp-h_addrtype; else AfxMessageBox(n 获取地址失败! ”); return FALSE; else return TRUE; /FilllCMPData void CTracer:FilllCMPData(char* icmpDatajnt size) memset(icmpData,O,size); ICMPHEADER* icmpH

20、eader=NULL; icmpHeader=(ICMPHEADER*)icmpData; icmpHeader-i_type =ICMP_ECHO; icmpHeader-i_code =0; icmpHeader-i_id =(USHORT)GetCurrentProcessld(); icmpHeader-i_seq =m_n Seq+; /GetTickCoun?返回从一0点到现在的毫秒数,作时间戳 icmpHeader-timestamp=GetTickCount(); char* datapart=icmpData+sizeof(ICMPHEADER); memset(datapa

21、rt,*,/size-sizeof(ICMPHEADER); 填充校验和 icmpHeader-i_cksum =CheckSum(icmpData,size); 设置数据报的寿命 BOOL CTracer:SetTTL(SOCKET hSocket, int ttl) int result; resu It=setsockopt( hSocket, IPPROTOPP_TTL,(LPSTR) if(result=SOCKET_ERROR) AfxMessageBox(i5置数据报寿命失败! ”); TerminateProcess(GetCurre ntProcessOJ); return

22、TRUE; 发送数据报 BOOL CTracer:SendData(char* icmpDataJnt size) 填充ICMP报头 FilllCMPData(icmpData,size); 发送数据报 int result; timel=GetTickCount(); result=sendto(m_hSocket/icmpData/size,0/(SOCKADDR*) if(result=SOCKET_ERROR) if(WSAGetLastError()=WSAETIMEDOUT) (CTraceRouteDlg*)m_pWnd)-lnfoAdd (发送超时冷; return TRUE;

23、 AfxMessageBoxf发送报文失败!); TerminateProcessfGetCurr en tProcess()d return FALSE; 接收数据报 BOOL CTracer:RecvData(char* icmpRcvBuf,int* presuit) static int count=0; 总共6次出现接收超时,判断存在连接问题。 if(count5) AfxMessageBox(n 连接存在问题!”); TerminateProcessfGetCurr en tProcess()l); int fromlen=sizeof(SOCKADDR); *presult=SO

24、CKET_ERROR; *presult=recvfrom(m_hSocket,icmpRcvBuf,MAX_PACKET/0,(SOCKADDR*) time2=GetTickCount(); 讦(*presult=SOCKET_ERROR) if(WSAGetLastError()=WSAETIMEDOUT) (CTraceRouteDlg*)m_pWnd)-lnfoAdd (接收超时!); cou nt+; return TRUE; AfxMessageBox(u接收数据报失败!); TerminateProcessfGetCurre ntProcess()广 1); return FA

25、LSE; 处理接收到的数据报 BOOL CTracer:DecodelCMP(char* pBufferJnt bytes,int ttl) IPHEADER *ipHeader=NULL; ICMPHEADER *icmpHeader=NULL; unsigned short ipHeaderLen; HOSTENT *ph=NULL; in_addr inaddr=; ipHeader=(IPHEADER*)pBuffer; ipHeaderLe n=20; 讦(bytesi_type) 目的站点的返回 case ICMP_ECHOREPLY: ph=gethostbyaddr(const

26、 char *) 讦(ph !=NULL) CString report; (%2d %s (%s),/ttl,ph-h_name/inet_ntoa(inaddr); (CTraceRouteDlg*)m_pW nd)lnfoAdd(report); _ return TRUE; break; 中途路由器的返回 case ICMP_TIMEOUT: CString report; (%2d %s %2d msttl, inet_ntoa(inaddr),(time2- timel); (CTraceRouteDlg*)m_pW nd)lnfoAdd(report); return FALSE

27、; break; 错误:主机不可达 case ICMP_DESTUNREACH: CString report; (%2d %s 主机不可达,ttlzinet_ntoa(inaddr); (CTraceRouteDlg*)m_pW nd)-lnfoAdd(report); return TRUE; break; 收到一个不是回应的报文 default: L CString report; (非回应报文”); (CTraceRouteDlg*)m_pW nd)lnfoAdd(report); return TRUE; return FALSE; void CTracer:SetWnd(CDial

28、og *pWnd) i殳置窗口指针 m_pWnd=pWnd; _ void CTracer:Trace(char *destAddress) int size二DEF_PACKET_SIZE+sizeof(ICMPHEADER); 转换地址 讦(!FillAddress(destAddress) return ; 分配必要的内存空间 icmpData=(char*)HeapAlloc(GetProcessHeap()/HEAP_ZERO_MEMORY,MAX_PACKET); icmpRcvBuf=(char*)HeapAlloc(GetProcessHeap()/HEAP_ZERO_MEMORY,MAX_PACK ET); if(!icmpData | | licmpRcvBuf) AfxMessageBox(分配内存空间失败!*); TerminateProcesstGetCurrentProcessO,-!); memset(icmpData,O,l/IAX_PACKET); memset(icmpRcvBuf,O,MAX_PACKET); 初始化套接字 m_hSocket=WSASocket(AFJNET,SOCK_RAW,IP

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论