網(wǎng)絡(luò)實(shí)驗(yàn)指導(dǎo)----ICMP協(xié)議的分析與實(shí)現(xiàn)_第1頁
網(wǎng)絡(luò)實(shí)驗(yàn)指導(dǎo)----ICMP協(xié)議的分析與實(shí)現(xiàn)_第2頁
網(wǎng)絡(luò)實(shí)驗(yàn)指導(dǎo)----ICMP協(xié)議的分析與實(shí)現(xiàn)_第3頁
網(wǎng)絡(luò)實(shí)驗(yàn)指導(dǎo)----ICMP協(xié)議的分析與實(shí)現(xiàn)_第4頁
網(wǎng)絡(luò)實(shí)驗(yàn)指導(dǎo)----ICMP協(xié)議的分析與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、實(shí)驗(yàn):ICMP協(xié)議的分析與實(shí)現(xiàn)實(shí)驗(yàn)?zāi)康?分析ICMP報(bào)文,理解ICMP協(xié)議在Internet網(wǎng)中的具體應(yīng)用及其實(shí)現(xiàn)原理,深入了解TCP/IP網(wǎng)絡(luò)的容錯(cuò)控制;學(xué)會(huì)運(yùn)用網(wǎng)絡(luò)套接字Winsock開發(fā)網(wǎng)絡(luò)通信程序。實(shí)驗(yàn)內(nèi)容 使用Visual Studio C+ 6.0和網(wǎng)絡(luò)接口套接字Socket進(jìn)行Windows環(huán)境下的網(wǎng)絡(luò)編程,運(yùn)用原始嵌套字RAW_SOCKET從IP層開始構(gòu)造整個(gè)ICMP報(bào)文,通過ICMP協(xié)議所提供的回送請(qǐng)求(echo request)和回送應(yīng)答(echo reply)這兩種報(bào)文實(shí)現(xiàn)檢測(cè)目的站的可達(dá)性與狀態(tài)。1IP報(bào)頭、ICMP報(bào)文的基本描述 IP協(xié)議并不能保證絕對(duì)的可靠,所以就設(shè)

2、計(jì)了ICMP協(xié)議,進(jìn)行差錯(cuò)報(bào)告. ICMP 消息使用IP頭作為基本控制.IP頭的格式如下:0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Version| IHL |Type of Service| Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Id

3、entification |Flags| Fragment Offset | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Time to Live | Protocol | Header Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

4、+ | Destination Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Version=4 IHL Internet頭長 Type of Service = 0 Total Length IP包的總長度 Identification, Flags, Fragment Offset 用于IP包分段 Time to Live IP包的存活時(shí)長 Protocol ICMP = 1 Header Checksum 頭校驗(yàn)和(檢查整個(gè)IP報(bào)頭) Addresses 發(fā)送Echo消息的源地址是發(fā)

5、送Echo reply消息的目的地址,相反,發(fā)送Echo 消息的目的地址是發(fā)送Echo reply消息的源地址.Echo 或 Echo Reply 消息格式如下: 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Code | Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

6、-+-+-+-+-+-+ | Identifier | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+Type echo消息的類型為8 echo reply 的消息類型為0.Code=0Checksum為從TYPE開始到IP包結(jié)束的校驗(yàn)和,也就是校驗(yàn)整個(gè)ICMP報(bào)文Identifier 如果 code = 0, identifi

7、er用來匹配echo和echo reply消息Sequence Number 如果 code = 0, identifier用來匹配echo和echo reply消息功能描述:收到echo 消息必須回應(yīng) echo reply 消息. identifier 和 sequence number 可能被發(fā)送echo的主機(jī)用來匹配返回的echo reply消息.例如: identifier 可能用于類似于TCP或UDP的 port用來標(biāo)示一個(gè)會(huì)話, 而sequence number 會(huì)在每次發(fā)送echo請(qǐng)求后遞增. 收到echo的主機(jī)或路由器返回同一個(gè)值與之匹配2 數(shù)據(jù)結(jié)構(gòu)(1)IP報(bào)頭格式/定義IP

8、首部 typedef struct _iphdrunsigned char h_lenver; /4 位IP版本號(hào)+4位首部長度unsigned char tos; /8位服務(wù)類型TOSunsigned short total_len; /16位IP包總長度(字節(jié))unsigned short ident; /1 6位標(biāo)識(shí), 用于輔助IP包的拆裝,本實(shí)驗(yàn)不用,置零unsigned short frag_and_flags; /3位標(biāo)志位+13位偏移位, 也是用于IP包的拆裝,本實(shí)驗(yàn)不用,置零unsigned char ttl; /8位IP包生存時(shí)間 TTLunsigned char proto

9、; /8位協(xié)議 (TCP, UDP 或其他), 本實(shí)驗(yàn)置ICMP,置為1unsigned short checksum; /16位IP首部校驗(yàn)和,最初置零,等所有包頭都填寫正確后,計(jì)算并替換.unsigned int sourceIP; /32位源IP地址unsigned int destIP; /32位目的IP地址IP_HEADER;(2)ICMP報(bào)頭格式/定義ICMP首部typedef struct _icmphdrunsigned char i_type; /8位類型, 本實(shí)驗(yàn)用 8: ECHO 0:ECHO REPLYunsigned char i_code; /8位代碼, 本實(shí)驗(yàn)置零

10、unsigned short i_cksum; /16位校驗(yàn)和, 從TYPE開始,直到最后一位用戶數(shù)據(jù),如果為字節(jié)數(shù)為奇數(shù)則補(bǔ)充一位unsigned short i_id ; /識(shí)別號(hào)(一般用進(jìn)程號(hào)作為識(shí)別號(hào)), 用于匹配ECHO和ECHO REPLY包unsigned short i_seq ; /報(bào)文序列號(hào), 用于標(biāo)記ECHO報(bào)文順序unsigned int timestamp; /時(shí)間戳ICMP_HEADER;3 總體設(shè)計(jì)ICMP協(xié)議中的發(fā)送、接收ICMP回送請(qǐng)求報(bào)文,回送應(yīng)答報(bào)文流程圖。數(shù)據(jù)包太短?不是回送響?應(yīng)?ID不符合?輸出數(shù)據(jù)報(bào)中的IP地址填充ICMP數(shù)據(jù)報(bào)發(fā)送數(shù)據(jù)報(bào)接受數(shù)據(jù)報(bào)

11、去掉IP報(bào)頭,獲取ICMP信息結(jié)束yyNNN開 始4VC中網(wǎng)絡(luò)套接字Winsock編程基礎(chǔ)在VC中進(jìn)行WINSOCK的API編程開發(fā)的時(shí)候,需要在項(xiàng)目中使用下面三個(gè)文件,否則會(huì)出現(xiàn)編譯錯(cuò)誤。1WINSOCK.H: 這是WINSOCK API的頭文件,需要包含在項(xiàng)目中。2WSOCK32.LIB: WINSOCK API連接庫文件。在使用中,一定要把它作為項(xiàng)目的非缺省的連接庫包含到項(xiàng)目文件中去。3WINSOCK.DLL: WINSOCK的動(dòng)態(tài)連接庫,位于WINDOWS的安裝目錄下。幾個(gè)基本的套接字:1、 創(chuàng)建套接字socket() 功能:使用前創(chuàng)建一個(gè)新的套接字格式:SOCKET PASCAL F

12、AR socket(int af,int type,int procotol);參數(shù):af: 通信發(fā)生的區(qū)域type: 要建立的套接字類型procotol: 使用的特定協(xié)議2、指定本地地址bind()功能:將套接字地址與所創(chuàng)建的套接字號(hào)聯(lián)系起來。格式:int PASCAL FAR bind(SOCKET s,const struct sockaddr FAR * name,int namelen);參數(shù):s: 是由socket()調(diào)用返回的并且未作連接的套接字描述符(套接字號(hào))。其它:沒有錯(cuò)誤,bind()返回0,否則SOCKET_ERROR地址結(jié)構(gòu)說明:struct sockaddr_ins

13、hort sin_family;/AF_INETu_short sin_port;/16位端口號(hào),網(wǎng)絡(luò)字節(jié)順序struct in_addr sin_addr;/32位IP地址,網(wǎng)絡(luò)字節(jié)順序char sin_zero8;/保留3 建立套接字連接connect()和accept()功能:共同完成連接工作格式:int PASCAL FAR connect(SOCKET s,const struct sockaddr FAR * name,int namelen);SOCKET PASCAL FAR accept(SOCKET s,struct sockaddr FAR * name,int FAR

14、* addrlen);參數(shù):同上4、監(jiān)聽連接listen()功能:用于面向連接服務(wù)器,表明它愿意接收連接。格式:int PASCAL FAR listen(SOCKET s, int backlog);5、數(shù)據(jù)傳輸send()與recv()功能:數(shù)據(jù)的發(fā)送與接收格式:int PASCAL FAR send(SOCKET s,const char FAR * buf,int len,int flags);int PASCAL FAR recv(SOCKET s,const char FAR * buf,int len,int flags);參數(shù):buf:指向存有傳輸數(shù)據(jù)的緩沖區(qū)的指針。 6、多路

15、復(fù)用select()功能:用來檢測(cè)一個(gè)或多個(gè)套接字狀態(tài)。格式:int PASCAL FAR select(int nfds,fd_set FAR * readfds,fd_set FAR * writefds, fd_set FAR * exceptfds,const struct timeval FAR * timeout);參數(shù):readfds:指向要做讀檢測(cè)的指針writefds:指向要做寫檢測(cè)的指針exceptfds:指向要檢測(cè)是否出錯(cuò)的指針timeout:最大等待時(shí)間7、關(guān)閉套接字closesocket()功能:關(guān)閉套接字s格式:BOOL PASCAL FAR closesocket

16、(SOCKET s);5 部分程序代碼/初始化SOCKETWSADATA wsaData;iErrorCode = WSAStartup(MAKEWORD(2,2),&wsaData);CheckSockError(iErrorCode, "WSAStartup");sockRaw = socket(AF_INET , SOCK_RAW , IPPROTO_ICMP); /原始套接字CheckSockError(sockRaw, "socket");/設(shè)置超時(shí)時(shí)間timeout = time;iErrorCode = setsockopt(soc

17、kRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout);/設(shè)置接受延時(shí)CheckSockError(iErrorCode, "SO_RCVTIMEO");timeout = time;iErrorCode = setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout);/設(shè)置發(fā)送延時(shí)CheckSockError(iErrorCode, "SO_SNDTIMEO");/獲得目標(biāo)主機(jī)IPmem

18、set(&dest,0,sizeof(dest);/初始化dest結(jié)構(gòu)dest.sin_family = AF_INET; /填充SOCKADDR_IN結(jié)構(gòu)內(nèi)容if(dest.sin_addr.s_addr = inet_addr(lpdest) = INADDR_NONE)if(hp = gethostbyname(lpdest) != NULL) /目的主機(jī)名字不為空memcpy(&(dest.sin_addr),hp->h_addr_list0,hp->h_length);dest.sin_family = hp->h_addrtype;printf(&

19、quot;dest.sin_addr = %sn",inet_ntoa(dest.sin_addr);elseCheckSockError(SOCKET_ERROR, "gethostbyname()");/創(chuàng)建ICMP數(shù)據(jù)包datasize += sizeof(ICMP_HEADER); /包長icmp_data = (char *)malloc(1024); /創(chuàng)建icmp數(shù)據(jù)報(bào)內(nèi)存空間recvbuf = (char *)malloc(1024); /接收icmp包緩沖區(qū)if(!icmp_data) | (!recvbuf)CheckSockError(SOC

20、KET_ERROR, "malloc()");memset(icmp_data,0,MAX_PACKET); /初始化icmp_dataFillICMPData(icmp_data,datasize); /填充icmp包printf("Pinging %s with %d bytes of data(timeout = %d ms):nn",inet_ntoa(dest.sin_addr),datasize,timeout );/發(fā)送與接收ICMP數(shù)據(jù)包while(1)memset(recvbuf,0,MAX_PACKET); /初始化接受緩沖區(qū)stat

21、ic int nCount = 0; /設(shè)置發(fā)送icmp包的次數(shù),一般為4if(nCount+ =4) break;(ICMP_HEADER*)icmp_data)->i_cksum = 0; /初設(shè)校驗(yàn)和為0(ICMP_HEADER*)icmp_data)->timestamp = GetTickCount(); /獲得目前時(shí)間(ICMP_HEADER*)icmp_data)->i_seq = seq_no+; /icmp數(shù)據(jù)報(bào)的序列號(hào)(ICMP_HEADER*)icmp_data)->i_cksum = checksum(USHORT*)icmp_data,data

22、size);/計(jì)算校驗(yàn)和iErrorCode = sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest,sizeof(dest);/發(fā)送icmp數(shù)據(jù)報(bào)if(iErrorCode = SOCKET_ERROR) /錯(cuò)誤檢查if(WSAGetLastError() = WSAETIMEDOUT)printf("timed outn");continue;CheckSockError(SOCKET_ERROR, "sendto()");if(iErrorCode < datasiz

23、e)printf("Wrote %d bytesn",iErrorCode);int fromlen = sizeof(from);/接受icmp包長度iErrorCode = recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from,&fromlen);/接受icmp包if(iErrorCode = SOCKET_ERROR)if(WSAGetLastError() = WSAETIMEDOUT)printf("timed outn");continue;CheckSoc

24、kError(SOCKET_ERROR, "recvfrom()");DecodeICMPHeader(recvbuf,iErrorCode,&from); /分解icmp包頭Sleep(1000); /休眠一段時(shí)間/SOCK錯(cuò)誤處理程序void CheckSockError(int iErrorCode, char *pErrorMsg)if(iErrorCode=SOCKET_ERROR)printf("%s Error:%dn", pErrorMsg, GetLastError();closesocket(sockRaw);ExitProc

25、ess(0);/填充數(shù)據(jù)void FillICMPData(char *icmp_data, int datasize)ICMP_HEADER *icmp_hdr = NULL;char *datapart = NULL;icmp_hdr = (ICMP_HEADER*)icmp_data;icmp_hdr->i_type = ICMP_ECHO; /發(fā)送ping/ Request an ICMP echoicmp_hdr->i_code = 0; /代碼字段為0icmp_hdr->i_id = (USHORT)GetCurrentProcessId(); /獲得當(dāng)前進(jìn)程號(hào)i

26、cmp_hdr->i_cksum = 0;icmp_hdr->i_seq = 0; /初始化序列號(hào)datapart = icmp_data + sizeof(ICMP_HEADER); /加上icmp包頭/ Place some junk in the buffer/memset(datapart,'E', datasize - sizeof(ICMP_HEADER); /填充datapart/計(jì)算檢驗(yàn)和USHORT checksum(USHORT *buffer, int size) unsigned long cksum=0;while (size > 1

27、) cksum += *buffer+;size -= sizeof(USHORT);if (size) cksum += *(UCHAR*)buffer;cksum = (cksum >> 16) + (cksum & 0xffff);cksum += (cksum >>16);return (USHORT)(cksum);/ICMP解包程序void DecodeICMPHeader(char *buf, int bytes, struct sockaddr_in *from)IP_HEADER *iphdr = NULL;ICMP_HEADER *icmphdr = NULL;unsigned short iphdrlen;DWORD tick;iphdr = (IP_HEADER *)buf;/ Number of 32-bit wor

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論