計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告-幀封裝_第1頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告-幀封裝_第2頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告-幀封裝_第3頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告-幀封裝_第4頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告-幀封裝_第5頁(yè)
已閱讀5頁(yè),還剩5頁(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)介

計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告幀封裝一、問(wèn)題描述題目是幀封裝,幀是在數(shù)據(jù)鏈路層數(shù)據(jù)進(jìn)行傳輸與交換的基本單位。構(gòu)造幀對(duì)于理解網(wǎng)絡(luò)協(xié)議的概念、協(xié)議執(zhí)行過(guò)程以及網(wǎng)絡(luò)問(wèn)題處理的一般方法具有重要的意義。本次課程設(shè)計(jì)的目的是應(yīng)用數(shù)據(jù)鏈路層與介質(zhì)訪問(wèn)控制層的知識(shí),根據(jù)數(shù)據(jù)鏈路層的基本原理,通過(guò)構(gòu)造一個(gè)具體的Ethernet幀,從而深入理解網(wǎng)絡(luò)協(xié)議的基本概念與網(wǎng)絡(luò)問(wèn)題處理的一般方法。將fileinput文件中的數(shù)據(jù)封裝成幀,封裝好的幀寫(xiě)入到文件中。如果數(shù)據(jù)長(zhǎng)度小于46字節(jié),則補(bǔ)全到46字節(jié),如果數(shù)據(jù)長(zhǎng)度大于1500,則封裝成多個(gè)幀。二、設(shè)計(jì)原理802.3標(biāo)準(zhǔn)幀結(jié)構(gòu)前序目的地址源地址長(zhǎng)度數(shù)據(jù)FCS8B6B6B2B46~1500B4B以太網(wǎng)Ethernet幀格式:a.

前序字段

前序字段由7個(gè)字節(jié)的交替出現(xiàn)的1和0組成,設(shè)置該字段的目的是指示幀的開(kāi)始并便于網(wǎng)絡(luò)中的所有接收器均能與到達(dá)幀同步。

2.幀起始定界符字段

它可以被看作前序字段的延續(xù)。實(shí)際上,該字段的組成方式繼續(xù)使用前序字段中的格式,這個(gè)一個(gè)字節(jié)的字段的前6個(gè)比特位置由交替出現(xiàn)的1和0構(gòu)成。該字段的最后兩個(gè)比特位置是11,這兩位中斷了同步模式并提醒接收后面跟隨的是幀數(shù)據(jù)。b.幀起始定界符字段

它可以被看作前序字段的延續(xù)。實(shí)際上,該字段的組成方式繼續(xù)使用前序字段中的格式,這個(gè)一個(gè)字節(jié)的字段的前6個(gè)比特位置由交替出現(xiàn)的1和0構(gòu)成。該字段的最后兩個(gè)比特位置是11,這兩位中斷了同步模式并提醒接收后面跟隨的是幀數(shù)據(jù)。c.目的地址字段

目的地址字段確定幀的接收者。6個(gè)字節(jié)的源地址和目的地址字段是局域網(wǎng)中的所有工作站必須使用同樣的地址結(jié)構(gòu)。目前,幾乎所有的802.3網(wǎng)絡(luò)使用6字節(jié)尋址.d.源地址字段

源地址字段標(biāo)識(shí)發(fā)送幀的工作站。和目前地址字段類似,源地址字段的長(zhǎng)度六個(gè)字節(jié)。當(dāng)使用六個(gè)字節(jié)的源地址字段時(shí),前三個(gè)字節(jié)表示由IEEE分配給廠商的地址,將燒錄在每一塊網(wǎng)絡(luò)接口卡的ROM中。而制造商通常為其每一網(wǎng)絡(luò)接口卡分配后節(jié)。e.長(zhǎng)度字段

用于IEEE802.3的兩字節(jié)長(zhǎng)度字段定義了數(shù)據(jù)字段包含的字節(jié)數(shù)。從前序

到FCS字段的幀長(zhǎng)度最小必須是64字節(jié)?;谧钚L(zhǎng)為64字節(jié)和使用六字節(jié)地址字段的要求,意味著每個(gè)數(shù)據(jù)字段的最小長(zhǎng)度為46字節(jié)。如果傳輸數(shù)據(jù)少于46個(gè)字節(jié),應(yīng)將數(shù)據(jù)字段填充至46字節(jié)。不過(guò),填充字符的個(gè)數(shù)不包括在長(zhǎng)度字段值中,數(shù)據(jù)字段的最大長(zhǎng)度為1500字節(jié)。f.數(shù)據(jù)字段

數(shù)據(jù)字段的最小長(zhǎng)度必須為46字節(jié)以保證幀長(zhǎng)至少為64字節(jié),這意味著傳輸一字節(jié)信息也必須使用46字節(jié)的數(shù)據(jù)字段:如果填入該該字段的信息少于46字節(jié),該字段的其余部分也必須進(jìn)行填充零。數(shù)據(jù)字段的最大長(zhǎng)度為1500字節(jié)。g.校驗(yàn)序列字段

幀校驗(yàn)序列字段提供了一種錯(cuò)誤檢測(cè)機(jī)制,每一個(gè)發(fā)送器均計(jì)算一個(gè)包括了地址字段、長(zhǎng)度字段和數(shù)據(jù)字段的循環(huán)冗余校驗(yàn)(CRC)碼。發(fā)送器于是將計(jì)算出的CRC填入4字節(jié)的FCS字段。2.

CRC的基本實(shí)現(xiàn)

循環(huán)冗余編碼(CRC)是一種重要的線性分組碼、編碼和解碼方法,具有簡(jiǎn)單、檢錯(cuò)和糾錯(cuò)能力強(qiáng)等特點(diǎn),在通信領(lǐng)域廣泛地用于實(shí)現(xiàn)差錯(cuò)控制。CRC校驗(yàn)碼的檢錯(cuò)能力很強(qiáng),不僅能檢查出離散錯(cuò)誤,還能檢查出突發(fā)錯(cuò)誤。

利用CRC進(jìn)行檢錯(cuò)的過(guò)程可簡(jiǎn)單描述如下:在發(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)式”。

循環(huán)冗余校驗(yàn)碼的特點(diǎn):(1)CRC校驗(yàn)碼可檢測(cè)出所有單個(gè)錯(cuò)誤。(2)CRC校驗(yàn)碼可檢測(cè)出所有奇數(shù)位錯(cuò)誤。(3)CRC校驗(yàn)碼可檢測(cè)出所有雙位的錯(cuò)誤(4)CRC校驗(yàn)碼可檢測(cè)出所有小于、等于校驗(yàn)位長(zhǎng)度的突發(fā)錯(cuò)誤。(5)CRC校驗(yàn)碼可以](1/2)-[11-k的概率檢測(cè)出長(zhǎng)度為(K+1)位的突發(fā)錯(cuò)誤。三、概要設(shè)計(jì)抽象類型定義inti,lastDataPacket,offsetNum;//記錄最后一個(gè)幀,記錄偏移量FILE*fileIn,*fileOut;longstartCalibration,endCalibration;//開(kāi)始檢驗(yàn)位置,結(jié)束檢驗(yàn)位置shortdataTotalNum;//記錄校驗(yàn)字節(jié)個(gè)數(shù)程序流程圖四、詳細(xì)設(shè)計(jì)主要算法fseek函數(shù)設(shè)置文件指針stream的位置。如果執(zhí)行成功,stream將指向以fromwhere(偏移起始位置:文件頭0,當(dāng)前位置1,文件尾2)為基準(zhǔn),偏移offset(指針偏移量)個(gè)字節(jié)的位置。如果執(zhí)行失敗(比如offset超過(guò)文件自身大小),則不改變stream指向的位置。fopen("c:\\out.txt")文件打開(kāi)函數(shù)函數(shù)間的調(diào)用關(guān)系主函數(shù)調(diào)用幀封裝函數(shù)frameEncapsulation(fileinput);五、調(diào)試分析1.vc6.0安裝不上是因?yàn)殡娔X是win8系統(tǒng)不兼容,解決方法,安裝虛擬機(jī)安裝winxp系統(tǒng)2.errorC2065:'exit':undeclaredidentifier修改方法添加#include<stdlib.h>3.有一次出現(xiàn)保存失敗是因?yàn)楸4娴奈恢貌淮嬖?,修改方法為把位置改成正確的原來(lái)封裝的數(shù)據(jù)不能大于1500,現(xiàn)在如果大于1500就封裝成兩個(gè)4.errorC2143:syntaxerror:missing';'before'}',修改方法增加‘;’。5.其他小問(wèn)題看了一下提示就改過(guò)來(lái)了。六、心得體會(huì)成員分工:趙亞飛(組長(zhǎng))--------編寫(xiě)主程序,以及程序的整合,程序調(diào)試孫澤鵬(組員)--------查找資料,以及流程圖及程序調(diào)試邵亞啟(組員)--------編寫(xiě)程序設(shè)計(jì)報(bào)告,及后期程序修改及調(diào)試。在此次的課程設(shè)計(jì)中,我們小組做的題目是幀封裝。在最開(kāi)始兩天收集資料的過(guò)程中,我們查閱了很多幀的封裝的知識(shí),對(duì)幀及其封裝的方法有了一定程度的了解和掌握。從最開(kāi)始對(duì)幀的一個(gè)模糊的印象到對(duì)幀的結(jié)構(gòu)的七個(gè)部分的完全掌握,有了很大的收獲,并且使幀的封裝得以實(shí)現(xiàn)。在編寫(xiě)程序的過(guò)程中,用到了很多的函數(shù),這些函數(shù)的運(yùn)用使得程序簡(jiǎn)便而且正確的運(yùn)行出來(lái)。為了正確的實(shí)現(xiàn)這些函數(shù),我們查閱了很多相關(guān)的資料,從中獲得了大量的有用的信息,收獲也頗豐富。七、用戶手冊(cè)a.運(yùn)行程序出現(xiàn)Pleaseinputselectionnumber:輸入1轉(zhuǎn)“b)”,輸入2退出。b.出現(xiàn)Pleaseenterpathtothefile:的提示,輸入需要封裝的數(shù)據(jù)的文件路徑以及名字,轉(zhuǎn)“c)”。c.按下enter,輸出結(jié)果以及結(jié)果文件默認(rèn)存放在c:\\out.txt的文件中,“轉(zhuǎn)a”).附錄:(程序源碼)/***將fileinput文件中的數(shù)據(jù)封裝成幀,封裝好的幀寫(xiě)入到文件中.*如果數(shù)據(jù)長(zhǎng)度小于46字節(jié),則補(bǔ)全到46字節(jié),如果數(shù)據(jù)長(zhǎng)度大于1500,則封裝成多個(gè)幀*@Author:zhaoyafei*@Time:2015年4月1日*/#include<stdio.h>#include<stdlib.h>#defineMAXSIZE1500/**幀封裝函數(shù),完成把給*定的文件封裝成幀的功能*/intframeEncapsulation(char*fileinput){ inti,lastDataPacket,offsetNum;//記錄最后一個(gè)幀,記錄偏移量 FILE*fileIn,*fileOut; longstartCalibration,endCalibration;//開(kāi)始檢驗(yàn)位置,結(jié)束檢驗(yàn)位置 shortdataTotalNum;//記錄校驗(yàn)字節(jié)個(gè)數(shù) printf("\n封裝后的文件保存地址:E:\\out.txt"); if((fileIn=fopen(fileinput,"r+"))==NULL){ printf("%s","打開(kāi)文件失敗"); return1; } if((fileOut=fopen("E:\\out.txt","wb+"))==NULL){ printf("%s","寫(xiě)入文件失敗"); return1; } /** *先把fpIn指針退回到文件結(jié)尾處。再得到文件位置指針 *當(dāng)前位置相對(duì)于文件首的偏移字節(jié)數(shù),即可得到內(nèi)容的長(zhǎng)度 */ fseek(fileIn,0,SEEK_END); offsetNum=ftell(fileIn); //計(jì)算整1500數(shù)據(jù)包個(gè)數(shù) intdataPacketNum=offsetNum/1500; //把文件指針重新回到文件開(kāi)頭。 rewind(fileIn); /** *for循環(huán)處理大于1500B的情況,當(dāng)大于1500時(shí) *自動(dòng)轉(zhuǎn)換到下一個(gè)數(shù)據(jù)幀中 */ for(intj=0;j<=dataPacketNum;j++){ chardata[MAXSIZE];//數(shù)據(jù)臨時(shí)存儲(chǔ)數(shù)組 //寫(xiě)入幀前導(dǎo)碼,十六進(jìn)制0xaa printf("\n幀的前導(dǎo)碼:"); for(i=0;i<7;i++){ fputc(0xaa,fileOut); printf("%X",0xaa); } //寫(xiě)入幀定界符 fputc(0xab,fileOut); printf("%X",0xab); charobjectiveMac[6]={0xff,0xff,0xff,0xff,0xff,0xff};//模擬目的MAC地址 charsourceMac[6]={0x10,0x16,0x76,0xb4,0xe4,0x77};//模擬源MAC地址 //記錄開(kāi)始進(jìn)行校驗(yàn)的位置,因?yàn)樾r?yàn)是從前導(dǎo)碼以后開(kāi)始的 startCalibration=ftell(fileOut); printf("\n幀的目的MAC地址:"); for(i=0;i<6;i++){ fputc(objectiveMac[i],fileOut);//寫(xiě)入目的MAC printf("%X",objectiveMac[i]); } printf("\n幀的源MAC地址:"); for(i=0;i<6;i++){ fputc(sourceMac[i],fileOut);//寫(xiě)入源MAC printf("%X",sourceMac[i]); } //不是最后一個(gè)數(shù)據(jù),則前面的數(shù)據(jù)都應(yīng)該是1500,所以按最大數(shù)據(jù)數(shù)算 if(j!=dataPacketNum){ //添加長(zhǎng)度字段 fputc(char(1500/256),fileOut); fputc(char(1500%256),fileOut); fread(data,sizeof(char),1500,fileIn); fwrite(data,sizeof(char),1500,fileOut); //記錄開(kāi)插入校驗(yàn)碼的位置 endCalibration=ftell(fileOut); fputc(0x00,fileOut);//添加輔助檢驗(yàn)字段 dataTotalNum=short(ftell(fileOut))-(short)startCalibration;//計(jì)算檢驗(yàn)的字段長(zhǎng)度 }else{ //得到最后一個(gè)數(shù)據(jù)塊的位置 lastDataPacket=ftell(fileIn); //剩下有多少字節(jié) inthasLongs=offsetNum-dataPacketNum*1500; //還有多少不夠46B intsurplusLongs=46-hasLongs; //記錄長(zhǎng)度字段 fputc(char(hasLongs/256),fileOut); fputc(char(hasLongs%256),fileOut); //先讀取剩余的所有數(shù)據(jù) fread(data,sizeof(char),offsetNum-lastDataPacket,fileIn); //如果不足,則填充 if(surplusLongs>0){ for(i=0;i<surplusLongs;i++){ //把不夠的部分模擬補(bǔ)上 data[hasLongs++]=0x00; } fwrite(data,sizeof(char),46,fileOut);//寫(xiě)入數(shù)據(jù) endCalibration=ftell(fileOut);//記錄開(kāi)插入校驗(yàn)碼的位置 //添加輔助檢驗(yàn)字段 fputc(0x00,fileOut); dataTotalNum=short(ftell(fileOut))-(short)startCalibration;//計(jì)算檢驗(yàn)的字段長(zhǎng)度 }else{ //多于或者等于46B,則正常讀取 fwrite(data,sizeof(char),offsetNum-lastDataPacket,fileOut); //記錄開(kāi)插入校驗(yàn)碼的位置 endCalibration=ftell(fileOut); fputc(0x00,fileOut); dataTotalNum=short(ftell(fileOut))-(short)startCalibration; } } fseek(fileOut,(short)startCalibration,SEEK_SET);//將讀指針指向開(kāi)始校驗(yàn)的位置 unsignedcharcrc=0; intstatusNum=dataTotalNum; while(statusNum--){ chartemp; //讀1B的數(shù)據(jù) temp=fgetc(fileOut); //以下模擬數(shù)據(jù)除以100000111的二進(jìn)制除法過(guò)程 for(unsignedchari=(unsignedchar)0x80;i>0;i>>=1){ if(crc&0x80){ crc<<=1; //將輸入數(shù)據(jù)相應(yīng)位的值遞補(bǔ)到余數(shù)末位 if(temp&i){ crc^=0x01; } //進(jìn)行除法運(yùn)算(即減去除數(shù)的低8位:00000111) crc^=0x07; }else{ crc<<=1; //輸入數(shù)據(jù)相應(yīng)位的值遞補(bǔ)到余數(shù)末位 if(temp&i)crc^=0x01; } } } //將讀指針指尾部,開(kāi)始插入檢驗(yàn)字段 fseek(fileOut,(short)endCalibration,SEEK_SET); //若不足4B,補(bǔ)位至4B printf("\n幀的校驗(yàn)和:"); if(sizeof(crc)==1){ fputc(0x00,fileOut); fputc(0x00,fileOut); fputc(0x00,fileOut); printf("%X%X%X",0x00,0x00,0x00); printf("%X",crc); fputc(crc,fileOut); }elseif(sizeof(crc)==2){ fputc(0x00,fileOut); fputc(0x00,fileOut); printf("%X%X",0x00,0x00); printf("%X",crc); fputc(crc,fileOut); }else{ fputc(0x00,fileOut); printf("%X",0x00); printf("%X",crc); fputc(crc,fileOut); } printf("\n幀的數(shù)據(jù)部分:"); for(intm=0;m<dataTotalNum-15;m++){ printf("%X",data[m]); } prin

溫馨提示

  • 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)論