Ethernet幀結(jié)構(gòu)解析_第1頁(yè)
Ethernet幀結(jié)構(gòu)解析_第2頁(yè)
Ethernet幀結(jié)構(gòu)解析_第3頁(yè)
Ethernet幀結(jié)構(gòu)解析_第4頁(yè)
Ethernet幀結(jié)構(gòu)解析_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

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

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

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

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

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

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

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

14、輸出,不校驗(yàn) cout << endl << "幀前定界符:t" cout.width(2); / 輸出格式為:AB cout << hex << file.get(); / 輸出目的地址,并校驗(yàn) 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) / 第一個(gè)字節(jié),作為“余數(shù)”等待下一個(gè)bit nCheck = c; else / 開始校驗(yàn) checkCRC(nCheck, c); / 輸出源地址,并校驗(yàn) 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ù)校驗(yàn) / 輸出類型字段,并校驗(yàn) cout<<endl<<"類型字段:t" cout.width(2); / 輸出類型字段的高8位 c = file.get(); cout<< hex << c << dec << " " checkCRC(nCheck, c); / CRC校驗(yàn) EtherType = c; / 輸出類

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

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

19、 / 是否到達(dá)文件末尾 (file.tellg() - 8 - 1 - nCurrDataOffset) : / 沒(méi)到文件末尾:下一幀頭位置 - 前導(dǎo)碼和定界符長(zhǎng)度 - CRC校驗(yàn)碼長(zhǎng)度 - 數(shù)據(jù)字段起始位置 (file.tellg() - 1 - nCurrDataOffset); / 已到達(dá)文件末尾:文件末尾位置 - CRC校驗(yàn)碼長(zhǎng)度 - 數(shù)據(jù)字段起始位置 / 以文本格式數(shù)據(jù)字段,并校驗(yàn) 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校驗(yàn) if

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

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

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論