計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)[模擬Ethernet幀發(fā)送過(guò)程]_第1頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)[模擬Ethernet幀發(fā)送過(guò)程]_第2頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)[模擬Ethernet幀發(fā)送過(guò)程]_第3頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)[模擬Ethernet幀發(fā)送過(guò)程]_第4頁(yè)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)[模擬Ethernet幀發(fā)送過(guò)程]_第5頁(yè)
已閱讀5頁(yè),還剩10頁(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、 芙蓉學(xué)院 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)報(bào)告 課 題: 模擬Ethernet幀的發(fā)送過(guò)程 姓 名: 劉珊岑 學(xué) 號(hào): 12170106 專業(yè)班級(jí): 計(jì)算機(jī)科學(xué)與技術(shù) 1201 指導(dǎo)教師: 聶方彥 設(shè)計(jì)時(shí)間: 2015年上學(xué)期 地 點(diǎn): E3-A501 評(píng)閱意見(jiàn):評(píng)定成績(jī): 指導(dǎo)老師簽名: 年 月 日目錄一、課程設(shè)計(jì)目的和意義1二、課程設(shè)計(jì)題目描述和要求1三、可行性分析21.技術(shù)可行性22.功能分析2四、幀結(jié)構(gòu)分析2幀的介紹2五. Ethernet幀的發(fā)送與接收流程41 .Ethernet幀的發(fā)送流程42 Ethernet幀的接收流程4六.詳細(xì)設(shè)計(jì)61.設(shè)計(jì)中的重點(diǎn)及難點(diǎn)62.核心代碼73.程序流程74.

2、完整程序8七.運(yùn)行結(jié)果11八.總結(jié)13九.參考文獻(xiàn)13 一、課程設(shè)計(jì)目的和意義幀是在數(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)題處理的一般方法。二、課程設(shè)計(jì)題目描述和要求題目:編寫(xiě)程序模擬Ethernet結(jié)點(diǎn)的數(shù)據(jù)發(fā)送流程設(shè)計(jì)要求:(1)用兩個(gè)線程a,b來(lái)模擬Ethernet上的兩臺(tái)主機(jī)。(2)用一個(gè)雙字類型變量Bus來(lái)模擬總線(將其初始化為“/0”,并且

3、總線等于“/0”時(shí)表示總線空閑)。(3)兩個(gè)子線程向總線發(fā)送自己的數(shù)據(jù)。數(shù)據(jù)用該線程的線程信號(hào)進(jìn)行模擬,發(fā)送數(shù)據(jù)用線程號(hào)和Bus的“或”操作進(jìn)行模擬(即Bus=Bus|ID,ID為該線程的線程號(hào))。(4)每臺(tái)主機(jī)須向總線成功發(fā)送10次數(shù)據(jù),如果其中某次數(shù)據(jù)發(fā)送失敗,則該線程結(jié)束。(5)發(fā)送流程須遵循CSMA/CD。隨機(jī)延遲算法中的沖突窗口取0.005。在數(shù)據(jù)發(fā)送成功(即Bus=ID)后,報(bào)告“ID send success”,產(chǎn)生沖突(即Bus!=ID)后,報(bào)告“ID send collision”,發(fā)送失?。礇_突計(jì)數(shù)器值為0)后報(bào)告“ID send failure”。隨著主機(jī)發(fā)送成功次數(shù)的

4、增加,報(bào)告其已發(fā)送成功的次數(shù),如“主機(jī)A發(fā)送成功次數(shù)=3”。 三、可行性分析1.技術(shù)可行性 技術(shù)可行性分析包括:風(fēng)險(xiǎn)分析、資源分析和技術(shù)分析。風(fēng)險(xiǎn)分析的任務(wù)是,在給定的約束條件下,判斷能否設(shè)計(jì)并實(shí)現(xiàn)系統(tǒng)所需功能和性能。資源分析的任務(wù)是,論證是否具有系統(tǒng)開(kāi)發(fā)所需的各類人員(管理人員和各類專業(yè)技術(shù)人員)、軟件、硬件資源和工作環(huán)境等。技術(shù)分析的任務(wù)是,論證當(dāng)前的科學(xué)技術(shù)是否支持系統(tǒng)開(kāi)發(fā)的全過(guò)程。其中最主要的是分析技術(shù)條件是否能順利完成開(kāi)發(fā)工作,硬、軟件能否滿足開(kāi)發(fā)者的需要等。2.功能分析基本功能1.在一臺(tái)計(jì)算機(jī)上實(shí)現(xiàn),用多個(gè)程序或線程來(lái)模擬多個(gè)計(jì)算機(jī)2.使用一個(gè)共享數(shù)據(jù)區(qū)來(lái)模擬總線3.模擬實(shí)現(xiàn)載波監(jiān)

5、聽(tīng)的過(guò)程 4. 模擬實(shí)現(xiàn)發(fā)生沖突的過(guò)程和沖突的處理機(jī)制四、幀結(jié)構(gòu)分析幀的介紹術(shù)語(yǔ)“幀”來(lái)源于串行線路上的通信。其中,發(fā)送者在發(fā)送數(shù)據(jù)的前后各添加特殊的字符,使它們成為一個(gè)幀。Ethernet從某種程序上可以被看作是機(jī)器這間的數(shù)據(jù)鏈路層連接。首先我們來(lái)認(rèn)識(shí)一下Ethernet幀結(jié)構(gòu),Ethernet V2.0規(guī)范和IEEE802.3標(biāo)準(zhǔn)中的Ethernet幀結(jié)構(gòu)有一些差別,這里我們按802.3標(biāo)準(zhǔn)的幀結(jié)構(gòu)進(jìn)行討論,圖一給出了Ethernet幀結(jié)構(gòu)圖。前導(dǎo)碼幀前定界符目的地址源地址長(zhǎng)度字段數(shù)據(jù)字段校驗(yàn)字段(7B)(1B)(2/6B)(2/6B)(2B)(長(zhǎng)度可變)(4B)圖一 Ethernet幀結(jié)

6、構(gòu)如圖一所示,802.3標(biāo)準(zhǔn)的Ethernet幀結(jié)構(gòu)由6部分組成。(1)前導(dǎo)碼與幀前定界符字段前導(dǎo)碼由56位(7B)的1010101101010位序列組成。幀前定界符可以視為前導(dǎo)碼的延續(xù)。1B的幀前定界符結(jié)構(gòu)為10101011。如果將前導(dǎo)碼與幀定界符一起看,那么在62位1010101010位序列之后出現(xiàn)11。在11之后是Ethernet幀的目的地址字段。前導(dǎo)碼與幀前定界符主要是保證接收同步,這8B接收后不需要保留,也不記入幀頭長(zhǎng)度中。(2)目的地址和源地址目的地址(DA)與法制地址(SA)分別表示幀的接收結(jié)點(diǎn)地址與發(fā)送結(jié)點(diǎn)的硬件地址。l 在Ethernet幀中,目的地址和法制地址字段長(zhǎng)度可以是

7、2B或6B。目前的Ethernet都使用6B(即48位)長(zhǎng)度的地址。l Ethernet幀的目的地址可以是單播地址(unicast address)、多播地址(multicast address)與廣播地址(broadcast address),目的地址的第一位為0表示單播地址,為1表示多播地址,目的地址為全1表示廣播地址。(3)長(zhǎng)度字段8023標(biāo)準(zhǔn)中的幀用2B定義數(shù)據(jù)字段包含的字節(jié)數(shù)。協(xié)議規(guī)定,幀數(shù)據(jù)的最小長(zhǎng)度為46B,最大長(zhǎng)度為1500B。設(shè)置最小幀長(zhǎng)度的目的是使每個(gè)接收結(jié)點(diǎn)能夠有足夠的時(shí)間檢測(cè)到?jīng)_突。(4)數(shù)據(jù)字段幀數(shù)據(jù)字段的最小長(zhǎng)度為46B。如果幀的LLC數(shù)據(jù)少于46B,則應(yīng)將數(shù)據(jù)字段

8、填充至46B。填充字符是任意的,不計(jì)入長(zhǎng)度字段值中。(5)檢驗(yàn)字段幀校驗(yàn)字段(FCS)采用32位的CRC校驗(yàn)。校驗(yàn)的范圍包括目的地址字段、源地址字段、長(zhǎng)度字段、LLC數(shù)據(jù)字段。此處,為了簡(jiǎn)便起見(jiàn),采用8位的CRC校驗(yàn)。CRC校驗(yàn)的生成多項(xiàng)式為:G(x)= x8+ x2+x+1 某些幀結(jié)構(gòu)中還會(huì)包括幀類型字段,用來(lái)識(shí)別些帖所承載的數(shù)據(jù)的類型。當(dāng)一個(gè)幀到達(dá)指定的計(jì)算機(jī)時(shí),操作系統(tǒng)根據(jù)幀類型決定用哪個(gè)協(xié)議軟件模塊對(duì)它進(jìn)行處理。自識(shí)別幀的主要優(yōu)點(diǎn)是,可以在同一物理網(wǎng)絡(luò)中使用多個(gè)協(xié)議而互不干擾。五. Ethernet幀的發(fā)送與接收流程1 .Ethernet幀的發(fā)送流程1)載波偵聽(tīng)過(guò)程。Ethernet中

9、每個(gè)結(jié)點(diǎn)利用總線發(fā)送數(shù)據(jù),總線是每個(gè)結(jié)點(diǎn)共享的公共傳輸介質(zhì)。所以結(jié)點(diǎn)在發(fā)送一個(gè)幀前,必須偵聽(tīng)總線是否空閑。由于Ethernet的數(shù)據(jù)采用曼徹斯特編碼方式,所以可以通過(guò)判斷總線電平是否跳變來(lái)確定總線是否空閑。若總線空閑,就可以啟動(dòng)發(fā)送,否則繼續(xù)偵聽(tīng)。2)沖突檢測(cè)。在數(shù)據(jù)發(fā)送過(guò)程中,可能會(huì)產(chǎn)生沖突(沖突是指總線上同時(shí)出現(xiàn)兩個(gè)或兩個(gè)以上的發(fā)送信號(hào),他們疊加后的信號(hào)波形與任何發(fā)送結(jié)點(diǎn)的輸出波形都不相同)。因?yàn)榭赡苡卸鄠€(gè)主機(jī)都在偵聽(tīng)總線,當(dāng)它們偵聽(tīng)到總線空閑時(shí),就會(huì)往總線上發(fā)送數(shù)據(jù)。所以在發(fā)送數(shù)據(jù)的過(guò)程中,也應(yīng)該進(jìn)行沖突檢測(cè),只要發(fā)現(xiàn)沖突就應(yīng)該立即停止發(fā)送數(shù)據(jù)。3)隨即延遲后重發(fā)。在檢測(cè)到?jīng)_突、停止發(fā)送

10、后,結(jié)點(diǎn)進(jìn)行隨機(jī)延遲后重發(fā)。若發(fā)16次后還沒(méi)成功,則宣告發(fā)送失敗,取消該幀的發(fā)送。隨機(jī)延遲的算法一般采用截?cái)嗟亩M(jìn)制指數(shù)退避算法。當(dāng)出現(xiàn)線路沖突時(shí),如果沖突的各站點(diǎn)都采用同樣的退避間隔時(shí)間,則很容易產(chǎn)生二次、三次的碰撞。因此,要求各個(gè)站點(diǎn)的退避間隔時(shí)間具有差異性。這要求通過(guò)退避算法來(lái)實(shí)現(xiàn)。當(dāng)一個(gè)站點(diǎn)發(fā)現(xiàn)線路忙時(shí),要等待一個(gè)延時(shí)時(shí)間M,然后再進(jìn)行偵聽(tīng)工作。延時(shí)時(shí)間M由以下算法決定:M=2k*R*a。其中a為沖突窗口值(沖突窗口為總線最大長(zhǎng)度和電磁波在介質(zhì)中傳播速度比值的2倍),R為隨機(jī)數(shù),k的取值為k=min(n,16),n為該幀已被發(fā)送的次數(shù)。圖1給出了Ethernet幀的發(fā)送流程。2. Et

11、hernet幀的接收流程幀的接收流程大致可以分為以下三個(gè)步驟:1)檢查是否發(fā)生沖突,若發(fā)生沖突,則丟棄該幀;若沒(méi)有沖突,進(jìn)入下一步。2)檢查該幀的目的地址看是否可以接收該幀,若可以接收,則進(jìn)入下一步。3)檢查CRC檢驗(yàn)和LLC數(shù)據(jù)長(zhǎng)度。若都正確,接受該幀,否則丟棄。YNYY發(fā)送幀裝配幀總線忙啟動(dòng)發(fā)送沖突?發(fā)送完成?發(fā)送成功沖突加強(qiáng)沖突次數(shù)加1等待后退延遲時(shí)間計(jì)算后退延遲發(fā)送失敗沖突次數(shù)>16?YNNN圖1 Ethernet幀的發(fā)送流程六.詳細(xì)設(shè)計(jì)1.設(shè)計(jì)中的重點(diǎn)及難點(diǎn)1)模擬沖突過(guò)程,在這個(gè)程序中不要使用任何線程同步機(jī)制。2)若程序中不能模擬出沖突,可以在某些地方加入延時(shí)。2.核心代碼i

12、nt i=0; /發(fā)送成功次數(shù)int CollisionCounter=16; /沖突計(jì)數(shù)器初始值為16double CollisionWindow=0.005; /沖突窗口值取值0.005int randNum=rand()%3; /隨機(jī)數(shù)loop: if(Bus=0) /總線空閑 Bus=Bus|ID1; /模擬發(fā)送包 Sleep(12); if (Bus=ID1) /無(wú)沖突 printf("%d Send Successnn",ID1); /發(fā)送成功 Bus=0; /內(nèi)存清零 CollisionCounter=16; /復(fù)原沖突計(jì)數(shù)器 Sleep(rand()%10)

13、; /隨即延時(shí) i+; printf("主機(jī)a發(fā)送成功次數(shù)=%dnn",i); if(i<10) goto loop; /發(fā)送次數(shù)不夠10次,開(kāi)始下一次發(fā)送 else printf("%d Send Collisionnn",ID1); /發(fā)生沖突 CollisionCounter- ; Bus=0 ; if(CollisionCounter>0) /隨即延遲重發(fā),延遲算法用截?cái)嗟亩M(jìn)制指數(shù)退避算法 Sleep(randNum*(int)pow(2,(CollisionCounter>10)?10: CollisionCounter)*

14、CollisionWindow); goto loop; /下一次嘗試發(fā)送 else printf("%d Send Failurenn", ID1 ); else /總線忙 goto loop; /繼續(xù)載波偵聽(tīng) return 0;3.程序流程圖2 主程序流程圖開(kāi)始啟動(dòng)線程A啟動(dòng)線程B結(jié)束4.完整程序/注意:編譯時(shí)需設(shè)置工程屬性(菜單中工程設(shè)置使用MFC作為靜態(tài)鏈接庫(kù))#include "cmath" /#include "afxwin.h" /#include <iostream> /#include <conio

15、.h> /CWinThread * thread1, * thread2; /定義2個(gè)線程對(duì)象,分別代表a,bDWORD ID1, ID2, Bus = 0; /2線程ID,總線標(biāo)志UINT aThread(LPVOID pParam); /線程a,代表主機(jī)aUINT bThread(LPVOID pParam); /線程b,代表主機(jī)busing namespace std;int main(int argc, char* argv, char * envp)int nRetCode = 0;thread1 = :AfxBeginThread(aThread, NULL); /啟動(dòng)線程a

16、ID1 = thread1->m_nThreadID;thread2 = :AfxBeginThread(bThread, NULL); /啟動(dòng)線程bID2 = thread2->m_nThreadID;getch(); /主線程等待,按任意鍵退出程序return nRetCode;UINT aThread(LPVOID pParam)int i=0; /發(fā)送成功次數(shù)int CollisionCounter=2; /沖突計(jì)數(shù)器初始值為16double CollisionWindow=0.000001; /沖突窗口值取值0.005int randNum=rand()%3; /隨機(jī)數(shù)w

17、hile(1)if(Bus=0) /總線空閑Bus=Bus|ID1; /模擬發(fā)送包Sleep(12);if (Bus=ID1) /無(wú)沖突 printf("%d Send Successnn",ID1); /發(fā)送成功 Bus=0; /內(nèi)存清零 CollisionCounter=2; /復(fù)原沖突計(jì)數(shù)器 Sleep(rand()%10); /隨即延時(shí) i+; printf("主機(jī)a發(fā)送成功次數(shù)=%dnn",i); if(i>=10) break;/發(fā)送次數(shù)不夠10次,開(kāi)始下一次發(fā)送 elseprintf("%d Send Collisionnn

18、",ID1); /發(fā)生沖突 CollisionCounter-; /沖突次數(shù)加1 Bus=0; /沖突加強(qiáng) 停止發(fā)送數(shù)據(jù) 等待下面延時(shí)if(CollisionCounter>0) /隨即延遲重發(fā),延遲算法用截?cái)嗟亩M(jìn)制指數(shù)退避算法Sleep(randNum*(int)pow(2,(CollisionCounter>10)?10: CollisionCounter)*CollisionWindow); continue; /下一次嘗試發(fā)送elseprintf("%d Send Failurenn",ID1); return 0;UINT bThread(

19、LPVOID pParam)int i=0; /發(fā)送成功次數(shù)int CollisionCounter=16; /沖突計(jì)數(shù)器初始值為16double CollisionWindow=0.005; /沖突窗口值取值0.005int randNum=rand()%3; /隨機(jī)數(shù)while(1)if(Bus=0) /總線空閑 Bus=Bus|ID2; /模擬發(fā)送包Sleep(12);if (Bus=ID2) /無(wú)沖突Sleep(rand()%10); printf("%d Send Successnn",ID2); /發(fā)送成功 Bus=0; /內(nèi)存清零 CollisionCounter=16; /復(fù)原沖突計(jì)數(shù)器 Sleep(rand()%10); /隨即延時(shí) i+; printf("主機(jī)b發(fā)送成功次數(shù)=%dnn",i); if(i>=10) break;/發(fā)送次數(shù)不夠10次,開(kāi)始下一次發(fā)送 elseprintf("%d Send Collisionnn",ID2); /發(fā)生沖突 CollisionCounter-; /沖突次數(shù)加1 Bus=0; /沖突加強(qiáng) 停止發(fā)送數(shù)據(jù) 等待下面延時(shí)if(Collision

溫馨提示

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