版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 課程設(shè)計(jì)題目: </p><p><b> 模擬以太網(wǎng)幀封裝</b></p><p> 專 業(yè):信息工程</p><p><b> 班 級: </b></p>
2、<p><b> 姓 名:</b></p><p><b> 學(xué) 號:</b></p><p><b> 指導(dǎo)教師: </b></p><p> 2013年 12 月20日</p><p><b> 目 錄</b>&
3、lt;/p><p> 1.設(shè)計(jì)任務(wù)和目的2</p><p> 1.1 課程設(shè)計(jì)任務(wù)2</p><p> 1.2 課程設(shè)計(jì)目的2</p><p><b> 2.設(shè)計(jì)原理2</b></p><p> 2.1 802.3標(biāo)準(zhǔn)幀結(jié)構(gòu)2</p><p> 2.2 C
4、RC的基本實(shí)現(xiàn)3</p><p><b> 3.設(shè)計(jì)實(shí)現(xiàn)4</b></p><p> 3.1 設(shè)計(jì)思路4</p><p> 3.1.1 填充幀頭部字段4</p><p> 3.1.2填充數(shù)據(jù)字段4</p><p> 3.1.3 計(jì)算填充CRC4</p><
5、p><b> 3.2 流程圖5</b></p><p> 3.2.1 程序流程圖6</p><p> 3.2.2 CRC計(jì)算流程圖7</p><p><b> 4.程序源碼8</b></p><p><b> 5.運(yùn)行結(jié)果10</b></p>
6、;<p><b> 6.總結(jié)體會11</b></p><p><b> 1.設(shè)計(jì)任務(wù)和目的</b></p><p><b> 1.1課程設(shè)計(jì)任務(wù)</b></p><p> 根據(jù)給出的原始數(shù)據(jù),組裝一個(gè)IEEE802.3格式的幀。默認(rèn)的輸入文件為二進(jìn)制原始數(shù)據(jù)。封裝得到的幀輸出到
7、二進(jìn)制數(shù)據(jù)文件中。</p><p><b> 1.2課程設(shè)計(jì)目的</b></p><p> ?。?)使學(xué)生掌握網(wǎng)絡(luò)通信協(xié)議的基本工作原理;</p><p> (2)培養(yǎng)學(xué)生基本掌握網(wǎng)絡(luò)編程的基本思路和方法;</p><p> (3)能提高學(xué)生對所學(xué)計(jì)算機(jī)網(wǎng)絡(luò)理論知識的理解能力;</p><p&g
8、t; ?。?)能提高學(xué)生對所學(xué)知識的實(shí)際應(yīng)用能力和創(chuàng)新能力;</p><p> ?。?)提高學(xué)生的科技論文寫作能力。 </p><p><b> 2.設(shè)計(jì)原理</b></p><p> 2.1 802.3標(biāo)準(zhǔn)幀結(jié)構(gòu)</p><p> 以太網(wǎng)Ethernet幀格式:</p><p><b
9、> 1. 前序字段</b></p><p> 前序字段由7個(gè)字節(jié)的交替出現(xiàn)的1和0組成,設(shè)置該字段的目的是指示幀的開始并便于網(wǎng)絡(luò)中的所有接收器均能與到達(dá)幀同步。</p><p> 2.幀起始定界符字段</p><p> 它可以被看作前序字段的延續(xù)。實(shí)際上,該字段的組成方式繼續(xù)使用前序字段中的格式,這個(gè)一個(gè)字節(jié)的字段的前6個(gè)比特位置由交替出現(xiàn)
10、的1和0構(gòu)成。該字段的最后兩個(gè)比特位置是11,這兩位中斷了同步模式并提醒接收后面跟隨的是幀數(shù)據(jù)。</p><p><b> 3.目的地址字段</b></p><p> 目的地址字段確定幀的接收者。6個(gè)字節(jié)的源地址和目的地址字段是局域網(wǎng)中的所有工作站必須使用同樣的地址結(jié)構(gòu)。</p><p><b> 4.源地址字段</b&g
11、t;</p><p> 源地址字段標(biāo)識發(fā)送幀的工作站。和目前地址字段類似,源地址字段的長度六個(gè)字節(jié)。</p><p><b> 5.長度字段</b></p><p> 用于IEEE802.3的兩字節(jié)長度字段定義了數(shù)據(jù)字段包含的字節(jié)數(shù)。從前序 到FCS字段的幀長度最小必須是64字節(jié)?;谧钚L為64字節(jié)和使用六字節(jié)地址字段的要求,意味著每
12、個(gè)數(shù)據(jù)字段的最小長度為46字節(jié)。如果傳輸數(shù)據(jù)少于46個(gè)字節(jié),應(yīng)將數(shù)據(jù)字段填充至46字節(jié)。不過,填充字符的個(gè)數(shù)不包括在長度字段值中,數(shù)據(jù)字段的最大長度為1500字節(jié)。</p><p><b> 6.數(shù)據(jù)字段</b></p><p> 數(shù)據(jù)字段的最小長度必須為46字節(jié)以保證幀長至少為64字節(jié),這意味著傳輸一字節(jié)信息也必須使用46字節(jié)的數(shù)據(jù)字段:如果填入該該字段的信息少
13、于46字節(jié),該字段的其余部分也必須進(jìn)行填充零。數(shù)據(jù)字段的最大長度為1500字節(jié)。</p><p><b> 7. 校驗(yàn)序列字段</b></p><p> 將計(jì)算出的CRC填入32位的FCS校驗(yàn)字段。幀校驗(yàn)序列字段提供了一種錯(cuò)誤檢測機(jī)制,包括了地址字段、長度字段和數(shù)據(jù)字段的循環(huán)冗余校驗(yàn)(CRC)碼。</p><p> 2.2 CRC的基本實(shí)
14、現(xiàn)</p><p> 利用CRC進(jìn)行檢錯(cuò)的過程可簡單描述如下:在發(fā)送端根據(jù)要傳送的k位二進(jìn)制碼序列,以一定的規(guī)則產(chǎn)生一個(gè)校驗(yàn)用的r位監(jiān)督碼(CRC碼),附在原始信息的后邊,構(gòu)成一個(gè)新的二進(jìn)制碼序列(共k+r位),然后發(fā)送出去。在接收端,根據(jù)信息碼和CRC碼之間所遵循的規(guī)則進(jìn)行檢驗(yàn),以確定傳送中是否出錯(cuò)。這個(gè)規(guī)則在差錯(cuò)控制理論中稱為“生成多項(xiàng)式”。</p><p><b> 3
15、.設(shè)計(jì)實(shí)現(xiàn)</b></p><p><b> 3.1設(shè)計(jì)思路</b></p><p> 3.1.1 填充幀頭部字段</p><p> 在這一部分需要向輸出文件寫入前導(dǎo)碼、幀前定界符、目的地址、源地址和長度字段。寫入前四個(gè)部分相對簡單,而寫入長度字段時(shí)需要計(jì)算輸入文件的長度。所以計(jì)算輸入文件長度的方法如下:</p>
16、<p> int length=0;</p><p> infile.seekg(0,ios::end);//將讀指針移到文件末尾。</p><p> //計(jì)算指針偏移量,即為輸入文件的長度</p><p> length=infile.tellg();</p><p> //創(chuàng)建字符指針并根據(jù)文件長度初始化</p
17、><p> unsigned char* data=new unsigned char[length]; </p><p> infile.seekg(0,ios::beg);//將讀指針移到文件開始。</p><p> //將文件數(shù)據(jù)讀入到字符指針data中</p><p> infile.read(data,length); <
18、/p><p> //將data內(nèi)容寫入到輸出文件中</p><p> file.write(data,length);</p><p> 3.1.2 填充數(shù)據(jù)字段</p><p> 在數(shù)據(jù)字段中,數(shù)據(jù)字段的最小長度為46B。如果幀的LLC數(shù)據(jù)少于46B,則應(yīng)將數(shù)據(jù)字段填充至46B。填充字符是任意的,不計(jì)入長度字段值中。在程序中是用一下方法
19、實(shí)現(xiàn)的:</p><p> //如果輸入文件長度不足46B,則用補(bǔ)足46B</p><p> if(length<46)</p><p><b> {</b></p><p> for(int j=length;j<46;j++)</p><p> file.put(char
20、(0x00));</p><p><b> }</b></p><p> 3.1.3計(jì)算填充CRC </p><p> 幀封裝的最后一步就是對數(shù)據(jù)進(jìn)行校驗(yàn),并將校驗(yàn)結(jié)果記入幀校驗(yàn)字段。本程序中實(shí)現(xiàn)的是CRC-8校驗(yàn)算法,即多項(xiàng)式G(x)=x^8+x^2+x+1,方法如下所示:</p><p> file.put(
21、char(0x00));//數(shù)據(jù)后補(bǔ)1B的0,用于crc計(jì)算 file.seekg(8,ios::beg);//將讀指針指向目的地址字段,從此處開始CRC計(jì)算</p><p> unsigned char ch;//ch用來保存讀入的字符。</p><p> unsigned char crc=char(0x00);//余數(shù)初始值為。</p><p> uns
22、igned char crc=0;//初始余數(shù)為0 </p><p> while(total--) </p><p><b> { </b></p><p> unsigned char temp; </p><p> file.get(temp);//讀1B的數(shù)據(jù)</p>
23、<p> //多項(xiàng)式G(x)=x^8+x^2+x+1即以下模擬數(shù)據(jù)除以100000111的二進(jìn)制除法過程</p><p> for(unsigned char i=(unsigned char)0x80;i>0;i>>=1) </p><p><b> { </b></p><p> if(crc&
24、;0x80) </p><p><b> { </b></p><p><b> crc<<=1; </b></p><p> if(temp&i) crc^=0x01;//將輸入數(shù)據(jù)相應(yīng)位的值遞補(bǔ)到余數(shù)末位</p><p> crc^=0x07;//進(jìn)行除法運(yùn)算(即減
25、去除數(shù)的低8位:00000111)</p><p><b> } </b></p><p><b> else </b></p><p><b> { </b></p><p><b> crc<<=1; </b></p>
26、<p> if(temp&i) crc^=0x01;//將輸入數(shù)據(jù)相應(yīng)位的值遞補(bǔ)到余數(shù)末位</p><p><b> } </b></p><p><b> } </b></p><p><b> } </b></p><p><b>
27、3.2程序流程圖</b></p><p> 3.2.1程序流程圖</p><p> 3.2.2 CRC計(jì)算流程圖</p><p> 4.程序源代碼(主要代碼)</p><p> CString str;</p><p> void CEx3Dlg::OnButton2() </p>
28、<p><b> {</b></p><p> CString filter;</p><p> filter="文本文件(*.txt)|*.txt|c++文件(*.h,*.cpp)|*.h,*.cpp||";</p><p> CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDE
29、READONLY,filter);</p><p> if(dlg.DoModal()==IDOK)</p><p><b> {</b></p><p> str=dlg.GetPathName();</p><p> //AfxMessageBox(str);</p><p> Me
30、ssageBox("文件選擇成功");</p><p> //int nIndex=m_edit.AddString(str);</p><p> //m_edit.SetItemDataPtr(nIndex,0);</p><p><b> }</b></p><p><b> }
31、</b></p><p> void CEx3Dlg::OnButton1() </p><p><b> {</b></p><p> fstream file;</p><p> //打開指定輸出文件,讀寫方式為以二進(jìn)制方式可讀可寫,如文件存在則清除其內(nèi)容</p><p>
32、 file.open("D:\\out.txt",ios::in|ios::out|ios::binary|ios::trunc);</p><p> for(int i=0;i<7;i++) file.put(char(0xaa));//寫入7B前導(dǎo)碼</p><p> file.put(char(0xab));//寫
33、入1B幀前界定符</p><p> long pCrcs=file.tellp();//獲得當(dāng)前文件指定指針位置,計(jì)算CRC時(shí)從這里開始</p><p> char dst_addr[6]={char(0xff),char(0xff),char(0xe4),char(0x86),char(0x30), char(0xd0)};</p><p> file.
34、write(dst_addr,sizeof(dst_addr));//寫入6B目的地址</p><p> char src_addr[6]={char(0xff),char(0xff),char(0x80),char(0x1a),char(0xe6), char(0x09)}; </p><p> file.write(src_addr,sizeof(src_addr));
35、//寫入6B源地址</p><p> ifstream infile;</p><p> infile.open(str,ios::binary); </p><p> infile.seekg(0,ios::end);//將文件讀指針移到末尾</p><p> short length=(short)i
36、nfile.tellg();//獲得位置偏移量,即為輸入文件長度</p><p> file.put(char(length/256));//將該長度寫入數(shù)據(jù)長度字段(2B)</p><p> file.put(char(length%256)); </p><p> char* data=new char[length]; </p&
37、gt;<p> infile.seekg(0,ios::beg); </p><p> infile.read(data,length);//從輸入文件中讀出所有數(shù)據(jù)至data中</p><p> file.write(data,length);//將data中數(shù)據(jù)寫入輸出文件</p><p> infile.clo
38、se();</p><p> delete data;</p><p> if(length<46) </p><p> for(int i=0;i<46-length;i++) </p><p> file.put(char(0x00));//數(shù)據(jù)字段不足46B的部分用0填充</p><p&g
39、t; long pCrc=file.tellp();//獲得當(dāng)前位置,計(jì)算后的CRC碼將寫到這個(gè)位置</p><p> file.put(char(0x00));//數(shù)據(jù)后補(bǔ)1B的0,用于crc計(jì)算</p><p> short total=short(file.tellp())-(short)pCrcs;//需要進(jìn)行計(jì)算的數(shù)據(jù)長度</p><
40、p> file.seekg(pCrcs,ios::beg);//將讀指針指向目的地址字段,從這里開始crc計(jì)算</p><p> unsigned char crc=0;//初始余數(shù)為0 </p><p> while(total--) </p><p><b> { </b></p><p
41、> unsigned char temp; </p><p> file.get(temp);//讀1B的數(shù)據(jù)</p><p> //多項(xiàng)式G(x)=x^8+x^2+x+1即以下模擬數(shù)據(jù)除以100000111的二進(jìn)制除法過程</p><p> for(unsigned char i=(unsigned char)0x80;i>0
42、;i>>=1) </p><p><b> { </b></p><p> if(crc&0x80) </p><p><b> { </b></p><p><b> crc<<=1; </b></p><p>
43、 if(temp&i) crc^=0x01;//將輸入數(shù)據(jù)相應(yīng)位的值遞補(bǔ)到余數(shù)末位</p><p> crc^=0x07;//進(jìn)行除法運(yùn)算(即減去除數(shù)的低8位:00000111)</p><p><b> } </b></p><p><b> else </b></p><p&g
44、t;<b> { </b></p><p><b> crc<<=1; </b></p><p> if(temp&i) crc^=0x01;//將輸入數(shù)據(jù)相應(yīng)位的值遞補(bǔ)到余數(shù)末位</p><p><b> } </b></p><p><b
45、> } </b></p><p><b> } </b></p><p> file.seekp(pCrc,ios::beg); </p><p> length=sizeof(crc); </p><p> switch(length) </p><p> //若C
46、RC不足4B,將CRC補(bǔ)位至4B </p><p><b> {</b></p><p> case 1: file.put(char(0x00)); </p><p> file.put(char(0x00)); </p><p> file.put(char(0x00)); </p><p
47、> file.put(crc); </p><p><b> break; </b></p><p><b> case 2: </b></p><p> file.put(char(0x00)); </p><p> file.put(char(0x00)); </p>
48、<p> file.put(crc); </p><p><b> break; </b></p><p> case 3: file.put(char(0x00)); </p><p> file.put(crc); </p><p><b> break; </b><
49、;/p><p><b> } </b></p><p> MessageBox("幀文件封裝完成,封裝后文件為D:\\out.txt");</p><p> file.close(); </p><p><b> }</b></p><p><b
50、> 5.運(yùn)行結(jié)果</b></p><p> ?。?)輸入數(shù)據(jù)和幀封裝:</p><p><b> ?。?)源文件如下:</b></p><p> (3)被封裝后的文件如下:</p><p><b> 6.總結(jié)與體會</b></p><p> 本次課程
51、設(shè)計(jì)重點(diǎn)學(xué)習(xí)了幀封裝。在查閱了很多幀的封裝的知識后,對幀及其封裝的方法有了一定程度的了解和掌握。在對幀的學(xué)習(xí)后,有了很大的收獲,并且使幀的封裝得以實(shí)現(xiàn)。</p><p> 在設(shè)計(jì)中實(shí)現(xiàn)了幀的封裝,主要是將幀的七個(gè)部分---前導(dǎo)碼、幀前定界符、目的地址、源地址、長度字段、數(shù)據(jù)字段和校驗(yàn)字段,按順序封裝的,最后形成一個(gè)完整的幀結(jié)構(gòu)。同時(shí),在編寫程序的過程中,用到了很多的函數(shù),這些函數(shù)的運(yùn)用使得程序簡便而且正確的運(yùn)行
52、出來。為了正確的實(shí)現(xiàn)這些函數(shù),我查閱了很多相關(guān)的資料,從中獲得了大量的有用的信息,收獲也頗豐富。</p><p> 近一周的課程設(shè)計(jì)中,我的動手能力得到了很大的提高,而且將這學(xué)期所學(xué)的網(wǎng)絡(luò)的知識和以前所學(xué)的編程的知識充分的聯(lián)系起來,對這門課的認(rèn)識又提高了一層。除此之外,在做課程設(shè)計(jì)的時(shí)候也遇到了很多的問題,最后在同學(xué)的幫助下正確的解決了。從最開始的遇到問題到最后的正確解決問題,我懂得了正確出來問題的方法,也知道
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告-- 幀封裝
- 計(jì)算機(jī)網(wǎng)絡(luò)模擬方案課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 《計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)》
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)---校園網(wǎng)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)(校園網(wǎng))
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)--校園網(wǎng)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)---網(wǎng)絡(luò)設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)--校園網(wǎng)方案
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)-校園網(wǎng)構(gòu)建
- 計(jì)算機(jī)網(wǎng)絡(luò)-校園網(wǎng)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告
評論
0/150
提交評論