封裝Ethernet幀課程設計_第1頁
封裝Ethernet幀課程設計_第2頁
封裝Ethernet幀課程設計_第3頁
封裝Ethernet幀課程設計_第4頁
封裝Ethernet幀課程設計_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

目錄課程設計目的..............................5課程設計要求.............................5相關知識..................................5課程設計分析..............................8相關擴展.................................10程序代碼..................................14運行結果與分析............................16參考文獻..................................171課程設計目的幀是在數(shù)據(jù)鏈路層中進行數(shù)據(jù)傳輸?shù)母締挝?。熟悉幀結構對于理解網(wǎng)絡協(xié)議的概念、網(wǎng)絡層次結構與協(xié)議執(zhí)行過程具有重要的意義。本課程設計的主要目的是通過封裝Ethernet幀,了解Ethernet幀中各個字段的含義與用途。2課程設計要求根據(jù)后面介紹的IEEE802.3幀結構,編寫程序?qū)⒅付〝?shù)據(jù)封裝為Ethernet幀。1〕以命令行形式運行:EncapFrameinput_fileoutput_file其中,EncapFrame為程序名,input_file為輸入數(shù)據(jù)文件,output_file為輸出文件。2)輸出內(nèi)容:Ethernet幀的各字段內(nèi)容。相關知識1.幀術語“幀〞來源于串行線路上的通信。其中,發(fā)送者在發(fā)送數(shù)據(jù)的前后分別添加特殊的字符,使它們成為一個幀。Ethernet從某種程度上可以被看做是機器之間的數(shù)據(jù)鏈路層連接。首先我們來認識一下幀結構,EthernerV2.0標準和IEEE802.3標準中的Ethernet幀結構有一些差異,這里我們按802.3標準的幀結構進行討論。圖為幀結構圖前導碼幀前定界符目的地址源地址長度字段數(shù)據(jù)字段校驗字段〔7B〕〔1B〕〔2/6B〕〔2/6B〕〔2B〕〔長度可變〕〔4B〕圖1.幀結構圖如上圖所示,802.3標準的Ethernet幀結構由7局部組成。前導碼與幀前定界符字段前導碼由56位〔7B〕的10101010…10101010位序列組成。幀前定界符可以視為前導碼的延續(xù)。1B的幀前定界符結構為10101011.如果將前導碼與幀前定界符一起看,那么在62位101010…1010位序列之后出現(xiàn)11。在11之后是Ethernet幀的目的地址字段。前導碼與幀前定界符主要是保證接收同步,這8B接收后不需要保存,也不記入幀頭長度中。目的地址和源地址目的地址〔DA〕與源地址〔SA〕分別表示幀的接收結點地址與發(fā)送結點的硬件地址。在Ethernet幀中,目的地址和源地址字段長度可以是2B或6B。目前的Ethernet都使用6B長度的地址。Ethernet幀的目的地址可以是單播地址、多播地址與播送地址,目的地址的第一位為0表示單播地址,為1表示多播地址,目的地址為全1那么表示播送地址。長度字段Ethernet幀用2B定義數(shù)據(jù)字段包含的字節(jié)數(shù)。協(xié)議規(guī)定,幀數(shù)據(jù)的最小長度為46B,最大長度為1500B。設置最小幀長度的目的是使每個接收結點能夠有足夠時間檢測到?jīng)_突。數(shù)據(jù)字段幀數(shù)據(jù)字段的最小長度為46B。如果幀的LLC數(shù)據(jù)少于46B,那么應將數(shù)據(jù)字段填充只46B。填充字符是任意的,不計入長度字段值中。校驗字段幀校驗字段〔FCS〕采用32位的CRC校驗。校驗的范圍包括目的地址字段、源地址字段、長度字段、LLC數(shù)據(jù)字段。此處,為了簡便起見,采用8位的CRC校驗。CRC校驗的生成多項式為:G(X)=X^8+X^2+X+1某些幀結構中還會包括幀類型字段,用來識別此幀所承載的數(shù)據(jù)的類型。當一個幀到達指定的計算機時,操作系統(tǒng)根據(jù)幀類型決定用哪個協(xié)議軟件模塊對它進行處理。自識別幀的主要優(yōu)點是,可以在同一物理網(wǎng)絡中使用多個協(xié)議而互不干擾。2.CRC校驗循環(huán)冗余編碼的編碼方式。過程:在發(fā)送端,根據(jù)要傳送的k位二進制碼序列,以一定的規(guī)那么產(chǎn)生一個校驗用的r位監(jiān)督碼,附在原始信息的后邊,構成一個新的二進制碼序列,然后發(fā)送出去。在接收端,根據(jù)信息碼和CRC碼之間所遵循的規(guī)那么進行檢驗,以確定傳送中是否出錯。CRC編碼的代數(shù)學原理將一個碼組表示為一個多項式,碼組中的各碼元作為多項式的系數(shù)。設編碼前的原始信息多項式為P〔x〕,P〔x〕最高次冪加1等于k;生成多項式為G(x),它的最高次冪等于r;CRC多項式為R(x);編碼后的帶CRC的信息多項式為T(x)。發(fā)送方編碼的方法是:P(x)乘以x^r,再除以G(x),得余式即為R(x)。接收方得解碼方法是:將T(x)除以G(x),如果余數(shù)為0,那么說明傳輸中無錯誤發(fā)生,否那么說明傳輸有錯誤。CRC的根本實現(xiàn)以CRC-8〔X^8+X^2+X^1為例,它由多個移位存放器和加法器組成。編碼、解碼前將各存放器初始化為0,輸入位作為最右邊異或操作的輸入之一。三個存放器上的移位操作同時進行,均為左移一位,左邊的存放器的最左一位作為三個異或操作的輸入之一。每次移位時,最右邊的存放器內(nèi)容作為中間異或操作的輸入之一,中間的存放器的內(nèi)容作為最左邊異或操作輸入之一,各個異或操作的結果作為與它左邊那個存放器的移入位。重復以上步驟,每輸入一位就做一次移位操作,直到輸入了所有要計算的數(shù)據(jù)為止。這時,這個存放器組中的數(shù)據(jù)就是CRC-8的結果。CRC的工作原理是:CRC在發(fā)送端編碼和接收端校驗時,都可以利用事先約定的生成多項式G(x)來得到,K位要發(fā)送的信息位可對應于一個(k-1)次多項式K(x),r位冗余位對應于一個〔r-1〕次多項式R(x),由r位冗余位組成的n=k+r位碼對應于一個(n-1)次多項式T(x)=X^r*K(x)+R(x)。循環(huán)冗余校驗碼的特點CRC校驗碼的檢錯能力很強,不僅能檢查出離散錯誤,還能檢查出突發(fā)錯誤.CRC校驗碼具有以下的檢錯能力:CRC校驗碼可檢測出所有單個錯誤,所有奇數(shù)位錯誤,所有雙位的錯誤,所有小于、等于校驗位長度的突發(fā)錯誤。課程設計分析1.填充幀頭部字段要完成一次幀封裝的過程,首先要完成的是幀頭部的裝入,這一過程只要將前導碼、定界符、目的地址、源地址、長度字段的相應數(shù)值按順序?qū)懭刖涂梢粤?。其中,長度字段的值即為要發(fā)送的數(shù)據(jù)的實際長度。有以下兩種方式來獲得長度字段的值。方法一:While(!in.eof()){in.get(a);buf[j]=a;j++;}方法二:infile.open(argv[1],ios::binary);infile.seekg(0,ios::end);shortlength=(short)infile.tellg();file.put(char(length/256));file.put(char(length%256));2.填充數(shù)據(jù)字段在填充數(shù)據(jù)字段的過程中要注意的主要問題是數(shù)據(jù)字段的長度。802.3標準中規(guī)定了幀數(shù)據(jù)字段的最小長度為46B,最大長度為1500B。如果數(shù)據(jù)缺乏46B,那么需要通過填充0來補足;假設數(shù)據(jù)長度超過1500B,那么將超過局部封裝入下一個幀進行發(fā)送。由于幀頭局部應該包括6B目的地址、6B源地址、2B長度字段以及4B幀校驗字段,因此幀頭局部長度為18B。前導碼與幀前定界符不計入幀頭長度中。那么,Ethernet幀的最小長度為64B,最大長度為1518B。填充數(shù)據(jù)字段的代碼如下:if(len==1500){…len=0;}if(len<46){for(i=len;i<46;i++)fr.data[i]=0x00;}data_len=len;3.CRC校驗幀封裝的最后一步就是對數(shù)據(jù)進行校驗,并將校驗結果記入幀校驗字段。CRC編碼實際上就是一個循環(huán)移位的模二運算。流程描述為:把CRC中的值置為0在原始數(shù)據(jù)input后添加8個0while(數(shù)據(jù)未處理完)beginif〔crc首位是1〕crc=crcXOR100000111把crc中的值左移一位,從input中讀取一位新的數(shù)據(jù)并置于crc的0位crc中的后8位就是經(jīng)過CRC-8校驗的余數(shù)。這樣,我們只需要看后8位即可,因此上面流程可以簡化。構造一個8位的存放器crc,初始值為0,數(shù)據(jù)依次移入crc的0位,同時crc的7位移出。當移出的數(shù)據(jù)為1時,crc才和00000111進行XOR運算;移出數(shù)據(jù)為0時,不做運算。每次crc中數(shù)據(jù)位為1時還需要對crc0位進行處理偽代碼:while(數(shù)據(jù)未處理完)beginif(crc的首位是1)crc左移1位crc=crcXOR00000111elsecrc左移1位if〔從input中讀入的新的數(shù)據(jù)為1〕將crc0位置1end相關擴展1.比特型運算法定義一個存放器組,初始化為全1.依照電路圖,每輸入一個信息位,相當于一個時鐘脈沖到來,從高到低依次移位。移位前信息位與bit0相加產(chǎn)生臨時位,其中bit15移入臨時位,bit10、bit3還要加上臨時位。當全部信息位輸入完成后,從存放器組取出它們的值,這就是CRC碼。該算法的代碼如下:typedefunion{u16val;struct{u16bit0:1;u16bit1:1;…}bits;}CRCREGSCRCRESGSregs;voidcrcInitRegisters(){regs.val=0xffff;}voidcrcInputBit(bitin){bita;a=regs.bits.bit0^in;regs.bits.bit0=regs.bits.bit1;regs.bits.bit1=regs.bits.bit2;regs.bits.bit2=regs.bits.bit3;regs.bits.bit3=regs.bits.bit4^a;regs.bits.bit4=regs.bits.bit5;regs.bits.bit5=regs.bits.bit6;regs.bits.bit6=regs.bits.bit7;regs.bits.bit7=regs.bits.bit8;regs.bits.bit8=regs.bits.bit9;regs.bits.bit9=regs.bits.bit10;regs.bits.bit10=regs.bits.bit11^a;regs.bits.bit11=regs.bits.bit12;regs.bits.bit12=regs.bits.bit13;regs.bits.bit13=regs.bits.bit14;regs.bits.bit14=regs.bits.bit15;regs.bits.bit15=a;}u16crcGetRegisters(){returnregs.val;}crcInputBit(bitin){bita;a=regs.bits.bit0^in;regs.val>>1;if(a)regs.val^=0x8408;}2.字節(jié)型算法數(shù)字通信系統(tǒng)一般是對一幀數(shù)據(jù)進行CRC校驗,而字節(jié)是幀的根本單位。最常用的是一種按字節(jié)查表的快速算法。該算法基于這樣一個事實:計算本字節(jié)后的CRC碼,等于上一字節(jié)CRC右移8位和本字節(jié)之和再與上一字節(jié)余式CRC碼的低8位左移8位相加后所求得的CRC碼。如果我們把8位二進制序列數(shù)的CRC全部計算出來,放在一個表里,那么編碼時只要從表中查找對應的值進行處理即可。算法如下:存放器組初始化為全1。存放器組向右移動一個字節(jié)。剛移出的那個字節(jié)與數(shù)據(jù)字節(jié)進行異或運算,得出一個指向值表的索引。將索引所指的表值與存放器組做異或運算。數(shù)據(jù)指針加1,如果數(shù)據(jù)沒有全部處理完,那么重復步驟2.存放器組取反,得到CRC,附加在數(shù)據(jù)之后。驗證算法:存放器組初始化為全1.存放器組向右移動一個字節(jié)。剛移出的那個字節(jié)與數(shù)據(jù)字節(jié)進行異或運算,得出一個指向值表的索引。將索引所指的表值與存放器組做異或運算。數(shù)據(jù)指針加1,如果數(shù)據(jù)沒有全部處理完,那么重復步驟2.判斷存放器組的值是否等于“MagicValue〞,假設相等那么通過,否那么失敗。圖2程序流程圖:圖3.CRC計算流程圖程序代碼#include<iostream.h>#include<fstream.h>voidmain(intargc,char*argv[]){ if(argc!=3) { cout<<"請按以下格式輸入命令行:framerinputfileoutputfile"<<endl; return; } fstreamfile; file.open(argv[2],ios::in|ios::out|ios::binary|ios::trunc); for(inti=0;i<7;i++)file.put(char(0xaa)); file.put(char(0xab)); longpCrcs=file.tellp(); chardst_addr[6]={char(0x00),char(0x00),char(0x80),char(0x1a),char(0xe6),char(0x65)}; file.write(dst_addr,sizeof(dst_addr)); ifstreaminfile; infile.open(argv[1],ios::binary); infile.seekg(0,ios::end); shortlength=(short)infile.tellg(); file.put(char(length/256)); file.put(char(length%256)); char*data=newchar[length]; infile.seekg(0,ios::beg); infile.read(data,length); infile.close(); deletedata; if(length<46)for(inti=0;i<46-length;i++);file.put(char(0x00)); longpCrc=file.tellp(); file.put(char(0x00)); shorttotal=short(file.tellp())-(short)pCrcs;file.seekg(pCrcs,ios::be

溫馨提示

  • 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

提交評論