




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、201Traceroute程序設計與實現學生姓名: 樊冠宇 指導老師:姜文超摘 要 本文主要講述了路由追蹤的基本程序設計與實現,并給出了一種基于IP網絡的路由追蹤命令Tracert,詳細分析了實現路由追蹤的基本原理,歸納了路由追蹤的基本流程。Tracert通過ICMP協議和 header中(存活時間)利用路由器對數據報存活時間的處理方式來實現路由探測的。首先根據任務書設計好流程圖,然后編寫程序代碼,運行得到Traceroute的命令窗口。提取tracert的輸出,再結合現有IP數據庫及自建地名- 坐標數據庫對路由中各節點IP進行定位,最終實現了動態顯示追蹤的詳細信息和路徑。關鍵詞: IP 地址
2、,ICMP協議,TTL,Tracert路由追蹤1 引 言Internet,是目前世界上最大的計算機網絡,更確切的說是網絡中的網絡,它由遍布全球的幾萬局域網和數百萬臺計算機組成,并通過用于異構網絡的TCP/IP協議進行網間通信。互聯網中,信息的傳送是通過網中許多段的傳輸介質和設備從一端到達另一端。每一個連接在Internet上的設備,如主機、路由器、接入服務器等一般情況下都會有一個獨立的IP地址。通過Traceroute我們可以知道信息從你的計算機到互聯網另一端的主機是走的什么路勁。當然每次數據包由某一同樣的出發點到達某一同樣的目的地走的路勁可能會不同,但基本上來說大部分時候所走的路由是相同的。
3、隨著Internet(國際互聯網)的發展,越來越多的服務通過網絡提供給大眾,與此同時,針對互聯網的攻擊事件也越來越頻繁。所謂路由追蹤實際上就是在IP網絡上判斷從源到達目的所經過的路由器的IP地址,其基本的實現手段都是向目的地發送數據包以獲取經過的路由器的IP。由于Internet上的路由協議是動態的,所以每次形成的數據包從同一個出發點到達目的地的路由可能會不一樣,但由于路由算法有一定的穩定性,在大部分時侯所走的路由會是相同的。1.1 課程設計目的1.這次課程設計,主要為了加深同學們對計算機網絡網絡的理解和認識2.了解信息在計算機網絡與網絡之間的傳送和接收3.進一步加深了解網絡與網絡之間的協議4
4、.理解網絡中的IP地址以及路由之間的相關命令。1.2 課程設計內容1.已知參數:輸入:目的節點IP地址或主機名;輸出:從控制臺屏幕輸出IP報文由本機出發到達目的主機所經過的路由信息。2.設計要求:通過原始套接字編程,實現Tracert的基本功能2.1初始化Windows Sockets網絡環境;2.2解析命令行參數,構造目的端socket地址;2.3定義IP、ICMP報文;2.4接收ICMP差錯報文并進行解析。1.3課程設計要求(1)按要求編寫課程設計報告書,能正確闡述設計結果。(2)通過課程設計培養學生嚴謹的科學態度,認真的工作作風和團隊協作精神。(3)學會文獻檢索的基本方法和綜合運用文獻的
5、能力。(4)在老師的指導下,要求每個學生獨立完成課程設計的全部內容。2設計原理raceroute是一個路由跟蹤命令,它通過ICMP協議和 header中(存活時間)來實現的。 具體而言就是:發送方發出一個是的IP Datagram (事實上每個數據包發送三次,大小為40字節,包括本機的IP 地址,目的主機的IP 地址以及時間戳),當經由第一個路由器時,路由器將該數據包的TTL減1,發現此時的TTL為0,將數據包丟失,同時向源主機發送一個ICMP Time-to-Exceed 報文(包括源主機的IP 地址、路由地址以及路由的相關消息),源主機收到這個數據包后就知道了這個路由器在這條路徑上。同理發
6、送第二個、第三個.第n個。源主機將每次數據報的,直到某個數據報到達了目的地址,此時不知發回一個,而是發送一個數據報的響應報文。當源主機收到這樣一個報文后便知道數據包已經到達了目的地。Traceroute提取發 ICMP TTL到期消息設備的IP地址并作域名解析。每次 ,Traceroute都打印出一系列數據,包括所經過的路由設備的域名及 IP地址,三個包每次來回所花時間。Traceroute 有一個固定的時間等待響應(ICMP TTL到期消息)。如果這個時間過了,它將打印出一系列的*號表明:在這個路徑上,這個設備不能在給定的時間內發出ICMP TTL到期消息的響應。然后,Traceroute給
7、TTL記數器加1,繼續進行。2.1ICMP簡介和基本原理 ICMP(Internet Control Message Protocol),即Internet控制報文協議,它是TCP/IP協議族的一個子協議,屬于網絡層面向無連接的協議,主要用于在主機與路由器之間傳遞控制信息,包括報告錯誤、交換受限控制和狀態信息等。當遇到IP數據無法訪問目標、IP路由器無法按當前的傳輸速率轉發數據包等情況時,會自動發送ICMP消息。ICMP報文被包裝成IP數據包傳到數據鏈路層進行傳輸。通過ICMP協議,主機和路由器可以報告錯誤并交換相關的狀態信息。ICMP對于TCP/IP協議的可靠運行是至關重要的。 ICMP報文
8、結構如圖1所示:2.2traceRoute程序的基本原理路由追蹤的主要原理是根據路徑上各路由器對數據報的存活時(Time to Live,TTL)做不同的處理,使其產生超時ICMP消息響應,反饋至源主機,從而獲得此跳路由器或主機的IP。照此再發送下一個TTL經過自增的數據報,直至獲得整個路由中各節點的IP或者接收到錯誤的消息。詳細過程描述如下:1) 置n = 1。假設該過程中共經過M個路由器。2) 源主機S向目標主機D發送一個TTL為n的UDP數據報。并設定端口號(一般大于30 000) 。3) 路由器(或者網關、主機) Rn 對接收到的數據報的TTL 值n做減1處理。4) 若n = 0,則丟
9、棄UDP數據報,向源主機S發送ICMP超時報文。5) 若n 1,繼續向目標主機D發送經過處理的數據報。6) 源主機S分析返回的ICMP報文, 從中提取出發送者Rn的地址IPn并做記錄。7) 若收到“端口不可達”的ICMP報文,則發送方即目標主機D,記錄其地址IPn,追蹤完成。8) 置n = n +1,繼續向目標主機D發送TTL為n的數據報。注意,這里使UDP數據報的端口號大于30000,是因為一般的應用程序不可能使用如此高的端口號。當然這并非絕對,若出現例外,則源主機會發現等待超時,于是隨機改變此UDP數據報的端口號,再次發送。這樣最終可以在目標主機上找到一個空閑的端口號。另外,這里假設路由器
10、和目標主機沒有被配置為“過濾ICMP”或者做了其他的非常規處理,如果被做了類似的配置,則上面的追蹤機制就無能為力了。2.3traceRoute實現的功能IP數據報的首部由兩部分構成:固定部分和可變部分。固定部分的長度是20個字段,可變部分由許多選項構成,最長可達40個字節。雖然選項并不是IP數據報的必需部分,但選項的處理卻是IP軟件的必需部分。在現在的TCP/IP協議中,只定義了六種選項,對于我們進行路由追蹤技術有用的是記錄路由選項,一個記錄路由選項是用來記錄處理IP數據報的互聯網路由器的IP地址。因為首部的最大長度是60個字節,它包括20個字節的基本首部。這就意味著只剩下40個字節留下給選項
11、部分,所以通過選項字段最多能夠記錄9個路由器的IP地址。源站在選項中創建一個位標置(placeholder),用來填入所經過的各路由器,圖2給出了記錄路由選項的格式。圖2 記錄路由選項向目的主機發送一個ICMP報文,這種方法只要求使用一個套接字。ICMP即Internet控制報文協議,是一種用于特殊用途的報文機制,可以使互聯網中的路由器或主機報告差錯或提供有關意外情況的信息。盡管UDP和ICMP工作在TCP/IP的不同層次上,但他們的封裝是類似的。ICMP報文為兩級封裝ICMP報文放在IP數據報的數據部分,數據報則放在幀的數據中進行網絡傳輸(如圖3所示)ICMP報文與其他普通報文一樣,具有相同
12、的路由選擇,并沒有特殊的優先權和增加可靠性。通過路由選項的方法記錄路由的實現同UDP數據報是相似的,這里主要說明通過TTL方法的實現。圖3 ICMP報文的兩級封裝3設計步驟分析本次課程設計的任務書,整個課程設計的過程大致可以分為三個步驟:第一步主要是設計好流程圖;第二步是根據流程圖編寫程序代碼;第三步是在程序編譯通過后,運行程序結果,在對話框中輸入要追蹤的IP地址,觀察路由追蹤命令追蹤IP地址在網絡中的運行。其中第一步跟第二步是關鍵,只有完整的流程圖和根據要求編寫好正確的程序,才能運行得到正確的結果。下面是整個設計過程中各個步驟的詳細分析。3.1traceroute流程圖根據要求設計好的流程圖
13、如圖4所示:圖4 流程圖3.2traceroute的核心程序整個設計過程的核心程序代碼:#include stdafx.h#include MyPing.h#include Ping.h#include MyPingDlg.h#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE=_FILE_;#define new DEBUG_NEW#endifvoid CPing:Ping(int timeout) m_hSocket = WSASocket (AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0,WSA_FLAG_
14、OVERLAPPED); if (m_hSocket = INVALID_SOCKET) AfxMessageBox(socket 創建失敗!); return ;Start sending/receiving ICMP packets開始發送/接收ICMP的數據包/static int nCount = 0;靜態的nCount = 0。int nCount=0; while(1) int bwrote;if (nCount+ = 4) break; (IcmpHeader*)icmp_data)-i_cksum = 0; (IcmpHeader*)icmp_data)-timestamp =
15、 GetTickCount(); (IcmpHeader*)icmp_data)-i_seq = seq_no+; (IcmpHeader*)icmp_data)-i_cksum = checksum(USHORT*)icmp_data, datasize); bwrote = sendto(m_hSocket, icmp_data, datasize, 0, (struct sockaddr*)&m_addrDest, sizeof(m_addrDest); if (bwrote = SOCKET_ERROR) if (WSAGetLastError() = WSAETIMEDOUT) m_
16、dlg-m_result+=Timed out ! rn;m_dlg-SetDlgItemText(IDC_EDIT2,m_dlg-m_result); continue; AfxMessageBox(發送數據函數調用錯誤!); return ;3.3traceroute程序運行結果在運行程序后得到的對話框中輸入 ,再單擊路由跟蹤,就可以詳細的觀察到路由整個的跟蹤過程,如圖5所示: 圖5路由跟蹤示意圖4總結在整個課程設計過程中,首先得仔細分析課程設計任務書,根據要求編寫好程序代碼,然后運行程序,分析得到的結果。在編寫代碼過程中,遇到許多問題。開始看到題目不知道該如何下手去做。編寫好的代碼,在V
17、C+平臺上運行時,總是出現錯誤,最終在老師的幫助下,成功的解決了該問題。還有在宿舍運行tracert后一閃就沒了,也不知道是什么原因,上網查找了解到,必須得先運行CMD,然后在CMD里運行其他命令。成功的運行tracert后,出現的一連串數字,不知道是什么意思,結合老師上課所講的東西并仔細分析才知道,192.168.20.45是IP地址,0ms是跳到下個IP地址所用的時間。從整體來說這次課程設計是成功的。但中間存在一些細節問題,程序代碼過于復雜,沒有很好的用語句解釋出程序中的代碼。每次課程設計都讓我們學到了很多書本上學不到的東西,如嚴謹的做事風格,認真學習的態度,不懂要問的道理。因此,我們應該
18、要認認真真的做好每一次的課程設計。5結束語通過這次課程設計,加強了我們動手、思考和解決問題的能力,讓我們對網絡和網絡之間的信息和數據的傳送以及相關的協議有了更深刻的理解。在這次課程設計中,tracerroute通過ICMP協議和 header中(存活時間)利用路由器對數據報存活時間的處理方式成功的實現路由探測。跟蹤到網絡中數據IP地址的移動,但在跟蹤過程中經常發生數據的丟失和網絡超時。我認為做課程設計同時也是對課本知識的鞏固和加強,由于課本的知識太多,平時課間的學習并不能很好的理解和運用,而且考試內容有限,所以在這次課程設計過程中,我們了解了很多網絡之間的協議和路由跟蹤的命令,并對抽象的網絡有
19、了更多的認識。然而,認識來源于實踐,實踐是認識的動力和最終目的,實踐是檢驗真理的唯一標準,所以這次課程設計對我們來說是受益匪淺。對我們而言,知識上的收獲重要,精神上的豐收更是可喜。挫折是一份財富,經歷是一份擁有,通過這次課程設計讓我懂得了理論與實踐相結合的重要性。只有理論知識是遠遠不夠的,必須把平時所學的理論知識與實踐結合起來,從理論中得出結論,才能真正的利用所學的東西為社會服務,從而提高自己的實際動手能力和獨立思考的能力。在設計的過程中遇到這樣那樣的難題,但是,在老師和同學們的幫助下,都順利的解決了,同時在設計的過程中發現了自己的不足之處,對以前所學過的知識理解的不夠深刻,掌握的不夠牢固。這
20、次課程設計,讓我學到了很多課內學不到的東西,比如團體合作,出現差錯的隨機應變等,那都是受益匪淺。在此,感謝我們指導老師的細心指導,今后,我會加倍的努力學習。參考文獻1W Richard Stevens. TCP/ IP Illust rated ,Volum 1 :The ProtocolsM1 北京:機械工業出版社,2002.85296.2W Richard Stevens. UNIX Network ProgrammingVolum1Networking APIs :Socket s and XTI ( SecondEdition) (影印版) M . 北京: 清華大學出版社,2002.3
21、日井口信和. TCP/ IP 網絡工具篇M . 吳松芝,董江洪譯. 北京:科學出版社,2003. 1582162.4余青霓,王曉程,周鋼,等. 網絡入侵檢測分析員手冊Z.北京:人民郵電出版社,2000. 1012109.5JAMES F.KUROSE, KEITH W.Ross Computer Networking A Top2Down Approach Featuring the Internet (影印版) M.北京: 高等教育出版社,2001.6李為民,趙迎新,梁濟仁,等. 網絡連通性測試與故障定位J .計算機應用,2004 ,24(增刊):47249.7張保通.基于路由器的防火墻設計
22、J .華北航天工業學院學報,2002,(2):16219.附加程序清單:莫小鋒 通信0802班 學號:200885250224源程序:#include stdafx.h#include TraceRoute.h#include Tracer.h#include TraceRouteDlg.h#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE=_FILE_;#define new DEBUG_NEW#endif/ Construction/Destruction/IPstruct IPHEADERunsigned int h_len:4; / 首
23、部長度unsigned int version:4; / 版本 unsigned char tos; / 服務類型 unsigned short total_len; / 報文總長度 unsigned short ident; / 標識 unsigned short frag_and_flags; / 偏移量 unsigned char ttl; / 壽命 unsigned char proto; / 協議 unsigned short checksum; / 首部校驗和 unsigned int sourceIP; / 源站IP unsigned int destIP; / 目的站IP;/I
24、CMP首部數據結構struct ICMPHEADER BYTE i_type; / 類型 BYTE i_code; / 代碼 USHORT i_cksum; / 首部校驗和 USHORT i_id; / 標識 USHORT i_seq; / 序列號 ULONG timestamp; / 時間戳(選用);CTracer:CTracer()m_nSeq=1;icmpData=NULL;icmpRcvBuf=NULL; m_hSocket=INVALID_SOCKET;/初始化socket WSADATA wsaData; if(WSAStartup(MAKEWORD(2,2),&wsaData)!
25、=0) AfxMessageBox(WSAStartup()出錯!); CTracer:CTracer()/關閉Socketif (m_hSocket!=NULL)closesocket(m_hSocket); WSACleanup();/CheckSumUSHORT CTracer:CheckSum(char* pBuffer,int size) USHORT* buffer=(USHORT*)pBuffer;unsigned long cksum=0; while(size 1) cksum += *buffer+; size -= sizeof(USHORT); if(size ) ck
26、sum += *(UCHAR*)buffer; cksum = (cksum 16) + (cksum & 0xffff); cksum += (cksum 16); return (USHORT)(cksum);/FillAddressBOOL CTracer:FillAddress(char *addrDest)memset(&m_addrDest,0,sizeof(m_addrDest);m_addrDest.sin_family =AF_INET;if(inet_addr(addrDest)=INADDR_NONE)/輸入的地址為計算機名字HOSTENT* hp=NULL;hp=get
27、hostbyname(addrDest);if(hp) memcpy(&(m_addrDest.sin_addr),hp-h_addr,hp-h_length);m_addrDest.sin_family =hp-h_addrtype ;elseAfxMessageBox(獲取地址失敗!);return FALSE;elsem_addrDest.sin_addr.s_addr=inet_addr(addrDest);return TRUE;/FillICMPDatavoid CTracer:FillICMPData(char* icmpData,int size)memset(icmpData
28、,0,size);ICMPHEADER* icmpHeader=NULL;icmpHeader=(ICMPHEADER*)icmpData;icmpHeader-i_type =ICMP_ECHO;icmpHeader-i_code =0;icmpHeader-i_id =(USHORT)GetCurrentProcessId();icmpHeader-i_seq =m_nSeq+; /GetTickCount返回從0點到現在的毫秒數,作時間戳icmpHeader-timestamp=GetTickCount();char* datapart=icmpData+sizeof(ICMPHEADE
29、R); memset(datapart,*,size-sizeof(ICMPHEADER);/填充校驗和 icmpHeader-i_cksum =CheckSum(icmpData,size);/設置數據報的壽命BOOL CTracer:SetTTL(SOCKET hSocket, int ttl)int result;result=setsockopt(hSocket,IPPROTO_IP,IP_TTL,(LPSTR)&ttl,sizeof(ttl);if(result=SOCKET_ERROR)AfxMessageBox(設置數據報壽命失敗!);TerminateProcess(GetCu
30、rrentProcess(),-1);return TRUE;/發送數據報BOOL CTracer:SendData(char* icmpData,int size)/填充ICMP報頭 FillICMPData(icmpData,size);/發送數據報int result;time1=GetTickCount();result=sendto(m_hSocket,icmpData,size,0,(SOCKADDR*)&m_addrDest,sizeof(m_addrDest); if(result=SOCKET_ERROR)if(WSAGetLastError()=WSAETIMEDOUT)(
31、CTraceRouteDlg*)m_pWnd)-InfoAdd(發送超時);return TRUE;AfxMessageBox(發送報文失敗!);TerminateProcess(GetCurrentProcess(),-1);return FALSE;/接收數據報BOOL CTracer:RecvData(char* icmpRcvBuf,int* presult)static int count=0;/總共6次出現接收超時,判斷存在連接問題。if(count5) AfxMessageBox(連接存在問題!);TerminateProcess(GetCurrentProcess(),-1);
32、int fromlen=sizeof(SOCKADDR);*presult=SOCKET_ERROR;*presult=recvfrom(m_hSocket,icmpRcvBuf,MAX_PACKET,0,(SOCKADDR*)&m_addrFrom,&fromlen);time2=GetTickCount(); if(*presult=SOCKET_ERROR)if(WSAGetLastError()=WSAETIMEDOUT)(CTraceRouteDlg*)m_pWnd)-InfoAdd (接收超時!);count+;return TRUE;AfxMessageBox(接收數據報失敗!)
33、;TerminateProcess(GetCurrentProcess(),-1);return FALSE;/處理接收到的數據報BOOL CTracer:DecodeICMP(char* pBuffer,int bytes,int ttl) IPHEADER *ipHeader=NULL; ICMPHEADER *icmpHeader=NULL; unsigned short ipHeaderLen; HOSTENT *ph=NULL; in_addr inaddr=m_addrFrom.sin_addr; ipHeader=(IPHEADER*)pBuffer;ipHeaderLen=20
34、; if (bytesi_type) /目的站點的返回 case ICMP_ECHOREPLY: ph=gethostbyaddr(const char *)&inaddr,AF_INET, sizeof(in_addr); if (ph != NULL)CString report;report.Format(%2d %s (%s),ttl,ph-h_name,inet_ntoa(inaddr);(CTraceRouteDlg*)m_pWnd)-InfoAdd(report);return TRUE; break;/中途路由器的返回 case ICMP_TIMEOUT: CString re
35、port;report.Format(%2d %s %2d ms,ttl, inet_ntoa(inaddr),(time2-time1);(CTraceRouteDlg*)m_pWnd)-InfoAdd(report);return FALSE;break;/錯誤:主機不可達 case ICMP_DESTUNREACH: CString report;report.Format(%2d %s 主機不可達,ttl,inet_ntoa(inaddr);(CTraceRouteDlg*)m_pWnd)-InfoAdd(report);return TRUE;break;/收到一個不是回應的報文 d
36、efault:CString report;report.Format(非回應報文);(CTraceRouteDlg*)m_pWnd)-InfoAdd(report);return TRUE; return FALSE;void CTracer:SetWnd(CDialog *pWnd)/設置窗口指針m_pWnd=pWnd;void CTracer:Trace(char *destAddress) int size=DEF_PACKET_SIZE+sizeof(ICMPHEADER); /轉換地址 if (!FillAddress(destAddress) return ; /分配必要的內存空間 icmpData=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PACKET); icmpRcvBuf=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PACKET); if(!icmpData|!icmpRcvBuf) AfxMessage
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 家樂福門禁管理制度
- 庫房收發貨管理制度
- 應急備品房管理制度
- 形象崗執勤管理制度
- 微粒貸內部管理制度
- 心絞痛培訓管理制度
- 快遞經營與管理制度
- 急診科閉環管理制度
- 總承包各項管理制度
- 患者外帶藥管理制度
- 2023-2024學年海南省海口市四年級(下)期末數學試卷
- 南通市如東縣醫療衛生單位招聘事業編制工作人員筆試真題2024
- 歷史●甘肅卷丨2024年甘肅省普通高中學業水平等級性考試高考歷史真題試卷及答案
- 2025麒麟卷 地理(一)
- 2024年杭州市臨安區事業單位統一招聘真題
- T/GDWJ 011-20225G+院前急救服務應用平臺技術規范
- 放射科實習生入科教育
- 公務員會計崗位考試題及答案
- 安徽教編美術試題及答案
- 國家開放大學國開電大《幼兒園課程基礎》形考任務1~4答案
- 2024-2025湘科版小學科學四年級下冊期末考試卷附參考答案
評論
0/150
提交評論