計算機網(wǎng)絡(luò)課設(shè)-模擬Ethernet幀發(fā)送過程_第1頁
計算機網(wǎng)絡(luò)課設(shè)-模擬Ethernet幀發(fā)送過程_第2頁
計算機網(wǎng)絡(luò)課設(shè)-模擬Ethernet幀發(fā)送過程_第3頁
計算機網(wǎng)絡(luò)課設(shè)-模擬Ethernet幀發(fā)送過程_第4頁
計算機網(wǎng)絡(luò)課設(shè)-模擬Ethernet幀發(fā)送過程_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、學(xué) 號: *課 程 設(shè) 計課程名稱計算機網(wǎng)絡(luò)學(xué) 院計算機科學(xué)與技術(shù)學(xué)院專 業(yè)軟件工程專業(yè)班 級*姓 名*指導(dǎo)教師 *20142015學(xué)年 第2學(xué)期課程實踐設(shè)計任務(wù)書學(xué)生姓名: * 專業(yè)班級: * 指導(dǎo)教師: 劉東飛 工作單位: 計算機學(xué)院 題目二: 模擬Ethernet幀的發(fā)送過程 初始條件:(1)學(xué)習(xí)相關(guān)知識(2)C/C+/VC/VB/JAVA語言(3)PC機一臺要求完成的主要任務(wù): (包括課程設(shè)計工作量及其技術(shù)要求,以及說明書撰寫等具體要求)編寫程序模擬Ethernet節(jié)點的數(shù)據(jù)發(fā)送流程。具體要求:1)用兩個線程a和b來模擬Ethernet上的兩臺主機。2)用一個雙字類型變量Bus來模擬總

2、線(將其初始化為“0”,并且總線等于“0”時表示總線空閑)。3)兩個子線程向總線發(fā)送自己的數(shù)據(jù)。數(shù)據(jù)用該線程的線程號進行模擬,發(fā)送數(shù)據(jù)用線程號和Bus的“或”操作進行模擬(即BusBus|ID,ID為該線程的線程號)。4)每臺主機需向總線上成功發(fā)送10次數(shù)據(jù),如果其中某次數(shù)據(jù)發(fā)送失敗,則該線程結(jié)束。5)發(fā)送流程必須遵循CSMA/CD。隨即延遲算法中的沖突窗口取0.005。在數(shù)據(jù)發(fā)送成功(即BusID)后,報告“ID send success”,產(chǎn)生沖突(即Bus!ID)后報告“ID send conllision”,發(fā)送失敗(即沖突計數(shù)值為0)后報告“ID send failure”。隨著主機

3、發(fā)送成功次數(shù)增加,報告其已發(fā)送成功的次數(shù),如“主機A發(fā)送成功數(shù)3”。時間安排:第一、二天:查閱資料,學(xué)習(xí)算法第三、四天:編程調(diào)試第五天:書寫報告指導(dǎo)教師簽名: 年 月 日系主任(或責(zé)任教師)簽名: 年 月 日目錄一、知識背景51.網(wǎng)絡(luò)協(xié)議52.以太網(wǎng)53.CSMA/CD協(xié)議54.截斷二進制指數(shù)退避算法6二、程序設(shè)計分析71.程序框架82.環(huán)境介紹83.數(shù)據(jù)結(jié)構(gòu)94.子線程95.獲得子線程ID96.發(fā)送數(shù)據(jù)10三、實驗截圖11四、課設(shè)總結(jié)13五、程序清單13一、 知識背景1. 網(wǎng)絡(luò)協(xié)議開放系統(tǒng)互連參考模型 (Open System Interconnect 簡稱OSI)是國際標準化組織(ISO)

4、和國際電報電話咨詢委員會(CCITT)聯(lián)合制定的開放系統(tǒng)互連參考模型,為開放式互連信息系統(tǒng)提供了一種功能結(jié)構(gòu)的框架。它從低到高分別是:物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會話層、表示層和應(yīng)用層TCP/IP協(xié)議定義了一個在因特網(wǎng)上 傳輸?shù)陌?,稱為IP數(shù)據(jù)報(IP Datagram)。這是一個與硬件無關(guān)的虛擬包, 由首部和數(shù)據(jù)兩部分組成,其格式如圖所示。首部的前一部分是固定長度,共20字節(jié),是所有IP數(shù)據(jù)報必須具有的。在首部的固定部分的后面是一些可選字段, 其長度是可變的。首部中的源地址和目的地址都是IP協(xié)議地址。2. 以太網(wǎng)以太網(wǎng)(Ethernet)指的是由Xerox公司創(chuàng)建并由Xerox、In

5、tel和DEC公司聯(lián)合開發(fā)的基帶局域網(wǎng)規(guī)范,是當(dāng)今現(xiàn)有局域網(wǎng)采用的最通用的通信協(xié)議標準。以太網(wǎng)絡(luò)使用CSMA/CD(載波監(jiān)聽多路訪問及沖突檢測)技術(shù),并以10M/S的速率運行在多種類型的電纜上。以太網(wǎng)與IEEE802.3系列標準相類似。包括標準的以太網(wǎng)(10Mbit/s)、快速以太網(wǎng)(100Mbit/s)和10G(10Gbit/s)以太網(wǎng)。它們都符合IEEE802.33. CSMA/CD協(xié)議CSMA/CD(Carrier Sense Multiple Access with Collision Detection)即帶沖突檢測的載波監(jiān)聽多路訪問技術(shù)。在傳統(tǒng)的共享以太網(wǎng)中,所有的節(jié)點共享傳輸介質(zhì)

6、。如何保證傳輸介質(zhì)有序、高效地為許多節(jié)點提供傳輸服務(wù),就是以太網(wǎng)的介質(zhì)訪問控制協(xié)議要解決的問題CSMA/CD是一種爭用型的介質(zhì)訪問控制協(xié)議。它起源于美國夏威夷大學(xué)開發(fā)的ALOHA網(wǎng)所采用的爭用型協(xié)議,并進行了改進,使之具有比ALOHA協(xié)議更高的介質(zhì)利用率。主要應(yīng)用于現(xiàn)場總線Ethernet中。另一個改進是,對于每一個站而言,一旦它檢測到有沖突,它就放棄它當(dāng)前的傳送任務(wù)。換句話說,如果兩個站都檢測到信道是空閑的,并且同時開始傳送數(shù)據(jù),則它們幾乎立刻就會檢測到有沖突發(fā)生。它們不應(yīng)該再繼續(xù)傳送它們的幀,因為這樣只會產(chǎn)生垃圾而已;相反一旦檢測到?jīng)_突之后,它們應(yīng)該立即停止傳送數(shù)據(jù)??焖俚亟K止被損壞的幀可

7、以節(jié)省時間和帶寬。CSMA/CD控制方式的優(yōu)點是:原理比較簡單,技術(shù)上易實現(xiàn),網(wǎng)絡(luò)中各工作站處于平等地位 ,不需集中控制,不提供優(yōu)先級控制。但在網(wǎng)絡(luò)負載增大時,發(fā)送時間增長,發(fā)送效率急劇下降。CSMA/CD應(yīng)用在 OSI 的第二層數(shù)據(jù)鏈路層它的工作原理是: 發(fā)送數(shù)據(jù)前 先偵聽信道是否空閑 ,若空閑,則立即發(fā)送數(shù)據(jù)。若信道忙碌,則等待一段時間至信道中的信息傳輸結(jié)束后再發(fā)送數(shù)據(jù);若在上一段信息發(fā)送結(jié)束后,同時有兩個或兩個以上的節(jié)點都提出發(fā)送請求,則判定為沖突。若偵聽到?jīng)_突,則立即停止發(fā)送數(shù)據(jù),等待一段隨機時間,再重新嘗試。其原理簡單總結(jié)為:先聽后發(fā),邊發(fā)邊聽,沖突停發(fā),隨機延遲后重發(fā)4. 截斷二進

8、制指數(shù)退避算法截斷二指數(shù)指數(shù)退避算法并不復(fù)雜。具體的退避算法如下:1. 確定基本退避時間,它就是爭用期。以太網(wǎng)把爭用期定為51.2us。對于10Mb/s以太網(wǎng),在爭用期內(nèi)可發(fā)送512bit,即64字節(jié)。也可以說爭用期是512比特時間。1比特時間就是發(fā)送1比特所需要的時間。所以這種時間單位與數(shù)據(jù)率密切相關(guān)。2. 從離散的整數(shù)集合0,1,中隨機取出一個數(shù),記為r。重傳應(yīng)推后的時間就是r倍的爭用期。上面的參數(shù)k按下面的公式計算:k=Min重傳次數(shù),10可見當(dāng)重傳次數(shù)不超過10時,參數(shù)k等于重傳次數(shù);但當(dāng)重傳次數(shù)超過10時,k就不在增大而一直等于10。3. 當(dāng)重傳達16次仍不能成功時(這表明同時打算發(fā)

9、送的數(shù)據(jù)站太多,以致連續(xù)發(fā)生沖突),則丟棄該,并向高層報告。例如,在第1次重傳時,k=1,隨機數(shù)r從整數(shù)0,1中選一個數(shù)。因此重傳推遲的時間是0或爭用期,在這兩個時間中隨機選擇一個。若再發(fā)生碰撞,則重傳時,k=2,隨機數(shù)r就從整數(shù)0,1,2,3中選一個數(shù)。因此重傳推遲的時間是在0,2,4和6 這4個時間中隨機抽取一個。同樣,若在發(fā)生碰撞,則重傳時k=3,隨機數(shù)r就從整數(shù)0,1,2,3,4,5,6,7中選一個數(shù)。以此類推。若連續(xù)多次發(fā)生沖突,就表明可能有較多的站參與爭用信道。但使用退避算法可使重傳需要推遲的平均時間隨重傳次數(shù)而增大(這也稱為動態(tài)退避),因而減小發(fā)生碰撞的概率,有利于整個系統(tǒng)的穩(wěn)定

10、。我們還注意到,適配器每發(fā)送一個新的幀,就要執(zhí)行一次CMSA/CD算法。適配器對過去發(fā)生過的碰撞并無記憶功能。因此,當(dāng)好幾個適配器正在執(zhí)行指數(shù)退避算法時,很可能有某一個適配器發(fā)送的新幀能夠碰巧立即成功插入到信道中,得到了發(fā)送權(quán)。我們可以看出,以太網(wǎng)在發(fā)送數(shù)據(jù)時,如果幀的前64字節(jié)之內(nèi)沒有發(fā)生沖突,那么后續(xù)的數(shù)據(jù)就不會發(fā)生沖突。換句話 說,如果發(fā)生沖突就立即中止發(fā)送,這時已經(jīng)發(fā)送出去的數(shù)據(jù)一定小于64字節(jié),因此以太網(wǎng)規(guī)定了最短有效的幀長為64字節(jié),凡長度小于64字節(jié)的幀都是由于 沖突而異常中止的無效幀。收到了這種無效幀就應(yīng)當(dāng)立即丟棄。二、 程序設(shè)計分析1. 程序框架2. 環(huán)境介紹操作系統(tǒng) Ubu

11、ntu 14.04G+ 4.4.33. 數(shù)據(jù)結(jié)構(gòu)wchar_t BUS='0' /雙字類型變量Bus來模擬總線const int conflictmax=16;const int conflictwindow=0.005;使用wchar_t 來表示雙字節(jié)。而在C+中推薦使用const來代替define4. 子線程std:thread t1(call_thread,'A');std:thread t2(call_thread,'B');t2.join();t1.join(); C+11開始支持多線程編程,之前多線程編程都需要系統(tǒng)的支持,在不同的系統(tǒng)

12、下創(chuàng)建線程需要不同的API如 pthread_create(),Createthread(),beginthread()等,使用起來都比較復(fù)雜,C+11提供了新頭文 件<thread>、<mutex>、<atomic>、<future>等用于支持多線程。在主函數(shù)中使用thread的構(gòu)造函數(shù)可以調(diào)用子線程并且傳參數(shù)。主線程調(diào)用thread對象t1、t2的join函數(shù)等待線程執(zhí)行結(jié)束。5. 獲得子線程IDstd:stringstream ss;ss << std:this_thread:get_id();wchar_t Pid = std

13、:stoull(ss.str();在C+11中的獲取線程ID方式與pthread中的略微不同,我們使用的方法是在子線程中,使用std:this_thread:get_id()來獲取子線程ID。但此時獲取到的ID是一個hashmap。我們可以將其轉(zhuǎn)化為字符串,再由字符串轉(zhuǎn)化為ID值6. 發(fā)送數(shù)據(jù)while(true) if(BUS='0')/當(dāng)總線為空的時候,可以發(fā)送數(shù)據(jù) BUS|=Pid; sleep(2); if(BUS=Pid) printf("ID %s send successn",ss.str().c_str(); printf("主機%

14、c發(fā)送成功數(shù)%dn",name,SuccessCounter); BUS=0; RepeatCounter=1; SuccessCounter+; if(SuccessCounter>10) return; else RepeatCounter+; /重發(fā)次數(shù)加一 if(RepeatCounter>=16) printf("ID %s send failedn",ss.str().c_str(); return; else /使用截斷二進制退避算法 uniform_int_distribution<unsigned> randnum(0,p

15、ow(2,min(RepeatCounter,10)-1); default_random_engine e; printf("ID %s send conllisionn",ss.str().c_str(); auto sleeptime=randnum(e); sleep(sleeptime); continue; 在此函數(shù)中 如果BuS=0 的時候才能執(zhí)行,否則一直循環(huán)。使用位運算BUS|=Pid模擬線路上的電壓變化。使用uniform_int_distribution需要引入<random>頭文件,這個是C+11中新的隨機數(shù)方式,在之前都是使用C語言中的

16、方式。而是用這種方式,出現(xiàn)的rand數(shù)是“真隨機數(shù)”,而非C語言中的假隨機數(shù)。使用randnum(0,pow(2,min(RepeatCounter,10)-1)來實現(xiàn)截斷二進制指數(shù)退避算法。如果RepeatCounter>=16,則放棄發(fā)送此包。注意,此處使用printf而非cout,因為cout不是線程安全的,易出現(xiàn)字符串打斷現(xiàn)象。而printf是線程安全的。可以直接使用。在編譯這個程序的時候,需要使用g+ -std=c+0x pthread main.cpp其中std=c+0x是指使用的是C+11的標準。 pthread 是指需要引入pthread 頭文件。然后在同文件夾下會生成a

17、.out的程序。使用./a.out即可運行程序。 三、 實驗截圖四、 課設(shè)總結(jié)這個課設(shè)的題目我非常喜歡,看似簡單的題目實際包含了很多東西:多線程、CSMA/CD協(xié)議、以及對截斷二進制指數(shù)退避算法的理解。在我做這個的時候,實際上之前很少使用多線程技術(shù),尤其是C+11這種網(wǎng)上資料還比較少的多線程庫。在做這個的時候,我分別參考了C+標準庫-自學(xué)教程與參考手冊中對thread庫的說明,以及深入理解計算機系統(tǒng)中并發(fā)編程部分對pthread的講解。感覺收獲很大。在做這個課設(shè)的時候,我專門把開發(fā)環(huán)境搬到了Linux上面去做。之前一直很少使用Ubuntu,但這次卻從搭建環(huán)境,編譯程序各部分,對Linux有了一

18、個初步的認識。以后也會將開發(fā)環(huán)境越來越多的向Linux下遷移。在學(xué)習(xí)理論知識的時候,雖然對這部分很熟悉。但總感覺缺少了些什么,做了這個題目之后才有了更深的體會和理解。明白了這些協(xié)議的重要性。受益匪淺!五、 程序清單#include <iostream>#include <thread>#include <random>#include <cmath>#include <unistd.h>#include <sstream>#include <cstdio>using namespace std;wchar_t

19、BUS='0' /雙字類型變量Bus來模擬總線const int conflictmax=16;const int conflictwindow=0.005;void call_thread(char name) /auto Pid=this_thread:get_id(); int RepeatCounter=1;/記錄目前是第幾次發(fā)送 int SuccessCounter=1;/記錄成功發(fā)送的個數(shù),最大為1 /cout<<Pid.hash()<<"n"<<endl; std:stringstream ss; ss << std:this_thread:get_id(); wchar_t Pid = std:stoull(ss.str(); while(true) if(BUS='0')/當(dāng)總線為空的時候,可以發(fā)送數(shù)據(jù) BUS|=Pid; sleep(2); if(BUS=Pid) printf("ID

溫馨提示

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

最新文檔

評論

0/150

提交評論