實驗八 協(xié)議分析器程序的設(shè)計和實現(xiàn).docx_第1頁
實驗八 協(xié)議分析器程序的設(shè)計和實現(xiàn).docx_第2頁
實驗八 協(xié)議分析器程序的設(shè)計和實現(xiàn).docx_第3頁
實驗八 協(xié)議分析器程序的設(shè)計和實現(xiàn).docx_第4頁
實驗八 協(xié)議分析器程序的設(shè)計和實現(xiàn).docx_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

網(wǎng)絡(luò)軟件開發(fā)技術(shù)實驗報告實驗八 協(xié)議分析器程序的設(shè)計和實現(xiàn)1 實驗?zāi)康模?1) 掌握對網(wǎng)絡(luò)上傳輸數(shù)據(jù)包的捕獲方法。(2) 解析Ethernet網(wǎng)數(shù)據(jù)幀頭部的全部信息。(3) 解析IP、ICMP數(shù)據(jù)包(4) 解析傳輸層和應(yīng)用層相關(guān)協(xié)議的頭部信息(5)設(shè)置過濾規(guī)則,能過濾相應(yīng)協(xié)議的數(shù)據(jù)包。(6)要求有良好的編程規(guī)范與注釋信息,要求有詳細的說明文檔,包括程序的設(shè)計思想、活動圖、關(guān)鍵問題以及解決方法。2實驗環(huán)境:(1)VC6.0(2)局域網(wǎng)能連接Internet。3程序設(shè)計的關(guān)鍵問題以及解決方法有哪些? 當(dāng)應(yīng)用程序通過IP網(wǎng)絡(luò)傳送數(shù)據(jù)時,數(shù)據(jù)被送入TCP/IP協(xié)議棧中,然后從上至下逐一通過每一層,直到最后被當(dāng)作一串比特流送入網(wǎng)絡(luò)。其中每一層對收到的數(shù)據(jù)都要增加一些首部信息,這個過程被稱作封裝。通過以太網(wǎng)傳輸?shù)谋忍亓鞣Q作幀。在傳輸?shù)牧硪欢?,?dāng)目的主機收到一個以太網(wǎng)數(shù)據(jù)幀時,數(shù)據(jù)就開始從協(xié)議棧由底向上逐層解析,去掉各層協(xié)議所加上的報文頭部。每層協(xié)議均要檢查報文頭部中的協(xié)議標識字段,以確定要接收數(shù)據(jù)的上層協(xié)議,最終從報文中解析出應(yīng)用層數(shù)據(jù)后交給應(yīng)用程序處理。本次要編寫的協(xié)議分析器,就是從網(wǎng)絡(luò)中捕獲數(shù)據(jù)包并對其進行解析的過程。因此,我們需要了解每層協(xié)議所規(guī)定的報文格式,然后由底向上逐層對數(shù)據(jù)包進行解碼,最后將分析的結(jié)果顯示出來。4 描述程序設(shè)計過程,并畫出程序活動圖。協(xié)議分析器總體結(jié)構(gòu):協(xié)議分析器的整體結(jié)構(gòu)按功能應(yīng)分為三個部分,自底向上分別是數(shù)據(jù)捕獲模塊、協(xié)議解析模塊和用戶顯示模塊。 數(shù)據(jù)包捕獲流程:捕獲數(shù)據(jù)包的算法一般分為以下幾步:(1) 獲取并列出當(dāng)前網(wǎng)絡(luò)設(shè)備列表。(2) 由用戶選擇并打開指定網(wǎng)卡。(3) 根據(jù)過濾規(guī)則設(shè)置過濾器。捕獲數(shù)據(jù)包并進行解析處理: 協(xié)議解析模塊:對捕獲的數(shù)據(jù)包按照數(shù)據(jù)鏈路層(MAC)、網(wǎng)絡(luò)層(IP、ARP/RARP)、傳輸層(TCP、UDP、ICMP)和應(yīng)用層(HTTP等)的層次結(jié)構(gòu)自底向上進行解析,最后將解析結(jié)果顯示輸出。1) 解析Ethernet幀2) 解析ARP數(shù)據(jù)包3) 解析IP數(shù)據(jù)包4) 解析ICMP,TCP和UDP數(shù)據(jù)包 5 給出關(guān)鍵代碼,并附注釋。1) 解析Ethernet幀 typedef structBYTE DesMacAddr6;/目的地址BYTE SrcMacAddr6;/源地址WORD LengthOrType;/數(shù)據(jù)長度或類型 MAC_HEADER;/MAC幀類型定義const u_short MAC_TYPE_IP= 0x0800;const u_short MAC_TYPE_ARP= 0x0806;const u_short MAC_TYPE_RARP= 0x8035;MAC_HEADER* pMacHdr = (MAC_HEADER*) pPkt;/ Mac目的地址strItem.Format(Destination address: %02X:%02X:%02X:%02X:%02X:%02X,pMacHdr-DesMacAddr0,pMacHdr-DesMacAddr1,pMacHdr-DesMacAddr2,pMacHdr-DesMacAddr3,pMacHdr-DesMacAddr4,pMacHdr-DesMacAddr5);/ Mac源地址strItem.Format(Source address: %02X:%02X:%02X:%02X:%02X:%02X, pMacHdr-SrcMacAddr0,pMacHdr-SrcMacAddr1,pMacHdr-SrcMacAddr2,pMacHdr-SrcMacAddr3,pMacHdr-SrcMacAddr4,pMacHdr-SrcMacAddr5);/類型/長度字段if (ntohs(pMacHdr-LengthOrType) 1500)/類型字段(Ethernet V2.0)/根據(jù)類型字段調(diào)用相應(yīng)的上層協(xié)議處理函數(shù)if (ntohs(pMacHdr-LengthOrType) = MAC_TYPE_IP)/IP協(xié)議strItem = IP;ParseIPPacket(BYTE*)pMacHdr+sizeof(MAC_HEADER), iLen-sizeof(MAC_HEADER);else if (ntohs(pMacHdr-LengthOrType) = MAC_TYPE_ARP)/ARP協(xié)議strItem = ARP;ParseARPPacket(BYTE*)pMacHdr+sizeof(MAC_HEADER), iLen-sizeof(MAC_HEADER);else if (ntohs(pMacHdr-LengthOrType) = MAC_TYPE_RARP)/RARP協(xié)議strItem = RARP;ParseRARPPacket(BYTE*)pMacHdr+sizeof(MAC_HEADER),iLen-sizeof(MAC_HEADER);else/其他strItem = UNKNOWN;else /長度字段(IEEE802格式)strItem.Format(Length: %d bytes, ntohs(pMacHdr-LengthOrType); /*解析IEEE802數(shù)據(jù)幀,省略*/2) 解析ARP數(shù)據(jù)包/ARP頭部結(jié)構(gòu)typedef structu_short hardware_type;/16位硬件類型 u_short proto_type;/16位協(xié)議類型u_char hardware_addr_len;/8位硬件地址長度u_char proto_addr_len;/8位協(xié)議地址長度u_short operation_code;/16位操作碼u_char src_mac_addr6;/源Ethernet網(wǎng)地址u_char scr_ip_addr4;/源IP地址u_char dest_mac_addr6;/目的Ethernet網(wǎng)地址u_char dest_ip_addr4;/目的IP地址 ARP_HEADER;/ARP報文操作碼類型,1為請求,2位應(yīng)答const u_short ARP_OP_REQUEST= 1; /ARP請求const u_short ARP_OP_REPLY= 2; /ARP應(yīng)答ARP_HEADER* pARPHdr = (ARP_HEADER*)pPkt;ntohs(pARPHdr-hardware_type);/硬件類型ntohs(pARPHdr-proto_type);/上層協(xié)議類型pARPHdr-hardware_addr_len;/硬件地址長度pARPHdr-proto_addr_len;/協(xié)議地址長度/操作類型if (ntohs(pARPHdr-operation_code) = ARP_OP_REQUEST)strItem = (Request);else if (ntohs(pARPHdr-operation_code) = ARP_OP_REPLY)strItem = (Reply);/源Mac地址strItem.Format(Senders hardware address: %02X:%02X:%02X:%02X:%02X:%02X,pARPHdr-src_mac_addr0,pARPHdr-src_mac_addr1,pARPHdr-src_mac_addr2,pARPHdr-src_mac_addr3,pARPHdr-src_mac_addr4,pARPHdr-src_mac_addr5);/源IP地址in_addr ipAddr;memcpy(&ipAddr, pARPHdr-scr_ip_addr, sizeof(in_addr);inet_ntoa(ipAddr);/轉(zhuǎn)化為點分十進制字符串/目的Mac地址strItem.Format(Targets hardware address: %02X:%02X:%02X:%02X:%02X:%02X,pARPHdr-dest_mac_addr0,pARPHdr-dest_mac_addr1,pARPHdr-dest_mac_addr2,pARPHdr-dest_mac_addr3,pARPHdr-dest_mac_addr4,pARPHdr-dest_mac_addr5);/目的IP地址memcpy(&ipAddr, pARPHdr-dest_ip_addr, sizeof(in_addr);inet_ntoa(ipAddr);/轉(zhuǎn)化為點分十進制字符串/填充字段長度strItem.Format(Frame padding: %d bytes, iLen-sizeof(ARP_HEADER);3) 解析IP數(shù)據(jù)包/IP頭部結(jié)構(gòu)typedef structunsigned charhdr_len:4;/4位頭部長度unsigned charversion:4;/4位版本號unsigned chartos;/8位服務(wù)類型unsigned shorttotal_len;/16位總長度unsigned shortidentifier;/16位標識符unsigned shortfrag_and_flags;/3位標志+13位片偏移unsigned charttl;/8位生存時間unsigned charprotocol;/8位上層協(xié)議號unsigned shortchecksum;/16位校驗和unsigned longsource_ip;/32位源IP地址unsigned longdest_ip;/32位目的IP地址 IP_HEADER;IP_HEADER* pIPHdr = (IP_HEADER*)pPkt; /*解析IP頭部各字段并顯示輸出*/根據(jù)不同上層協(xié)議調(diào)用相應(yīng)解析函數(shù)switch (pIPHdr-protocol)case IPPROTO_TCP:strItem = TCP;ParseTCPPacket(BYTE*)pIPHdr+iIPHdrLen, iLen-iIPHdrLen);break;case IPPROTO_UDP:strItem = UDP;ParseUDPPacket(BYTE*)pIPHdr+iIPHdrLen, iLen-iIPHdrLen);break;case IPPROTO_ICMP:strItem = ICMP;ParseICMPPacket(BYTE*)pIPHdr+iIPHdrLen, iLen-iIPHdrLen);break;default:strItem = OTHERS;4) 解析ICMP,TCP和UDP數(shù)據(jù)包/ICMP基本頭部typedef structBYTEtype;/8位類型BYTEcode;/8位代碼USHORTcksum;/16位校驗和 ICMP_BASE_HEADER;/-/ICMP回顯頭部(回顯請求、回顯應(yīng)答)typedef structICMP_BASE_HEADER base_hdr;/基本頭部USHORTid;/16位標識符USHORTseq;/16位序列號 ICMP_ECHO_HEADER;/-/ICMP差錯報文頭部(超時及目的不可達)typedef structICMP_BASE_HEADER base_hdr;/基本頭部ULONGunused;/32位未用,必須為0 ICMP_ERROR_HEADER;pICMPHdr-type;/類型pICMPHdr-code;/代碼ntohs(pICMPHdr-cksum);/校驗和/根據(jù)不同類型解析后續(xù)字段switch (pICMPHdr-type)case ICMP_ECHO_REQUEST:/回顯請求報文case ICMP_ECHO_REPLY:/回顯應(yīng)答報文ICMP_ECHO_HEADER* pICMPEchoHdr = (ICMP_ECHO_HEADER*)pPkt;ntohs(pICMPEchoHdr-id);/標識符ntohs(pICMPEchoHdr-seq);/序列號if (iLen sizeof(ICMP_ECHO_HEADER)/選項數(shù)據(jù)for (int i=0; iunused);/保留字段/解析產(chǎn)生差錯的數(shù)據(jù)報IP首部(含選項字段)及其載荷的前8個字節(jié)ParseIPPacket(BYTE*)pICMPErrHdr+sizeof(ICMP_ERROR_HEADER), iLen-sizeof(ICMP_ERROR_HEADER);break;5) 解析HTTP數(shù)據(jù)包/*HTTP消息的拷貝存放在pHttpPkt指向的緩沖區(qū)中 首先在HTTP消息中查找代表消息頭結(jié)束的空行*/char* pStopPos = strstr(pHttpPkt, rnrn);/結(jié)束指針指向最后的空行if (pStopPos != NULL)/存在空行char* pBegPos = pHttpPkt;/每行的首指針char* pCurPos = pHttpPkt;/每行的尾指針int iLine = 1;while (pC

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論