計算機(jī)網(wǎng)絡(luò)選擇重傳協(xié)議實驗報告_第1頁
計算機(jī)網(wǎng)絡(luò)選擇重傳協(xié)議實驗報告_第2頁
計算機(jī)網(wǎng)絡(luò)選擇重傳協(xié)議實驗報告_第3頁
計算機(jī)網(wǎng)絡(luò)選擇重傳協(xié)議實驗報告_第4頁
計算機(jī)網(wǎng)絡(luò)選擇重傳協(xié)議實驗報告_第5頁
已閱讀5頁,還剩46頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

計算機(jī)網(wǎng)絡(luò)選擇重傳協(xié)議實驗報告《計算機(jī)網(wǎng)絡(luò)》選擇重傳協(xié)議實驗報告的幀內(nèi)容轉(zhuǎn)換而來;len,整型,為幀的當(dāng)前長度。staticsend_frame_(Ucharfk,Ucharnext_frame,Ucharframe_expected,Packetout_buf[])作用:構(gòu)造一個幀,并將其發(fā)送。參數(shù):fk,字節(jié)類型,為幀的內(nèi)容;next_frame,字節(jié)類型,為幀的編號;frame_expected,字節(jié)類型,為希望收到的幀的編號;out_buf,二維字節(jié)數(shù)組,為緩沖區(qū)。intmain(intargc,char*argv[])作用:主程式,包含選擇重傳協(xié)議的算法流程。參數(shù):argc,整型,表示命令行參數(shù)的個數(shù);argv,二維字符數(shù)組,表示參數(shù)內(nèi)容。算法流程:StartStartSSwctihAcktimeoutDatatimeoutDatacomingNetworklayerreadyAcktimeoutDatatimeoutDatacomingNetworklayerreadyPPhy-layerreadyMakeackframeResetack_numCountcscFMakeackframeResetack_numCountcscFindframe-endGetpacket()SendthisframeNext_send=ack_expectedGet_num>0SSendthisframeNext_send=ack_expectedGet_num>0Send_data()Csc==0?Csc==0? YPhyready?breakPhyready?Phyready?breakPhyready?SendframeN YSendframe NS_seq=frameExpect?S_seq=frameExpect?Y YSendframePhy_ready=1SSendframePhy_ready=1Sentframe Y NPut_packet()Put_packet() NGet_num=nbufferedbreakBreakGet_num=nbufferedbreakBreakDealwithacknumberDealwithacknumberbreakbreakIn_lenIn_len=1Nbuffered<max_seqNbuffered<max_seqDisablenetworkDisablenetworkEnablenetwork(a)物理層:為數(shù)據(jù)鏈路層提供的服務(wù)為8000bps,270ms傳播延時,10-5誤碼率的字節(jié)流傳輸通道。為了仿真實現(xiàn)上述服務(wù)質(zhì)量的信道,利用在同一臺計算機(jī)上TCPSocket完成兩個站點之間的通信。由于同一臺計算機(jī)上TCP通信傳播時延短、傳播速度快、沒有誤碼,物理層仿真程序在發(fā)送端利用“令牌桶”算法限制發(fā)送速率以仿真8000bps線路;在接收端誤碼插入模塊利用一個偽隨機(jī)數(shù)“隨機(jī)地”篡改從TCP收到的數(shù)據(jù),使得所接收到的每個比特出現(xiàn)差錯的概率為10-5;接收到的數(shù)據(jù)緩沖后延時270ms才提交給數(shù)據(jù)鏈路層程序,以仿真信道的傳播時延特性。為了簡化程序,省略了成幀功能,數(shù)據(jù)鏈路層利用接口函數(shù)send_frame()和recv_frame()發(fā)送和接收一幀。(b)數(shù)據(jù)鏈路層:發(fā)送方和接收方都維持一個窗口,窗口內(nèi)部為可以接受的序列號。接收到的數(shù)據(jù)包被緩存起來,當(dāng)按正確的順序接收完畢后再提交給網(wǎng)絡(luò)層。ACK信息通過數(shù)據(jù)幀捎帶確認(rèn)的方式傳遞,若遇到長時間無數(shù)據(jù)幀發(fā)送,則產(chǎn)生ACK超時事件(ACK_TIMEOUT),主動發(fā)送空的ACK幀。若長時間未收到ACK信息,則產(chǎn)生數(shù)據(jù)幀超時事件(DATA_TIMEOUT),發(fā)送方自動重傳未確認(rèn)幀;當(dāng)出現(xiàn)幀丟失或校驗錯誤時,接收方會主動發(fā)送NAK幀提示發(fā)送方立即重傳。數(shù)據(jù)鏈路層通過物理層提供的函數(shù)來利用物理層提供的服務(wù)。通過get_packet()函數(shù)從網(wǎng)絡(luò)層得到一個分組;當(dāng)數(shù)據(jù)鏈路層成功接收到一個分組后,通過put_packet()函數(shù)提交給網(wǎng)絡(luò)層。(c)網(wǎng)絡(luò)層:利用數(shù)據(jù)鏈路層提供的“可靠的分組傳輸”服務(wù),在站點A與站點B之間交換長度固定為256字節(jié)的數(shù)據(jù)分組。網(wǎng)絡(luò)層把產(chǎn)生的分組交付數(shù)據(jù)鏈路層,并接受數(shù)據(jù)鏈路層提交來的數(shù)據(jù)分組。3.結(jié)果分析(1)描述你所實現(xiàn)的協(xié)議軟件是否實現(xiàn)了有誤碼信道環(huán)境中無差錯傳輸功能。我們的協(xié)議成功實現(xiàn)了有誤碼信道環(huán)境中無差錯傳輸功能。如果收到一個損壞幀,在尚未發(fā)送否認(rèn)確定的情況下,則捎帶發(fā)送否定確認(rèn)。并打印錯誤報告。如果已發(fā)送否定確認(rèn),則只打印錯誤報告,不重復(fù)發(fā)送否定確認(rèn)。(2)程序的健壯性如何,能否可靠地長時間運行。 我們的程序成功連續(xù)運行半小時以上,并取得預(yù)定效果。具有足夠的健壯性。(3)協(xié)議參數(shù)的選?。夯瑒哟翱诘拇笮。貍鞫〞r器的時限,ACK搭載定時器的時限,這些參數(shù)是怎樣確定的?根據(jù)信道特性數(shù)據(jù),分組層分組的大小,以及你的滑動窗口機(jī)制,給出定量分析,詳細(xì)列舉出選擇這些參數(shù)值的具體原因。我們物理層提供的是字節(jié)流傳輸服務(wù),使用字節(jié)填充技術(shù)成幀,分組長度為256字節(jié)。為了避免在有出錯幀接收方要求重傳時產(chǎn)生二義性,我們定義窗口大小為2^n-1,并且雙方的窗口大小均為((MAX_SEQ+1)/2),這樣的大小足夠使用又不會有過于富余的空間浪費?;瑒哟翱诘拇笮≈苯由婕暗叫诺览寐屎蛿?shù)據(jù)擁塞問題,若太大,數(shù)據(jù)發(fā)送過快將產(chǎn)生擁塞導(dǎo)致數(shù)據(jù)丟失,出錯率增加,若太小則信道利用率降低,通過實驗測試合適的窗口大小為16。重傳定時器時限涉及到重傳的響應(yīng)時間,太小會導(dǎo)致頻繁重傳,太大則重傳等待時間太久,經(jīng)過我們的試驗測試,選取重傳定時器時限定為3000毫秒,ACK搭載定時器的時限為1000毫秒最合適。(4)理論分析:根據(jù)所設(shè)計的滑動窗口工作機(jī)制(Go-Back-N或者選擇重傳),推導(dǎo)出在無差錯信道環(huán)境下分組層能獲得的最大信道利用率;推導(dǎo)出在有誤碼條件下重傳操作及時發(fā)生等理想情況下分組層能獲得的最大信道利用率。給出理論推導(dǎo)過程。理論推導(dǎo)的目的是得到信道利用率的極限數(shù)據(jù)。為了簡化有誤碼條件下的最大利用率推導(dǎo)過程,可以對問題模型進(jìn)行簡化,比如:假定超時重傳的數(shù)據(jù)幀的回饋ACK幀可以100%正確傳輸,但是簡化問題分析的這些假設(shè)必須不會對整個結(jié)論產(chǎn)生較大的誤差。由于需要攜帶幀信息,所以最大信息利用率為,由于數(shù)據(jù)鏈路層提供的服務(wù)為8000bps,所以每傳輸一個字節(jié)耗時1ms,每幀的附加信息固定為10,耗時10ms,若出現(xiàn)轉(zhuǎn)義字符還將增加時間。簡化模型,假設(shè)信道上始終有數(shù)據(jù)需要傳輸。則在誤碼率為的信道上,100000個比特可發(fā)送個數(shù)據(jù)包,即每傳送48個數(shù)據(jù)包將有1個出錯。假設(shè)在限定時間內(nèi)可以重傳的該幀為正確幀,則每傳送48個數(shù)據(jù)包需傳送48+1+1=50次。所以信道利用率為而由于程序設(shè)計原因,當(dāng)一個數(shù)據(jù)包超時后,常常需要重傳多次造成信道浪費。若重傳k次,則信道利用率為若重傳10次,信道利用率為78.18%。若信道誤碼率為,則,即大約每5個幀就有一個出錯,此時在ESC/FLAG模式下平均250個字符需要兩倍的傳輸空間即極限值510,若平均每個錯幀重傳10次信道利用率的極值為(5)實驗結(jié)果分析:你的程序運行實際達(dá)到了什么樣的效率,比對理論推導(dǎo)給出的結(jié)論,有沒有差距?給出原因。有沒有改進(jìn)的辦法?如果沒有時間把這些方法付諸編程實施,介紹你的方案。由實驗結(jié)果可以看出,窗口大小是16時信道利用率最高,與理論最大值最接近。與理論窗口最佳值一致。在洪泛模式下,信道利用率與理論值接近。而在其他情況下負(fù)載有時較輕,所以信道利用率相比理論值較低。(6)存在的問題:在“表3性能測試記錄表”中給出了幾種測試方案,在測試中你的程序有沒有失敗,或者,雖未失敗,但表現(xiàn)出來的性能仍有差距,你的程序中還存在哪些問題?實驗順利進(jìn)行,每次測試得到的數(shù)據(jù)都比較接近,但和理論值相比信道利用率較低,這與信道的負(fù)載有關(guān)。實驗結(jié)果:測試最佳窗口尺寸:窗口大小為16,DATA_TIMER3000,ACK_TIMER1000序號命令說明運行時間(分鐘)Selective算法線路利用率(%)AB1datalinkaudatalinkbu無誤碼信道數(shù)據(jù)傳輸3059.396.92datalinkadatalinkb站點A分組層平緩方式發(fā)出數(shù)據(jù),站點B周期性交替發(fā)送100秒停發(fā)100秒3056.895.03datalinkafudatalinkbfu無誤碼信道,站點A和站點B的分組層都洪水式產(chǎn)生分組3096.896.44datalinkafdatalinkbf站點A/B的分組層都洪水式產(chǎn)生分組3091.393.65datalinkaf–ber1e-4datalinkbf–ber1e-4站點A/B的分組層都洪水式產(chǎn)生分組,線路誤碼率為10^-43073.275.5窗口大小為8,DATA_TIMER3000,ACK_TIMER1000序號命令說明運行時間(分鐘)Selective算法線路利用率(%)AB1datalinkaudatalinkbu無誤碼信道數(shù)據(jù)傳輸3057.796.92datalinkadatalinkb站點A分組層平緩方式發(fā)出數(shù)據(jù),站點B周期性交替發(fā)送100秒停發(fā)100秒3055.694.83datalinkafudatalinkbfu無誤碼信道,站點A和站點B的分組層都洪水式產(chǎn)生分組3096.996.94datalinkafdatalinkbf站點A/B的分組層都洪水式產(chǎn)生分組3095.595.05datalinkaf–ber1e-4datalinkbf–ber1e-4站點A/B的分組層都洪水式產(chǎn)生分組,線路誤碼率為10^-43075.073.2窗口大小為32,DATA_TIMER3000,ACK_TIMER1000序號命令說明運行時間(分鐘)Selective算法線路利用率(%)AB1datalinkaudatalinkbu無誤碼信道數(shù)據(jù)傳輸3096.996.92datalinkadatalinkb站點A分組層平緩方式發(fā)出數(shù)據(jù),站點B周期性交替發(fā)送100秒停發(fā)100秒3054.893.63datalinkafudatalinkbfu無誤碼信道,站點A和站點B的分組層都洪水式產(chǎn)生分組3096.997.04datalinkafdatalinkbf站點A/B的分組層都洪水式產(chǎn)生分組3090.690.25datalinkaf–ber1e-4datalinkbf–ber1e-4站點A/B的分組層都洪水式產(chǎn)生分組,線路誤碼率為10^-43050.052.3從測試結(jié)果比較得出,窗口最佳尺寸為16;ACK搭載定時器的時限定為1000毫秒,窗口大小為16,測試重傳定時器時限D(zhuǎn)ATA_TIMER2800,窗口大小為16,ACK_TIMER1000測試最佳DATA_TIMER取值序號命令說明運行時間(分鐘)Selective算法線路利用率(%)AB1datalinkaudatalinkbu無誤碼信道數(shù)據(jù)傳輸3055.393.92datalinkadatalinkb站點A分組層平緩方式發(fā)出數(shù)據(jù),站點B周期性交替發(fā)送100秒停發(fā)100秒3049.688.73datalinkafudatalinkbfu無誤碼信道,站點A和站點B的分組層都洪水式產(chǎn)生分組3096.996.94datalinkafdatalinkbf站點A/B的分組層都洪水式產(chǎn)生分組3086.188.25datalinkaf–ber1e-4datalinkbf–ber1e-4站點A/B的分組層都洪水式產(chǎn)生分組,線路誤碼率為10^-43069.670.1DATA_TIMER3000,窗口大小為16,ACK_TIMER1000序號命令說明運行時間(分鐘)Selective算法線路利用率(%)AB1datalinkaudatalinkbu無誤碼信道數(shù)據(jù)傳輸3059.396.92datalinkadatalinkb站點A分組層平緩方式發(fā)出數(shù)據(jù),站點B周期性交替發(fā)送100秒停發(fā)100秒3056.895.03datalinkafudatalinkbfu無誤碼信道,站點A和站點B的分組層都洪水式產(chǎn)生分組3096.896.44datalinkafdatalinkbf站點A/B的分組層都洪水式產(chǎn)生分組3091.393.65datalinkaf–ber1e-4datalinkbf–ber1e-4站點A/B的分組層都洪水式產(chǎn)生分組,線路誤碼率為10^-43073.275.5DATA_TIMER3200,窗口大小為16,ACK_TIMER1000序號命令說明運行時間(分鐘)Selective算法線路利用率(%)AB1datalinkaudatalinkbu無誤碼信道數(shù)據(jù)傳輸3058.096.82datalinkadatalinkb站點A分組層平緩方式發(fā)出數(shù)據(jù),站點B周期性交替發(fā)送100秒停發(fā)100秒3055.890.33datalinkafudatalinkbfu無誤碼信道,站點A和站點B的分組層都洪水式產(chǎn)生分組3096.996.94datalinkafdatalinkbf站點A/B的分組層都洪水式產(chǎn)生分組3089.390.65datalinkaf–ber1e-4datalinkbf–ber1e-4站點A/B的分組層都洪水式產(chǎn)生分組,線路誤碼率為10^-43063.468.9DATA_TIMER3400,窗口大小為16,ACK_TIMER1000序號命令說明運行時間(分鐘)Selective算法線路利用率(%)AB1datalinkaudatalinkbu無誤碼信道數(shù)據(jù)傳輸3056.996.82datalinkadatalinkb站點A分組層平緩方式發(fā)出數(shù)據(jù),站點B周期性交替發(fā)送100秒停發(fā)100秒3054.889.93datalinkafudatalinkbfu無誤碼信道,站點A和站點B的分組層都洪水式產(chǎn)生分組3096.896.84datalinkafdatalinkbf站點A/B的分組層都洪水式產(chǎn)生分組3087.789.85datalinkaf–ber1e-4datalinkbf–ber1e-4站點A/B的分組層都洪水式產(chǎn)生分組,線路誤碼率為10^-43068.170.3從測試結(jié)果比較得出,DATA_TIMER=3000為最佳取值重傳定時器時限定為3000毫秒,窗口大小為16,測試ACK搭載定時器的時限ACK=1000ms序號命令說明運行時間(分鐘)Selective算法線路利用率(%)AB1datalinkaudatalinkbu無誤碼信道數(shù)據(jù)傳輸3059.396.92datalinkadatalinkb站點A分組層平緩方式發(fā)出數(shù)據(jù),站點B周期性交替發(fā)送100秒停發(fā)100秒3056.895.03datalinkafudatalinkbfu無誤碼信道,站點A和站點B的分組層都洪水式產(chǎn)生分組3096.996.44datalinkafdatalinkbf站點A/B的分組層都洪水式產(chǎn)生分組3095.195.45datalinkaf–ber1e-4datalinkbf–ber1e-4站點A/B的分組層都洪水式產(chǎn)生分組,線路誤碼率為10^-43073.275.5ACK=1100ms序號命令說明運行時間(分鐘)Selective算法線路利用率(%)AB1datalinkaudatalinkbu無誤碼信道數(shù)據(jù)傳輸3068.496.92datalinkadatalinkb站點A分組層平緩方式發(fā)出數(shù)據(jù),站點B周期性交替發(fā)送100秒停發(fā)100秒3067.695.63datalinkafudatalinkbfu無誤碼信道,站點A和站點B的分組層都洪水式產(chǎn)生分組3096.996.94datalinkafdatalinkbf站點A/B的分組層都洪水式產(chǎn)生分組3095.195.05datalinkaf–ber1e-4datalinkbf–ber1e-4站點A/B的分組層都洪水式產(chǎn)生分組,線路誤碼率為10^-43072.576.3ACK=1200ms序號命令說明運行時間(分鐘)Selective算法線路利用率(%)AB1datalinkaudatalinkbu無誤碼信道數(shù)據(jù)傳輸3055.996.92datalinkadatalinkb站點A分組層平緩方式發(fā)出數(shù)據(jù),站點B周期性交替發(fā)送100秒停發(fā)100秒3057.194.93datalinkafudatalinkbfu無誤碼信道,站點A和站點B的分組層都洪水式產(chǎn)生分組3096.996.94datalinkafdatalinkbf站點A/B的分組層都洪水式產(chǎn)生分組3095.295.15datalinkaf–ber1e-4datalinkbf–ber1e-4站點A/B的分組層都洪水式產(chǎn)生分組,線路誤碼率為10^-43074.573.3ACK=1300ms序號命令說明運行時間(分鐘)Selective算法線路利用率(%)AB1datalinkaudatalinkbu無誤碼信道數(shù)據(jù)傳輸3057.094.82datalinkadatalinkb站點A分組層平緩方式發(fā)出數(shù)據(jù),站點B周期性交替發(fā)送100秒停發(fā)100秒3055.894.93datalinkafudatalinkbfu無誤碼信道,站點A和站點B的分組層都洪水式產(chǎn)生分組3097.096.84datalinkafdatalinkbf站點A/B的分組層都洪水式產(chǎn)生分組3095.195.05datalinkaf–ber1e-4datalinkbf–ber1e-4站點A/B的分組層都洪水式產(chǎn)生分組,線路誤碼率為10^-43071.474.4從測試結(jié)果比較得出,最佳ACK搭載定時器的時限為1100ms實驗截圖:(最佳參數(shù))DATA_TIMER3000,窗口大小為16,ACK_TIMER1100datalinkaudatalinkbudatalinkadatalinkbdatalinkafudatalinkbfudatalinkafdatalinkbfdatalinkaf–ber1e-4datalinkbf–ber1e-44.研究和探索的問題1.CRC校驗?zāi)芰RC校驗碼的檢錯能力很強(qiáng),它除了能檢查出離散錯外,還能檢查出突發(fā)錯,CRC校驗碼具有以下檢錯能力:CRC校驗碼能檢查出全部單個錯;CRC校驗碼能檢查出全部離散的二位錯;CRC校驗碼能檢查出全部奇數(shù)個錯;CRC校驗碼能檢查出全部長度小于或等于K位的突發(fā)錯;CRC校驗碼能以[1-(1/2)K-1]的概率檢查出長度為(K+1)位的突發(fā)錯。由于本次試驗過程的誤碼信道是一個比較固定的誤碼率,而在實際生活當(dāng)中的誤碼率不是穩(wěn)定的,可能會因為傳輸環(huán)境的不同,使得他的誤碼率波動比較大的,例如,下雨天和晴天,高噪聲和低噪聲的情況,傳輸?shù)木嚯x也是影響因素。對于這種動態(tài)的誤碼率的通信過程,可能需要其他的一些參數(shù)來控制基本參數(shù)值(窗口大小,重傳時間等等)來完成。3.get_ms()如何實現(xiàn)C語言的time.h當(dāng)中提供了一些關(guān)于時間操作的函數(shù)可以實現(xiàn)get_ms()函數(shù)??梢岳玫暮瘮?shù)有clock()函數(shù)原型為:clock_tclock()該函數(shù)返回程序開始執(zhí)行后占用的處理器時間,如果無法獲得占用時間則返回-1。因為我們計時的起點并不是程序開始之時,而是開始通信之時,所以需要一個靜態(tài)變量start_time來記錄通信起始的時間。然后在每次調(diào)用get_ms()后,獲取當(dāng)前的時間current_time。然后再返回start_time-current_time即可。4.對等協(xié)議實體之間的流量控制在我們設(shè)計的協(xié)議當(dāng)中,流量的控制主要通過接收窗口,發(fā)送窗口還有確認(rèn)機(jī)制來實現(xiàn)。因為有窗口大小的限制,發(fā)送方不會一次性發(fā)送過多信息導(dǎo)致接收方被信息洪流所淹沒,導(dǎo)致信息丟失。這樣可能會導(dǎo)致信道的利用率降低,但是如果合理的設(shè)計窗口大小,依然可以達(dá)到較高的信號利用率。5.實驗總結(jié)和心得體會(1)完成本次實驗的實際上機(jī)調(diào)試時間是多少?由于其他課業(yè)任務(wù)較多,日程安排緊張,完成本次試驗代碼的編寫大約用了一周,每天晚上大約抽出1-2小時的時間。其中很大一部分時間是在程序框架的確定和debug.在這之后又花了5天,每晚1-2小時的時間用于測試協(xié)議參數(shù)的選取等問題。(2)編程工具方面遇到了哪些問題?包括Windows環(huán)境和VC軟件的安裝問題。這方面進(jìn)展十分順利。(3)編程語言方面遇到了哪些問題?包括C語言使用和對C語言操控能力上的問題。由于我們學(xué)習(xí)使用C語言時間較長,運用起來并沒有什么阻礙。(4)協(xié)議方面遇到了哪些問題?包括協(xié)議機(jī)制的設(shè)計錯誤,發(fā)現(xiàn)協(xié)議死鎖,或者不能正確工作,協(xié)議參數(shù)的調(diào)整等問題。由于我們緩沖區(qū)判斷滿溢的條件存在問題,緩沖區(qū)溢出時網(wǎng)絡(luò)層依然沒有被關(guān)閉,導(dǎo)致運行程序時發(fā)現(xiàn)數(shù)據(jù)幀“丟失”;在協(xié)議參數(shù)的選擇上也花了較長時間。(5)開發(fā)庫方面遇到了哪些問題?包括庫程序中的BUG,庫函數(shù)文檔不夠清楚導(dǎo)致誤解,庫函數(shù)在所提供的功能結(jié)構(gòu)上的缺憾導(dǎo)致編程效率低下。這些問題或建議影響不同模塊之間功能界限的劃分。無法看到庫函數(shù)的實現(xiàn)部分的代碼,對各個參數(shù)的作用也沒有詳細(xì)清晰的說明,所以掌握這些函數(shù)花了較長時間,使用時也出現(xiàn)過很多錯誤。(6)總結(jié)本次實驗,你在C語言方面,協(xié)議軟件方面,理論學(xué)習(xí)方面,軟件工程方面等哪些方面上有所提高? 通過這次試驗,我們對數(shù)據(jù)鏈路層的選擇重傳協(xié)議的機(jī)制有了很深刻的了解。很多書本上不是很懂的講義,在我們進(jìn)行試驗的過程中,通過對模擬結(jié)果的分析與思考都一點點的理解了。而且這次試驗是我們第一次模擬通信,讓我們學(xué)會了windows下觀察網(wǎng)絡(luò)收發(fā)數(shù)據(jù)包模擬環(huán)境的搭建。6.源程序清單#include<stdio.h>#include<string.h>#include"protocol.h"#defineDATA1#defineNAK2#defineACK3#defineDATA_TIMER3000#defineACK_TIMER1000#defineMAX_SEQ63#defineNR_BUFS((MAX_SEQ+1)/2)intno_nak=1;staticintphl_ready=0;structFRAME{unsignedcharkind;/*數(shù)據(jù)、確認(rèn)、否定確認(rèn)*/unsignedcharack;unsignedcharseq;unsignedchardata[PKT_LEN];unsignedintpadding;};staticintbetween(unsignedchara,unsignedcharb,unsignedcharc){ /*如果滿足a<=b<c或其循環(huán)則返回真;否則返回假*/ return((a<=b)&&(b<c))||((c<a)&&(a<=b))||((b<c)&&(c<a));}staticvoidput_frame(unsignedchar*frame,intlen){//發(fā)送捎帶確認(rèn)幀的數(shù)據(jù)幀*(unsignedint*)(frame+len)=crc32(frame,len);send_frame(frame,len+4);phl_ready=0;}staticvoidsend_data_frame(unsignedcharfk,unsignedcharframe_nr,unsignedcharframe_expected,unsignedcharbuffer[NR_BUFS][PKT_LEN]){/*構(gòu)造并發(fā)送數(shù)據(jù)、確認(rèn)、否定確認(rèn)幀*/ structFRAMEs;s.kind=fk;s.seq=frame_nr;s.ack=(frame_expected+MAX_SEQ)%(MAX_SEQ+1); if(fk==DATA){ memcpy(s.data,buffer[frame_nr%NR_BUFS],PKT_LEN); dbg_frame("SendDATA%d%d,ID%d\n",s.seq,s.ack,*(short*)s.data);put_frame((unsignedchar*)&s,3+PKT_LEN); start_timer(frame_nr%NR_BUFS,DATA_TIMER); } if(fk==NAK){ no_nak=0; dbg_frame("SendNAK%d\n",s.ack); put_frame((unsignedchar*)&s,3+PKT_LEN); } if(fk==ACK){ dbg_frame("SendACK%d\n",s.ack);put_frame((unsignedchar*)&s,3+PKT_LEN); } phl_ready=0; stop_ack_timer();}voidmain(intargc,char**argv){ intevent,arg;structFRAMEf;intlen=0; inti; staticunsignedcharack_expected=0; staticunsignedcharnext_frame_to_send=0; staticunsignedcharframe_expected=0; staticunsignedchartoo_far=NR_BUFS;staticunsignedcharnbuffered=0; intarrived[NR_BUFS]; staticunsignedcharout_buf[NR_BUFS][PKT_LEN]; staticunsignedcharin_buf[NR_BUFS][PKT_LEN];protocol_init(argc,argv);//初始化協(xié)議lprintf("DesignedbyCK~~,build:"__DATE__""__TIME__"\n"); for(i=0;i<NR_BUFS;i++) arrived[i]=0;//沒有幀到達(dá)接收方enable_network_layer();//初始化 while(1){ event=wait_for_event(&arg);//等待下一事件 switch(event){ caseNETWORK_LAYER_READY://允許網(wǎng)絡(luò)層發(fā)送數(shù)據(jù)幀 nbuffered++;//緩沖區(qū)數(shù)據(jù)幀數(shù)加一 get_packet(out_buf[next_frame_to_send%NR_BUFS]);//從網(wǎng)絡(luò)層接收數(shù)據(jù)幀 send_data_frame(DATA,next_frame_to_send,frame_expected,out_buf);//發(fā)送數(shù)據(jù)幀 next_frame_to_send=(next_frame_to_send+1)%(MAX_SEQ+1);//發(fā)送窗口上界下移 break; casePHYSICAL_LAYER_READY://物理層空閑 phl_ready=1; break; caseFRAME_RECEIVED://接收方收到一個幀 len=recv_frame((unsignedchar*)&f,sizeoff);//幀長if(len<5||crc32((unsignedchar*)&f,len)!=0){//收到的幀損壞 if(no_nak)//如果沒有發(fā)送NAK,則發(fā)送NAK要求重傳(避免多次請求重發(fā)) send_data_frame(NAK,0,frame_expected,out_buf);//相對協(xié)議5不同,收到錯誤要求重傳而不是直接abortdbg_event("****ReceiverError,BadCRCChecksum\n");//打印損壞報告break;//跳出switch語句 } if(f.kind==DATA){//收到一個數(shù)據(jù)幀 dbg_frame("RecvDATA%d%d,ID%d\n",f.seq,f.ack,*(short*)f.data);//打印收到幀完好 if((f.seq!=frame_expected)&&no_nak)//未按照順序到達(dá) send_data_frame(NAK,0,frame_expected,out_buf);//返回錯誤幀 else start_ack_timer(ACK_TIMER);//開啟輔助計時器 if(between(frame_expected,f.seq,too_far)&&arrived[f.seq%NR_BUFS]==0){//數(shù)據(jù)幀落在窗口內(nèi) /*數(shù)據(jù)幀可能以任何順序到達(dá)*/ arrived[f.seq%NR_BUFS]=1; memcpy(in_buf[f.seq%NR_BUFS],f.data,len-7); while(arrived[frame_expected%NR_BUFS]){//如果到達(dá)的幀落在接收窗上 /*數(shù)據(jù)幀通過并移動接收窗口*/ put_packet(in_buf[frame_expected%NR_BUFS],len-7);//將到達(dá)的數(shù)據(jù)幀發(fā)送

溫馨提示

  • 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

提交評論