Ethernet幀結構解析_第1頁
Ethernet幀結構解析_第2頁
Ethernet幀結構解析_第3頁
Ethernet幀結構解析_第4頁
Ethernet幀結構解析_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實驗一 Ethernet幀結構解析一 需求分析實驗目的:(1)掌握Ethernet幀各個字段的含義與幀接收過程; (2)掌握Ethernet幀解析軟件設計與編程方法; (3)掌握Ethernet幀CRC校驗算法原理與軟件實現(xiàn)方法。實驗任務:(1)捕捉任何主機發(fā)出的Ethernet 802.3格式的幀和DIX Ethernet V2(即Ethernet II)格式的幀并進行分析。(2)捕捉并分析局域網(wǎng)上的所有ethernet broadcast幀進行分析。(3)捕捉局域網(wǎng)上的所有ethernet multicast幀進行分析。實驗環(huán)境:安裝好Windows 2000 Server操作系統(tǒng)+Eth

2、ereal的計算機實驗時間; 2節(jié)課二概要設計1.原理概述:以太網(wǎng)這個術語通常是指由DEC,Intel和Xerox公司在1982年聯(lián)合公布的一個標準,它是當今TCP/IP采用的主要的局域網(wǎng)技術,它采用一種稱作CSMA/CD的媒體接入方法。幾年后,IEEE802委員會公布了一個稍有不同的標準集,其中802.3針對整個CSMA/CD網(wǎng)絡,802.4針對令牌總線網(wǎng)絡,802.5針對令牌環(huán)網(wǎng)絡;此三種幀的通用部分由802.2標準來定義,也就是我們熟悉的802網(wǎng)絡共有的邏輯鏈路控制(LLC)。以太網(wǎng)幀是OSI參考模型數(shù)據(jù)鏈路層的封裝,網(wǎng)絡層的數(shù)據(jù)包被加上幀頭和幀尾,構成可由數(shù)據(jù)鏈路層識別的數(shù)據(jù)幀。雖然幀

3、頭和幀尾所用的字節(jié)數(shù)是固定不變的,但根據(jù)被封裝數(shù)據(jù)包大小的不同,以太網(wǎng)幀的長度也隨之變化,變化的范圍是64-1518字節(jié)(不包括8字節(jié)的前導字)。 幀格式 Ethernet II和IEEE802.3的幀格式分別如下。 EthernetrII幀格式: - | 前序 | 目的地址 | 源地址 | 類型 | 數(shù)據(jù) | FCS | - | 8 byte | 6 byte | 6 byte | 2 byte | 461500 byte | 4 byte| IEEE802.3一般幀格式 - | 前序 | 幀起始定界符 | 目的地址 | 源地址 | 長度 | 數(shù)據(jù) | FCS | - | 7 byte |

4、1 byte | 2/6 byte | 2/6 byte| 2 byte| 461500 byte | 4 byte | Ethernet II和IEEE802.3的幀格式比較類似,主要的不同點在于前者定義的2字節(jié)的類型,而后者定義的是2字節(jié)的長度;所幸的是,后者定義的有效長度值與前者定義的有效類型值無一相同,這樣就容易區(qū)分兩種幀格式2程序流程圖:三 詳細設計:1.CRC校驗部分設計:為了對以太網(wǎng)幀的對錯進行檢驗,需要設計CRC校驗部分。采用以為相與的方式對幀的首部相繼作8位CRC校驗輸入?yún)?shù):chCurrByte 低8位數(shù)據(jù)有效,記錄了上一次CRC校驗的余數(shù)chNextByte 低8位數(shù)據(jù)有

5、效,記錄了本次要繼續(xù)校驗的一個字節(jié) 傳出參數(shù):chCurrByte 低8位數(shù)據(jù)有效,記錄了本次CRC校驗的余數(shù)void checkCRC(int &chCurrByte, int chNextByte)/ CRC循環(huán):每次調用進行8次循環(huán),處理一個字節(jié)的數(shù)據(jù)。for (int nMask = 0x80; nMask > 0; nMask >>= 1) if (chCurrByte & 0x80) != 0) / 首位為1:移位,并進行異或運算 chCurrByte <<= 1; / 移一位 if ( (chNextByte & nMask)

6、 != 0) / 補一位 chCurrByte |= 1; chCurrByte = 7; / 首位已經(jīng)移出,僅對低8位進行異或運算,7的二進制為0000,0111 else / 首位為0,只移位,不進行異或運算 chCurrByte <<= 1; / 移一位 if ( (chNextByte & nMask) != 0) / 補一位 chCurrByte |= 1; 2.部分變量的聲明:int nSN = 1; / 幀序號int nCheck = 0; / 校驗碼int nCurrDataOffset = 22; / 幀頭偏移量int nCurrDataLength =

7、0; / 數(shù)據(jù)字段長度bool bParseCont = true; / 是否繼續(xù)對輸入文件進行解析int nFileEnd = 0; / 輸入文件的長度3.計算數(shù)據(jù)段的長度:nCurrDataLength = bParseCont ? / 是否到達文件末尾(file.tellg() - 8 - 1 - nCurrDataOffset) : / 沒到文件末尾:下一幀頭位置 - 前導碼和定界符長度 - CRC校驗碼長度 - 數(shù)據(jù)字段起始位置(file.tellg() - 1 - nCurrDataOffset); / 已到達文件末尾:文件末尾位置 - CRC校驗碼長度 - 數(shù)據(jù)字段起始位置4.主

8、函數(shù)的設計:void main(int argc, char* argv) / 檢測命令行參數(shù)的正確性if (argc != 2) cout << "請以幀封裝包文件為參數(shù)重新執(zhí)行程序" << endl; exit(0);/ 檢測輸入文件是否存在,并可以按所需的權限和方式打開ifstream file(argv1, ios:in|ios:binary|ios:nocreate);if (!file.is_open() cout << "無法打開幀封裝包文件,請檢查文件是否存在并且未損壞" << endl;

9、exit(0);/ 變量聲明及初始化int nSN = 1; / 幀序號int nCheck = 0; / 校驗碼int nCurrDataOffset = 22; / 幀頭偏移量int nCurrDataLength = 0; / 數(shù)據(jù)字段長度bool bParseCont = true; / 是否繼續(xù)對輸入文件進行解析int nFileEnd = 0; / 輸入文件的長度/ 計算輸入文件的長度file.seekg(0, ios:end); / 把文件指針移到文件的末尾nFileEnd = file.tellg(); / 取得輸入文件的長度file.seekg(0, ios:beg); /

10、文件指針位置初始化cout.fill('0'); / 顯示初始化cout.setf(ios:uppercase); / 以大寫字母輸出/ 定位到輸入文件中的第一個有效幀/ 從文件頭開始,找到第一個連續(xù)的“AA-AA-AA-AA-AA-AA-AA-AB”while ( true ) for (int j = 0; j < 7; j+) / 找7個連續(xù)的0xaa if (file.tellg() >= nFileEnd) / 安全性檢測 cout<<"沒有找到合法的幀"<<endl; file.close(); exit(0)

11、; / 看當前字符是不是0xaa,如果不是,則重新尋找7個連續(xù)的0xaa if (file.get() != 0xaa) j = -1; if (file.tellg() >= nFileEnd) / 安全性檢測 cout<<"沒有找到合法的幀"<<endl; file.close(); exit(0); if (file.get() = 0xab) / 判斷7個連續(xù)的0xaa之后是否為0xab break; / 將數(shù)據(jù)字段偏移量定位在上述二進制串之后14字節(jié)處,并準備進入解析階段nCurrDataOffset = file.tellg() +

12、 14;file.seekg(-8,ios:cur);/ 主控循環(huán)while ( bParseCont ) / 當仍然可以繼續(xù)解析輸入文件時,繼續(xù)解析 / 檢測剩余文件是否可能包含完整幀頭 if (file.tellg() + 14 > nFileEnd) cout<<endl<<"沒有找到完整幀頭,解析終止"<<endl; file.close(); exit(0); int c; / 讀入字節(jié) int i = 0; / 循環(huán)控制變量 int EtherType = 0; / 由幀中讀出的類型字段 bool bAccept = t

13、rue; / 是否接受該幀 / 輸出幀的序號 cout << endl << "序號:tt" << nSN; / 輸出前導碼,只輸出,不校驗 cout << endl << "前導碼:t" for (i = 0; i < 7; i+) / 輸出格式為:AA AA AA AA AA AA AA cout.width(2); cout << hex << file.get() << dec << " " / 輸出幀前定界符,只

14、輸出,不校驗 cout << endl << "幀前定界符:t" cout.width(2); / 輸出格式為:AB cout << hex << file.get(); / 輸出目的地址,并校驗 cout << endl << "目的地址:t" for (i = 0; i < 6; i+) / 輸出格式為:xx-xx-xx-xx-xx-xx c = file.get(); cout.width(2); cout<< hex << c <<

15、dec << (i=5 ? "" : "-"); if (i = 0) / 第一個字節(jié),作為“余數(shù)”等待下一個bit nCheck = c; else / 開始校驗 checkCRC(nCheck, c); / 輸出源地址,并校驗 cout << endl << "源地址:t" for (i = 0; i < 6; i+) / 輸出格式為:xx-xx-xx-xx-xx-xx c = file.get(); cout.width(2); cout<< hex << c &

16、lt;< dec << (i=5 ? "" : "-"); checkCRC(nCheck, c); / 繼續(xù)校驗 / 輸出類型字段,并校驗 cout<<endl<<"類型字段:t" cout.width(2); / 輸出類型字段的高8位 c = file.get(); cout<< hex << c << dec << " " checkCRC(nCheck, c); / CRC校驗 EtherType = c; / 輸出類

17、型字段的低8位 c = file.get(); cout.width(2); cout<< hex << c; checkCRC(nCheck,c); / CRC校驗 EtherType <<= 8; / 轉換成主機格式 EtherType |= c; / 定位下一個幀,以確定當前幀的結束位置 while ( bParseCont ) for (int i = 0; i < 7; i+) /找下一個連續(xù)的7個0xaa if (file.tellg() >= nFileEnd) /到文件末尾,退出循環(huán) bParseCont = false; bre

18、ak; / 看當前字符是不是0xaa,如果不是,則重新尋找7個連續(xù)的0xaa if (file.get() != 0xaa) i = -1; / 如果直到文件結束仍沒找到上述比特串,將終止主控循環(huán)的標記bParseCont置為true bParseCont = bParseCont && (file.tellg() < nFileEnd); / 判斷7個連續(xù)的0xaa之后是否為0xab if (bParseCont && file.get() = 0xab) break; / 計算數(shù)據(jù)字段的長度 nCurrDataLength = bParseCont ?

19、 / 是否到達文件末尾 (file.tellg() - 8 - 1 - nCurrDataOffset) : / 沒到文件末尾:下一幀頭位置 - 前導碼和定界符長度 - CRC校驗碼長度 - 數(shù)據(jù)字段起始位置 (file.tellg() - 1 - nCurrDataOffset); / 已到達文件末尾:文件末尾位置 - CRC校驗碼長度 - 數(shù)據(jù)字段起始位置 / 以文本格式數(shù)據(jù)字段,并校驗 cout << endl << "數(shù)據(jù)字段:t" unsigned char* pData = new unsigned charnCurrDataLength

20、; / 創(chuàng)建緩沖區(qū) file.seekg(bParseCont ? (-8 - 1 -nCurrDataLength) : ( -1 - nCurrDataLength), ios:cur); file.read(pData, nCurrDataLength); / 讀入數(shù)據(jù)字段 int nCount = 50; / 每行的基本字符數(shù)量 for (i = 0; i < nCurrDataLength; i+) / 輸出數(shù)據(jù)字段文本 nCount-; cout << pDatai; / 字符輸出 checkCRC(nCheck, (int)pDatai); / CRC校驗 if

21、 ( nCount < 0) / 換行處理 / 將行尾的單詞寫完整 if ( pDatai = ' ' ) cout << endl << "tt" nCount = 50; / 處理過長的行尾單詞:換行并使用連字符 if ( nCount < -10) cout<< "-" << endl << "tt" nCount = 50; delete pData; /釋放緩沖區(qū)空間 / 輸出CRC校驗碼,如果CRC校驗有誤,則輸出正確的CRC校驗碼 c

22、out << endl <<"CRC校驗" c = file.get(); / 讀入CRC校驗碼 int nTmpCRC = nCheck; checkCRC(nCheck, c); / 最后一步校驗 if (nCheck & 0xff) = 0) / CRC校驗無誤 cout.width(2); cout<<"(正確):t"<< hex << c; else / CRC校驗有誤 cout.width(2); cout<< "(錯誤):t" << hex << c; checkCRC(nTmpCRC, 0); / 計算

溫馨提示

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

評論

0/150

提交評論