計算機網(wǎng)絡(luò)課程設(shè)計 幀封裝_第1頁
計算機網(wǎng)絡(luò)課程設(shè)計 幀封裝_第2頁
計算機網(wǎng)絡(luò)課程設(shè)計 幀封裝_第3頁
計算機網(wǎng)絡(luò)課程設(shè)計 幀封裝_第4頁
計算機網(wǎng)絡(luò)課程設(shè)計 幀封裝_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、學(xué) 號: 課 程 設(shè) 計題 目幀封裝學(xué) 院計算機科學(xué)與技術(shù)學(xué)院專 業(yè)軟件工程專業(yè)班 級軟件0902班姓 名指導(dǎo)教師2012年6月20日課程設(shè)計任務(wù)書學(xué)生姓名: 專業(yè)班級: 軟件0902班 指導(dǎo)教師: 工作單位: 計算機學(xué)院 題目一: 幀封裝 初始條件:(1)學(xué)習(xí)相關(guān)知識(2)C/C+/VC/VB/JAVA語言(3)PC機一臺要求完成的主要任務(wù): (包括課程設(shè)計工作量及其技術(shù)要求,以及說明書撰寫等具體要求)編寫程序,根據(jù)給出的原始數(shù)據(jù),組裝一個IEEE802.3格式的幀(題目默認(rèn)的輸入文件為二進(jìn)制原始數(shù)據(jù)(文件名為input1和input2)。1)要求程序為命令行程序。比如,可執(zhí)行文件名為fra

2、mer.exe,則命令行形式如下:framer inputfile outputfile其中,inputfile為原始數(shù)據(jù)文件,outputfile為輸出結(jié)果。使用操作系統(tǒng)、語言、編程環(huán)境不限,但在報告中必須注明。2)輸出:對應(yīng)input1和input2的結(jié)果分別為output1和output2。時間安排:第一、二天:查閱資料,學(xué)習(xí)算法第三、四天:編程調(diào)試第五天:書寫報告指導(dǎo)教師簽名: 年 月 日系主任(或責(zé)任教師)簽名: 年 月 日目錄1.引言42.以太網(wǎng)幀格式的發(fā)展43.IEEE802.3幀結(jié)構(gòu)54.錯檢測65.實現(xiàn)步驟75.1前導(dǎo)符75.2目的地址及源地址75.3長度及數(shù)據(jù)字段85.4幀

3、檢驗序列86.源代碼107.運行結(jié)果示例178.心得體會189.參考文獻(xiàn)19幀封裝1. 引言以太網(wǎng)這個術(shù)語通常是指由DEC、Intel和Xerox公司在1982年聯(lián)合公布的一個標(biāo)準(zhǔn),它是當(dāng)今TCP/IP采用的主要的局域網(wǎng)技術(shù),它采用一種稱作CSMA/CD的媒體接入方法。在TCP/IP世界中,以太網(wǎng)IP數(shù)據(jù)報文的封裝在RFC 894中定義。以太網(wǎng)采用廣播機制,所有與網(wǎng)絡(luò)連接的工作站都可以看到網(wǎng)絡(luò)上傳遞的數(shù)據(jù)。通過查看包含在幀中的目標(biāo)地址,確定是否進(jìn)行接收或放棄。如果證明數(shù)據(jù)確實是發(fā)給自己的,工作站將會接收數(shù)據(jù)并傳遞給高層協(xié)議進(jìn)行處理。以太網(wǎng)采用CSMA/CD(Carrier Sense Mult

4、iple Access/Collision Detection)媒體訪問機制,任何工作站都可以在任何時間訪問網(wǎng)絡(luò)。在以太網(wǎng)中,所有的節(jié)點共享傳輸介質(zhì)。如何保證傳輸介質(zhì)有序、高效地為許多節(jié)點提供傳輸服務(wù),就是以太網(wǎng)的介質(zhì)訪問控制協(xié)議要解決的問題。幀是在數(shù)據(jù)鏈路層數(shù)據(jù)進(jìn)行傳輸與交換的基本單位。構(gòu)造幀對于理解網(wǎng)絡(luò)協(xié)議的概念、協(xié)議執(zhí)行過程以及網(wǎng)絡(luò)問題處理的一般方法具有重要的意義。本次課程設(shè)計的目的是應(yīng)用數(shù)據(jù)鏈路層與介質(zhì)訪問控制層的知識,根據(jù)數(shù)據(jù)鏈路層的基本原理,通過構(gòu)造一個具體的Ethernet幀,從而深入理解網(wǎng)絡(luò)協(xié)議的基本概念與網(wǎng)絡(luò)問題處理的一般方法。2. 以太網(wǎng)幀格式的發(fā)展1980,DEC、Int

5、el、Xerox制訂了Ethernet I的標(biāo)準(zhǔn);1982,DEC、Intel、Xerox又制訂了Ehternet II的標(biāo)準(zhǔn);1982,IEEE開始研究Ethernet的國際標(biāo)準(zhǔn)802.3;1983,迫不及待的Novell基于IEEE的802.3的原始版開發(fā)了專用的Ethernet幀格式;1985,IEEE推出IEEE 802.3規(guī)范,后來為解決EthernetII與802.3幀格式的兼容問題,推出折衷的Ethernet SNAP格式。3. IEEE802.3幀結(jié)構(gòu)數(shù)據(jù)在網(wǎng)絡(luò)上是以很小的稱為幀(Frame)的單位傳輸?shù)?,幀由幾部分組成,不同的部分執(zhí)行不同的功能。幀通過特定的稱為網(wǎng)絡(luò)驅(qū)動程序的

6、軟件進(jìn)行成型,然后通過網(wǎng)卡發(fā)送到網(wǎng)線上,通過網(wǎng)線到達(dá)它們的目的機器,在目的機器的一端執(zhí)行相反的過程。接收端機器的以太網(wǎng)卡捕獲到這些幀,并告訴操作系統(tǒng)幀已到達(dá),然后對其進(jìn)行存儲?!皫睌?shù)據(jù)大致由兩部分組成:幀頭和幀數(shù)據(jù)。幀頭包括接收方主機物理地址的定位以及其它網(wǎng)絡(luò)信息。幀數(shù)據(jù)區(qū)含有一個數(shù)據(jù)體。為確保計算機能夠解釋數(shù)據(jù)幀中的數(shù)據(jù),這兩臺計算機使用一種公用的通訊協(xié)議?;ヂ?lián)網(wǎng)使用的通訊協(xié)議簡稱IP,即互聯(lián)網(wǎng)協(xié)議。IP數(shù)據(jù)體由兩部分組成:數(shù)據(jù)體頭部和數(shù)據(jù)體的數(shù)據(jù)區(qū)。數(shù)據(jù)體頭部包括IP源地址和IP目標(biāo)地址,以及其它信息。數(shù)據(jù)體的數(shù)據(jù)區(qū)包括用戶數(shù)據(jù)協(xié)議(UDP),傳輸控制協(xié)議(TCP),還有數(shù)據(jù)包的其他信息

7、。這些數(shù)據(jù)包都含有附加的進(jìn)程信息以及實際數(shù)據(jù)。866246 15004前導(dǎo)符目的地址源地址長度數(shù)據(jù)FCS圖3.1 IEEE802.3幀結(jié)構(gòu)常用的以太網(wǎng)MAC幀格式用兩種標(biāo)準(zhǔn),一種是DIX Ethernet V2標(biāo)準(zhǔn)(即以太網(wǎng)V2標(biāo)準(zhǔn)),另一種是IEEE的802.3標(biāo)準(zhǔn)。這里只介紹符合IEEE802.3標(biāo)準(zhǔn)的幀,其格式如圖3.1所示。它的組成比較簡單,由6個字段組成。接下來對這6個部分詳細(xì)介紹一下。(1)前導(dǎo)符:由7字節(jié)的前同步碼和1字節(jié)的幀起始定界符構(gòu)成。前同步碼:這個字段有7個字節(jié)(56位)交替出現(xiàn)的1和0,它的作用就是提醒接收系統(tǒng)有幀的到來,以及使到來的幀與計時器進(jìn)行同步。前同步碼其實是在

8、物理層添加上去的,并不是(正式的)幀的一部分。前同步碼的目標(biāo)是允許物理層在接收到實際的幀起始符之前檢測載波,并且與接收到的幀時序達(dá)到穩(wěn)定同步。幀起始定界符:這個字段用1字節(jié)(10101011)作為幀開始的信號,表示一幀的開始。最后兩位是11,表示下面的字段是目的地址。(2)目的地址(DA) 48位,表示幀準(zhǔn)備發(fā)往目的站的地址,共6個字節(jié),可以是單址(代表單個站)、多址(代表一組站)或全地址(代表局域網(wǎng)上的所有站)。當(dāng)目的地址出現(xiàn)多址時,表示該幀被一組站同時接收,稱為“組播”(Multicast)。目的地址出現(xiàn)全地址時,表示該幀被局域網(wǎng)上所有站同時接收,稱為“廣播”(Broadcast),通常以

9、DA的最高位來判斷地址的類型,若第一字節(jié)最低位為“0”則表示單址,第一字節(jié)最低位為“1”則表示組播。(3)源地址(SA)48位,表明該幀的數(shù)據(jù)是哪個網(wǎng)卡發(fā)的,即發(fā)送端的網(wǎng)卡地址。(4)該字段是“長度/類型”。當(dāng)這個字段的值大于0X0600時(相當(dāng)于十進(jìn)制的1536),就表示“類型”。這樣的幀和以太網(wǎng)V2 MAC幀完全一樣。只有當(dāng)這個字段的值小于0X0600時才表示“長度”,即MAC幀的數(shù)據(jù)部分長度。(5)數(shù)據(jù)字段的最小長度必須為46字節(jié)以保證幀長至少為64字節(jié),這意味著傳輸一字節(jié)信息也必須使用46字節(jié)的數(shù)據(jù)字段:如果填入該字段的信息少于46字節(jié),該字段的其余部分也必須進(jìn)行填充。數(shù)據(jù)字段的默認(rèn)最

10、大長度為1500字節(jié)。(6)幀檢驗序列(FCS)是32位冗余檢驗碼(CRC),檢驗除前導(dǎo)、SFD和FCS以外的內(nèi)容。當(dāng)發(fā)送站發(fā)出幀時,一邊發(fā)送,一邊逐位進(jìn)行CRC檢驗。最后形成一個32位CRC檢驗和填在幀尾FCS位置中一起在媒體上傳輸。接收站接收后,從DA開始同樣邊接收邊逐位進(jìn)行CRC檢驗。最后接收站形成的檢驗和若與幀的檢驗和相同,則表示媒體上傳輸幀未被破壞。反之,接收站認(rèn)為幀被破壞,則會通過一定的機制要求發(fā)送站重發(fā)該幀。4. 錯檢測在校驗字段中,使用的是CRC校驗。校驗的范圍包括目的地址字段、源地址字段、長度字段、LLC數(shù)據(jù)字段。循環(huán)冗余編碼(CRC)是一種重要的線性分組碼、編碼和解碼方法,

11、具有簡單、檢錯和糾錯能力強等特點,在通信領(lǐng)域廣泛地用于實現(xiàn)差錯控制。CRC校驗碼的檢錯能力很強,不僅能檢查出離散錯誤,還能檢查出突發(fā)錯誤。利用CRC進(jìn)行檢錯的過程可簡單描述如下:在發(fā)送端根據(jù)要傳送的k位二進(jìn)制碼序列,以一定的規(guī)則產(chǎn)生一個校驗用的r位監(jiān)督碼(CRC碼),附在原始信息的后邊,構(gòu)成一個新的二進(jìn)制碼序列(共k+r位),然后發(fā)送出去。在接收端,根據(jù)信息碼和CRC碼之間所遵循的規(guī)則進(jìn)行檢驗,以確定傳送中是否出錯。這個規(guī)則在差錯控制理論中稱為“生成多項式”。循環(huán)冗余校驗碼的特點:(1)CRC校驗碼可檢測出所有單個錯誤。(2)CRC校驗碼可檢測出所有奇數(shù)位錯誤。(3)CRC校驗碼可檢測出所有雙

12、位的錯誤。(4)CRC校驗碼可檢測出所有小于、等于校驗位長度的突發(fā)錯誤。(5)CRC校驗碼可以 的概率檢測出長度為(K+1)位的突發(fā)錯誤。5. 實現(xiàn)步驟123455.1 前導(dǎo)符前導(dǎo)符包括7字節(jié)的前發(fā)送碼和1字節(jié)的幀起始定界符。由于這些都是固定寫法,因此添加起來非常簡單。對應(yīng)方法如下。public static boolean appendPrefix() / 前導(dǎo)符中前7個字節(jié)是交替出現(xiàn)的1和0for (int i = 0; i < 7; +i) tmp.add(0XAA);/ 前導(dǎo)符的第8個字節(jié)是約定好的0XABtmp.add(0XAB);return true;5.2 目的地址及源地

13、址我們知道,目的機器的硬件地址是通過ARP協(xié)議得到的,這需要發(fā)送ARP請求包才能得到,為了簡化程序的設(shè)計,突出本次設(shè)計的要點,因此將目的地址固定寫成“FF:FF:FF:FF:FF:FF”。類似地,獲得本機地址也需要通過一系列的函數(shù)調(diào)用,在程序中就直接寫成已知的硬件地址“74:E5:0B:7D:CE:3A”。對應(yīng)方法如下。public static boolean appendAddress() / 由于未顯式要求目的地址,因此程序中將目的地址固定為FF:FF:FF:FF:FF:FFfor (int i = 0; i < 6; +i) tmp.add(0XFF);/ 本機地址為74:E5:

14、0B:7D:CE:3Atmp.add(0X74);tmp.add(0XE5);tmp.add(0X0B);tmp.add(0X7D);tmp.add(0XCE);tmp.add(0X3A);return true;5.3 長度及數(shù)據(jù)字段對于發(fā)送端來說,必須先獲得數(shù)據(jù)的長度,將長度字段添加到幀中之后才能再添加數(shù)據(jù)字段,這就限定了必須訪問輸入文件兩次,第一次用于獲得文件長度,第二次用于封裝幀。當(dāng)然在進(jìn)行CRC計算的時候有一些地方可以優(yōu)化。本程序的文件是通過FileInputStream進(jìn)行讀入,通過FileOutputStream進(jìn)行輸出。5.4 幀檢驗序列計算FCS是本程序最困難的部分。算法描述

15、如下:(1)輸入需要檢驗的序列M,以及發(fā)送方與接收方約定好的除數(shù)P,并初始化余數(shù)R為0,若P有n位,則R有n 1位;(2)對序列M中的每一位(記為b)進(jìn)行步驟(3)。結(jié)束后R即為FCS。(3)將R左移1位,并將b添加到R的最低位,判斷R的最高位,如果是0,則繼續(xù)(3),如果是1,則將R和P進(jìn)行按位與操作,結(jié)果保存到R中。圖5.4.1 CRC流程圖相應(yīng)的流程圖如圖所示,其實現(xiàn)如下,其中curByte為一個字節(jié),currentR為從開始到現(xiàn)在已經(jīng)循環(huán)計算所得的余數(shù)。public static int nextR(int currentR, int curByte) int mask = 0X80;

16、int curBit = 0;for (int i = 0; i < 8; +i, mask >>= 1) / 計算當(dāng)前位,0或者1curBit = (curByte & mask) = 0 ? 0X0 : 0X1;/ 首先將余數(shù)左移1位,并把當(dāng)前位添加到余數(shù)的最低位currentR <<= 1;currentR += curBit;/ 判斷余數(shù)最高位是否為0/ 若為1,則將除數(shù)和余數(shù)進(jìn)行異或操作,將結(jié)果保存為余數(shù)if (currentR & MASK_HIGH) != 0) currentR = currentR P;return current

17、R;6. 源代碼import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.LinkedList;import java.util.List;public class framer public static void main(String args) throws IOException i

18、f (args.length < 2) System.out.println("參數(shù)錯誤!");return;FileInputStream fin = null;FileOutputStream fout = null;try fin = new FileInputStream(new File(args0);fout = new FileOutputStream(args1); catch (IOException e) System.out.println("文件錯誤!");return;/ 添加前導(dǎo)符appendPrefix();/ 添加目

19、的地址和源地址appendAddress();/ 添加數(shù)據(jù),包括數(shù)據(jù)長度、數(shù)據(jù)內(nèi)容以及幀檢驗序列appendData(fin, fout);fin.close();fout.close();/* * 添加8個字節(jié)的前導(dǎo)符 * * return 添加成功時返回true,否則false */public static boolean appendPrefix() / 前導(dǎo)符中前7個字節(jié)是交替出現(xiàn)的1和0for (int i = 0; i < 7; +i) tmp.add(0XAA);/ 前導(dǎo)符的第8個字節(jié)是約定好的0XABtmp.add(0XAB);return true;/* * 添加6個

20、字節(jié)的目的地址,和添加6個字節(jié)的源地址 * * return 添加成功時返回true,否則false */public static boolean appendAddress() / 由于未顯式要求目的地址,因此程序中將目的地址固定為FF:FF:FF:FF:FF:FFfor (int i = 0; i < 6; +i) tmp.add(0XFF);/ 本機地址為74:E5:0B:7D:CE:3Atmp.add(0X74);tmp.add(0XE5);tmp.add(0X0B);tmp.add(0X7D);tmp.add(0XCE);tmp.add(0X3A);return true;/

21、* * 添加2個字節(jié)的數(shù)據(jù)長度,接著添加數(shù)據(jù)字段,最后添加幀檢驗序列FCS * * param in * 輸入文件 * param out * 輸出流 * return 添加成功時返回true,否則false */public static boolean appendData(InputStream in, OutputStream out) int data = new intMAX_SIZE;/ 文件長度int size = 0;/ 當(dāng)前字節(jié)int curByte = 0;try while (size < MAX_SIZE && (curByte = in.rea

22、d() != -1) datasize+ = curByte; catch (IOException e1) e1.printStackTrace();return false;/ 首先添加2個字節(jié)的數(shù)據(jù)長度tmp.add(size >> 8);tmp.add(size);/ 然后添加數(shù)據(jù)字段for (int i = 0; datai != -1 && i < size; +i) tmp.add(datai);/ 若數(shù)據(jù)長度不足,則補充填充字節(jié)if (size < MIN_SIZE) for (int i = 0; i < MIN_SIZE - s

23、ize; +i) tmp.add(FILL_BYTE);/ 計算FCS/ 初始化余數(shù)為0int R = 0;try for (int b : tmp) / 每次讀入一個字節(jié),將它添加到幀中,并且循環(huán)計算FCSout.write(b);R = nextR(R, b); catch (IOException e) e.printStackTrace();return false;try / 最后添加4個字節(jié)的幀檢驗序列out.write(R >> 24);out.write(R >> 16);out.write(R >> 8);out.write(R); cat

24、ch (IOException e) e.printStackTrace();return false;return true;public static int nextR(int currentR, int curByte) int mask = 0X80;int curBit = 0;for (int i = 0; i < 8; +i, mask >>= 1) / 計算當(dāng)前位,0或者1curBit = (curByte & mask) = 0 ? 0X0 : 0X1;/ 首先將余數(shù)左移1位,并把當(dāng)前位添加到余數(shù)的最低位currentR <<= 1;c

25、urrentR += curBit;/ 判斷余數(shù)最高位是否為0/ 若為1,則將除數(shù)和余數(shù)進(jìn)行異或操作,將結(jié)果保存為余數(shù)if (currentR & MASK_HIGH) != 0) currentR = currentR P;return currentR;/ 數(shù)據(jù)字段的最大長度public static final int MAX_SIZE = 1500;/ 數(shù)據(jù)字段的最小長度public static final int MIN_SIZE = 46;/ 填充字節(jié)public static final int FILL_BYTE = 0X00;/ 發(fā)送方與接收方約定好的除數(shù)Ppubl

26、ic static final int P = 0XACEF1357;/ 用于判斷余數(shù)最高位是否為1的掩碼public static final int MASK_HIGH = 0X8000;private static List<Integer> tmp = new LinkedList<Integer>();7. 運行結(jié)果示例為了演示需要,首先新建一個文本文件,內(nèi)容為“ChenJiaHui”(不含引號),如圖7.1所示。用文本文件的一個好處是可以方便的檢測輸出文件(即幀的格式)是否正確。圖7.1 輸入文件接下來將源程序進(jìn)行編譯和運行。命令“javac”表示將源代碼編

27、譯成類文件。命令“java”表示執(zhí)行一個類文件,其后跟著的“input1 input2”分別表示輸入文件和輸出文件,其中輸入文件是所要包裝的數(shù)據(jù),即上文提到的文本文件,輸出文件表示將幀封裝好之后保存到哪個文件中,文件不存在時自動創(chuàng)建,存在時會覆蓋。如圖7.2所示。圖7.2 編譯運行由于實驗只需要將數(shù)據(jù)封裝成幀,并不要求檢驗,但如果不檢驗的話,又不知道是否封裝正確,因此我另外寫了一段程序,用以檢驗幀是否封裝正確。在圖7.3中可以看到,這個類的名字為“check”,它接收一個參數(shù),用以指明所要檢驗的幀,這里是“input2”,即由framer程序產(chǎn)生的幀文件。由于input2是一個二進(jìn)制文件,因此

28、無法通過一般的編輯器將其打開以查看其中的內(nèi)容。圖7.3 檢測輸出文件第一行有64位,前56位是前同步碼,后8位是幀起始定界符。第二行是目的地址。因為沒有顯示指定目的地址,所以程序中將目的地址設(shè)為“FF:FF:FF:FF:FF:FF”。第三行是源地址。源地址為本機的MAC地址。第四行是長度,表示原輸入文件的大小。由于輸入文件input1只含有“ChenJiahui”10個字符,因此該文件的大小的確是10.接下來十行是源文件中的10個字節(jié),為了避免輸出過于冗余,所以只輸出前10個字節(jié),可以看到,每個字節(jié)均對應(yīng)正確的字符,比如“1000011”表示字符“C”。最后四行是4個字節(jié)的FCS。以上輸出中,有些字節(jié)不足8位,是因為均忽略了前導(dǎo)0。8. 心得體會幀是數(shù)據(jù)鏈路層最重要的概念。數(shù)據(jù)鏈路層屬于計算機網(wǎng)絡(luò)的低層。我們知道,兩個主機之間的數(shù)據(jù)傳輸,總是在一段一段的鏈路上傳送的,也就是說,在兩個相鄰結(jié)點之間(主機和路由器或兩個路由器之間)傳送數(shù)據(jù)是直接傳送

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論