




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
設(shè)計(jì)報(bào)告課程計(jì)算機(jī)網(wǎng)絡(luò)設(shè)計(jì)名稱Tracert程序?qū)I(yè)班級(jí)計(jì)科112同組人學(xué)號(hào)姓名實(shí)驗(yàn)日期指導(dǎo)教師成績(jī)年月日一、設(shè)計(jì)目的和要求1、實(shí)驗(yàn)?zāi)康?.熟悉原始套接字編程。
2.了解網(wǎng)絡(luò)的結(jié)構(gòu)。
3.了解網(wǎng)絡(luò)傳輸?shù)讓訁f(xié)議。
4.熟悉掌握
ICMP協(xié)議的工作原理和路由跟蹤原理。
5.掌握vc6.0下程序調(diào)試、運(yùn)行的基本方法。
6.通過(guò)實(shí)驗(yàn)熟悉協(xié)議的應(yīng)用。2、實(shí)驗(yàn)要求1、通過(guò)實(shí)驗(yàn),可以使程序記錄并顯示了數(shù)據(jù)報(bào)從源端機(jī)器傳送到目標(biāo)機(jī)器的過(guò)程中所經(jīng)過(guò)的路由器的IP地址,并且記錄了數(shù)據(jù)報(bào)到達(dá)每個(gè)路由器所需要的時(shí)間。認(rèn)真觀察到達(dá)每個(gè)路由器的時(shí)間有什么區(qū)別,從而熟練掌握tracert的工作原理和ICMP報(bào)文協(xié)議。
2、當(dāng)我們不能通過(guò)網(wǎng)絡(luò)訪問(wèn)目的設(shè)備時(shí),網(wǎng)絡(luò)管理員就需要判斷是哪里出了問(wèn)題。問(wèn)題不僅僅會(huì)出現(xiàn)在最終目的設(shè)備,也可能出現(xiàn)在轉(zhuǎn)發(fā)數(shù)據(jù)包的中間路由器。二、設(shè)計(jì)說(shuō)明(包括設(shè)計(jì)分析,系統(tǒng)運(yùn)行環(huán)境,設(shè)計(jì)中的重點(diǎn)和難點(diǎn),輸入和輸出輸出條件等)路由是把信息從源穿過(guò)網(wǎng)絡(luò)傳遞到目的地的行為,在傳輸過(guò)程中,遇到一系列的中間節(jié)點(diǎn)。這些中間節(jié)點(diǎn)構(gòu)成了路由跟蹤的依據(jù)。路由跟蹤是在路由的基礎(chǔ)上提出的問(wèn)題,是利用路由跟蹤實(shí)用程序于確定IP數(shù)據(jù)報(bào)訪問(wèn)目標(biāo)所采取的路徑。當(dāng)我們不能通過(guò)網(wǎng)絡(luò)訪問(wèn)目的設(shè)備時(shí),網(wǎng)絡(luò)運(yùn)行者就需要判斷是哪里出了問(wèn)題。問(wèn)題不僅僅會(huì)出現(xiàn)在最終目的設(shè)備,也可能出現(xiàn)在轉(zhuǎn)發(fā)數(shù)據(jù)包的中間路由器。解決方法是了解了IP數(shù)據(jù)報(bào)訪問(wèn)目標(biāo)所采取的路徑,將發(fā)現(xiàn)網(wǎng)絡(luò)布網(wǎng)簡(jiǎn)單拓?fù)?,確定路由斷點(diǎn)即可解決網(wǎng)絡(luò)故障。操作系統(tǒng)中的tracert或traceroute路由跟蹤程序,通過(guò)它可以查看到達(dá)目標(biāo)地址所經(jīng)過(guò)的路徑。它的作用與ping有類似之處使用ping可以檢查是否連接,如果不通,一般不好準(zhǔn)確判斷哪一個(gè)節(jié)點(diǎn)出錯(cuò),而使用tracert則可以準(zhǔn)確判斷出錯(cuò)的部分。系統(tǒng)實(shí)現(xiàn)路由的跟蹤,每經(jīng)過(guò)一個(gè)路由,要求得到經(jīng)過(guò)該路由節(jié)點(diǎn)的地址,也就是說(shuō)輸入目標(biāo)信息,可以得到本地主機(jī)到目標(biāo)經(jīng)過(guò)的所有中間節(jié)點(diǎn)。這些中間節(jié)點(diǎn)用IP地址標(biāo)識(shí)。并要求對(duì)跟蹤跳數(shù),每一跳等待時(shí)間可控。為了讓系統(tǒng)更加完善,首先要測(cè)試目標(biāo)的連通性,系統(tǒng)中也要實(shí)現(xiàn)目標(biāo)探測(cè)功能,即Ping功能。當(dāng)數(shù)據(jù)報(bào)從你的計(jì)算機(jī)經(jīng)過(guò)多個(gè)網(wǎng)關(guān)傳送到目的地時(shí),Tracert命令可以用來(lái)跟蹤數(shù)據(jù)報(bào)使用的路由(路徑)。該實(shí)用程序跟蹤的路徑是源計(jì)算機(jī)到目的地的一條路徑,不能保證或認(rèn)為數(shù)據(jù)報(bào)總遵循這個(gè)路徑。Tracert是一個(gè)運(yùn)行得比較慢的命令(如果你指定的目標(biāo)地址比較遠(yuǎn)),每個(gè)路由器你大約需要給它15秒鐘。
Tracert使用時(shí)只需要在tracert后面跟一個(gè)IP地址或URL,Tracert會(huì)進(jìn)行相應(yīng)的域名轉(zhuǎn)換,Tracert一般用來(lái)檢測(cè)故障的位置,你可以用tracertIP在哪個(gè)環(huán)節(jié)上出了問(wèn)題,雖然還是沒(méi)有確定是什么問(wèn)題,但它已經(jīng)告訴了我們問(wèn)題所在的地方。
三、系統(tǒng)詳細(xì)設(shè)計(jì)(包括程序流程、主要函數(shù)等)開(kāi)始開(kāi)始使用UDP協(xié)議創(chuàng)建原始UDP包使用UDP協(xié)議創(chuàng)建原始UDP包目的主機(jī)回應(yīng)答或達(dá)到最大跳站目的主機(jī)回應(yīng)答或達(dá)到最大跳站 YTTL++(初始值為1)NTTL++(初始值為1)填充UDP數(shù)據(jù)包并發(fā)送填充UDP數(shù)據(jù)包并發(fā)送有數(shù)據(jù)報(bào)到達(dá)? N有數(shù)據(jù)報(bào)到達(dá)?有預(yù)期數(shù)據(jù)報(bào)? Y有預(yù)期數(shù)據(jù)報(bào)? NY解析數(shù)據(jù)報(bào)并顯示輸出超時(shí),顯示超時(shí)信息解析數(shù)據(jù)報(bào)并顯示輸出超時(shí),顯示超時(shí)信息釋放各種資源顯示結(jié)果信息釋放各種資源顯示結(jié)果信息結(jié)束結(jié)束四、程序源代碼及注釋#include<iostream.h>#include<iomanip.h>#include<winsock2.h>#include<ws2tcpip.h>#include"itracert.h"http:////////////////////////////////////////////////////////intmain(intargc,char*argv[]){ //檢查命令行參數(shù) if(argc!=2) { cerr<<"\nUsage:itracertip_or_hostname\n"; return-1; } //初始化winsock2環(huán)境 WSADATAwsa; if(WSAStartup(MAKEWORD(2,2),&wsa)!=0) { cerr<<"\nFailedtoinitializetheWinSock2DLL\n" <<"errorcode:"<<WSAGetLastError()<<endl; return-1; } //將命令行參數(shù)轉(zhuǎn)換為IP地址 u_longulDestIP=inet_addr(argv[1]); if(ulDestIP==INADDR_NONE) { //轉(zhuǎn)換不成功時(shí)按域名解析 hostent*pHostent=gethostbyname(argv[1]); if(pHostent) { ulDestIP=(*(in_addr*)pHostent->h_addr).s_addr; //輸出屏幕信息 cout<<"\nTracingrouteto"<<argv[1] <<"["<<inet_ntoa(*(in_addr*)(&ulDestIP))<<"]" <<"withamaximumof"<<DEF_MAX_HOP<<"hops.\n"<<endl; } else//解析主機(jī)名失敗 { cerr<<"\nCouldnotresolvethehostname"<<argv[1]<<'\n' <<"errorcode:"<<WSAGetLastError()<<endl; WSACleanup(); return-1; } } else { //輸出屏幕信息 cout<<"\nTracingrouteto"<<argv[1] <<"withamaximumof"<<DEF_MAX_HOP<<"hops.\n"<<endl; } //填充目的Socket地址 sockaddr_indestSockAddr; ZeroMemory(&destSockAddr,sizeof(sockaddr_in)); destSockAddr.sin_family=AF_INET; destSockAddr.sin_addr.s_addr=ulDestIP; //使用ICMP協(xié)議創(chuàng)建RawSocket SOCKETsockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED); if(sockRaw==INVALID_SOCKET) { cerr<<"\nFailedtocreatearawsocket\n" <<"errorcode:"<<WSAGetLastError()<<endl; WSACleanup(); return-1; } //設(shè)置端口屬性 intiTimeout=DEF_ICMP_TIMEOUT; if(setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&iTimeout,sizeof(iTimeout))==SOCKET_ERROR) { cerr<<"\nFailedtosetrecvtimeout\n" <<"errorcode:"<<WSAGetLastError()<<endl; closesocket(sockRaw); WSACleanup(); return-1; } if(setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&iTimeout,sizeof(iTimeout))==SOCKET_ERROR) { cerr<<"\nFailedtosetsendtimeout\n" <<"errorcode:"<<WSAGetLastError()<<endl; closesocket(sockRaw); WSACleanup(); return-1; } //創(chuàng)建ICMP包發(fā)送緩沖區(qū)和接收緩沖區(qū) charIcmpSendBuf[sizeof(ICMP_HEADER)+DEF_ICMP_DATA_SIZE]; memset(IcmpSendBuf,0,sizeof(IcmpSendBuf)); charIcmpRecvBuf[MAX_ICMP_PACKET_SIZE]; memset(IcmpRecvBuf,0,sizeof(IcmpRecvBuf)); //填充待發(fā)送的ICMP包 ICMP_HEADER*pIcmpHeader=(ICMP_HEADER*)IcmpSendBuf; pIcmpHeader->type=ICMP_ECHO_REQUEST; pIcmpHeader->code=0; pIcmpHeader->id=(USHORT)GetCurrentProcessId(); memset(IcmpSendBuf+sizeof(ICMP_HEADER),'E',DEF_ICMP_DATA_SIZE); //開(kāi)始探測(cè)路由 DECODE_RESULTstDecodeResult; BOOLbReachDestHost=FALSE; USHORTusSeqNo=0; intiTTL=1; intiMaxHop=DEF_MAX_HOP; while(!bReachDestHost&&iMaxHop--) { //設(shè)置IP數(shù)據(jù)報(bào)頭的ttl字段 setsockopt(sockRaw,IPPROTO_IP,IP_TTL,(char*)&iTTL,sizeof(iTTL)); //輸出當(dāng)前跳站數(shù)作為路由信息序號(hào) cout<<setw(3)<<iTTL<<flush; //填充ICMP數(shù)據(jù)報(bào)剩余字段 ((ICMP_HEADER*)IcmpSendBuf)->cksum=0; ((ICMP_HEADER*)IcmpSendBuf)->seq=htons(usSeqNo++); ((ICMP_HEADER*)IcmpSendBuf)->cksum=GenerateChecksum((USHORT*)IcmpSendBuf,sizeof(ICMP_HEADER)+DEF_ICMP_DATA_SIZE); //記錄序列號(hào)和當(dāng)前時(shí)間 stDecodeResult.usSeqNo=((ICMP_HEADER*)IcmpSendBuf)->seq; stDecodeResult.dwRoundTripTime=GetTickCount(); //發(fā)送ICMP的EchoRequest數(shù)據(jù)報(bào) if(sendto(sockRaw,IcmpSendBuf,sizeof(IcmpSendBuf),0, (sockaddr*)&destSockAddr,sizeof(destSockAddr))==SOCKET_ERROR) { //如果目的主機(jī)不可達(dá)則直接退出 if(WSAGetLastError()==WSAEHOSTUNREACH) cout<<'\t'<<"Destinationhostunreachable.\n" <<"\nTracecomplete.\n"<<endl; closesocket(sockRaw); WSACleanup(); return0; } //接收ICMP的EchoReply數(shù)據(jù)報(bào) //因?yàn)槭盏降目赡懿⒎浅绦蛩诖臄?shù)據(jù)報(bào),所以需要循環(huán)接收直到收到所要數(shù)據(jù)或超時(shí) sockaddr_infrom; intiFromLen=sizeof(from); intiReadDataLen; while(1) { //等待數(shù)據(jù)到達(dá) iReadDataLen=recvfrom(sockRaw,IcmpRecvBuf,MAX_ICMP_PACKET_SIZE, 0,(sockaddr*)&from,&iFromLen); if(iReadDataLen!=SOCKET_ERROR)//有數(shù)據(jù)包到達(dá) { //解碼得到的數(shù)據(jù)包,如果解碼正確則跳出接收循環(huán)發(fā)送下一個(gè)EchoRequest包 if(DecodeIcmpResponse(IcmpRecvBuf,iReadDataLen,stDecodeResult)) { if(stDecodeResult.dwIPaddr.s_addr==destSockAddr.sin_addr.s_addr) bReachDestHost=TRUE; cout<<'\t'<<inet_ntoa(stDecodeResult.dwIPaddr)<<endl; break; } } elseif(WSAGetLastError()==WSAETIMEDOUT)//接收超時(shí),打印星號(hào) { cout<<setw(9)<<'*'<<'\t'<<"Requesttimedout."<<endl; break; } else { cerr<<"\nFailedtocallrecvfrom\n" <<"errorcode:"<<WSAGetLastError()<<endl; closesocket(sockRaw); WSACleanup(); return-1; } } //TTL值加1 iTTL++; } //輸出屏幕信息 cout<<"\nTracecomplete.\n"<<endl; closesocket(sockRaw); WSACleanup(); return0;}//產(chǎn)生網(wǎng)際校驗(yàn)和USHORTGenerateChecksum(USHORT*pBuf,intiSize){ unsignedlongcksum=0; while(iSize>1) { cksum+=*pBuf++; iSize-=sizeof(USHORT); } if(iSize) cksum+=*(UCHAR*)pBuf; cksum=(cksum>>16)+(cksum&0xffff); cksum+=(cksum>>16); return(USHORT)(~cksum);}//解碼得到的數(shù)據(jù)報(bào)BOOLDecodeIcmpResponse(char*pBuf,intiPacketSize,DECODE_RESULT&stDecodeResult){ //檢查數(shù)據(jù)報(bào)大小的合法性 IP_HEADER*pIpHdr=(IP_HEADER*)pBuf; intiIpHdrLen=pIpHdr->hdr_len*4; if(iPacketSize<(int)(iIpHdrLen+sizeof(ICMP_HEADER))) returnFALSE; //按照ICMP包類型檢查id字段和序列號(hào)以確定是否是程序應(yīng)接收的Icmp包 ICMP_HEADER*pIcmpHdr=(ICMP_HEADER*)(pBuf+iIpHdrLen); USHORTusID,usSquNo; if(pIcmpHdr->type==ICMP_ECHO_REPLY) { usID=pIcmpHdr->id; usSquNo=pIcmpHdr->seq; } elseif(pIcmpHdr->type==ICMP_TIMEOUT) { char*pInnerIpHdr=pBuf+iIpHdrLen+sizeof(ICMP_HEADER); //載荷中的IP頭 intiInnerIPHdrLen=((IP_HEADER*)pInnerIpHdr)->hdr_len*4;//載荷中的IP頭長(zhǎng) ICMP_HEADER*pInnerIcmpHdr=(ICMP_HEADER*)(pInnerIpHdr+iInnerIPHdrLen);//載荷中的ICMP頭 usID=pInnerIcmpHdr->id; usSquNo=pInnerIcmpHdr->seq; } else returnFALSE; if(usID!=(USHORT)GetCurrentProcessId()||usSquNo!=stDecodeResult.usSeqNo) returnFALSE; //處理正確收到的ICMP數(shù)據(jù)報(bào) if(pIcmpHdr->type==ICMP_ECHO_REPLY|| pIcmpHdr->type==ICMP_TIMEOUT) { //返回解碼結(jié)果 stDecodeResult.dwIPaddr.s_addr=pIpHdr->sourceIP; stDecodeResult.dwRoundTripTime=GetTickCount()-
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高職數(shù)據(jù)庫(kù)試題及答案
- 5年級(jí)下冊(cè)英語(yǔ)第1第2單元單詞跟讀
- 5年級(jí)上冊(cè)第5單元摘抄
- 燈泡溫度與電阻的關(guān)系式
- 地下車庫(kù) 行政復(fù)議申請(qǐng)
- 機(jī)械合同的施工方案
- 2025年合肥信息技術(shù)職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)學(xué)生專用
- 2025年石家莊工商職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)一套
- 公共安全領(lǐng)域應(yīng)急救援與預(yù)防體系建設(shè)方案
- 三農(nóng)村電商稅收籌劃與風(fēng)險(xiǎn)管理方案
- 拼音瘋狂背古詩(shī)(6個(gè)單元120首)
- 閱讀讓我們更聰明
- 牙周病科普講座課件
- 實(shí)驗(yàn)室安全專項(xiàng)培訓(xùn)
- 工業(yè)地產(chǎn)營(yíng)銷推廣方案
- 2024年貴州能源集團(tuán)電力投資有限公司招聘筆試參考題庫(kù)附帶答案詳解
- 電子產(chǎn)品設(shè)計(jì)案例教程(微課版)-基于嘉立創(chuàng)EDA(專業(yè)版) 課件 第3章 多諧振蕩器的PCB設(shè)計(jì)
- 鐵路軌道與修理
- 紡織行業(yè)清潔生產(chǎn)評(píng)價(jià)指標(biāo)體系色紗
- 管理能力測(cè)試題大全
- 《風(fēng)景談》新教學(xué)課件
評(píng)論
0/150
提交評(píng)論