滑動(dòng)窗口協(xié)議模擬程序的設(shè)計(jì)與實(shí)現(xiàn)_第1頁(yè)
滑動(dòng)窗口協(xié)議模擬程序的設(shè)計(jì)與實(shí)現(xiàn)_第2頁(yè)
滑動(dòng)窗口協(xié)議模擬程序的設(shè)計(jì)與實(shí)現(xiàn)_第3頁(yè)
滑動(dòng)窗口協(xié)議模擬程序的設(shè)計(jì)與實(shí)現(xiàn)_第4頁(yè)
滑動(dòng)窗口協(xié)議模擬程序的設(shè)計(jì)與實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩21頁(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、長(zhǎng)沙理工大學(xué)網(wǎng)絡(luò)協(xié)議編程課程設(shè)計(jì)報(bào)告梁碧瑩學(xué) 院 計(jì)算機(jī)與通信工程 專 業(yè) 網(wǎng)絡(luò)工程 班 級(jí) 網(wǎng)絡(luò)08-02 學(xué) 號(hào) 200858080205 學(xué)生姓名 梁碧瑩 指導(dǎo)教師 王靜 課程成績(jī) 完成日期 2011年 7 月 2 日課程設(shè)計(jì)任務(wù)書(shū)計(jì)算機(jī)與通信工程學(xué)院 網(wǎng)絡(luò)工程專業(yè) 課程名稱網(wǎng)絡(luò)協(xié)議編程課程設(shè)計(jì)時(shí)間20102011學(xué)年第二學(xué)期1819周學(xué)生姓名梁碧瑩指導(dǎo)老師王靜題 目滑動(dòng)窗口協(xié)議模擬程序的設(shè)計(jì)與實(shí)現(xiàn)主要內(nèi)容:(1) 了解網(wǎng)絡(luò)協(xié)議編程的基本知識(shí);(2) 了解滑動(dòng)窗口協(xié)議的工作機(jī)制;(3) 使用編程語(yǔ)言編寫一個(gè)滑動(dòng)窗口協(xié)議的模擬程序,按要求實(shí)現(xiàn)程序。要求:(1)按要求編寫課程設(shè)計(jì)報(bào)告書(shū),能正

2、確闡述設(shè)計(jì)結(jié)果。(2)通過(guò)課程設(shè)計(jì)培養(yǎng)學(xué)生嚴(yán)謹(jǐn)?shù)目茖W(xué)態(tài)度,認(rèn)真的工作作風(fēng)和團(tuán)隊(duì)協(xié)作精神。(3)學(xué)會(huì)文獻(xiàn)檢索的基本方法和綜合運(yùn)用文獻(xiàn)能力。(4)在老師的指導(dǎo)下,要求每個(gè)學(xué)生獨(dú)立完成課程設(shè)計(jì)的全部?jī)?nèi)容。應(yīng)當(dāng)提交的文件:(1) 課程設(shè)計(jì)報(bào)告。(2) 課程設(shè)計(jì)附件(源程序、各類圖紙、實(shí)驗(yàn)數(shù)據(jù)、運(yùn)行截圖等)。課程設(shè)計(jì)成績(jī)?cè)u(píng)定學(xué) 院 計(jì)算機(jī)通信工程 專 業(yè) 網(wǎng)絡(luò)工程 班 級(jí) 網(wǎng)絡(luò)08-02 班 學(xué) 號(hào) 200858080205 學(xué)生姓名 梁碧瑩 指導(dǎo)教師 王靜 課程成績(jī) 完成日期 2011年7 月 2 日指導(dǎo)教師對(duì)學(xué)生在課程設(shè)計(jì)中的評(píng)價(jià)評(píng)分項(xiàng)目?jī)?yōu)良中及格不及格課程設(shè)計(jì)中的創(chuàng)造性成果學(xué)生掌握課程內(nèi)容的程度課

3、程設(shè)計(jì)完成情況課程設(shè)計(jì)動(dòng)手能力文字表達(dá)學(xué)習(xí)態(tài)度規(guī)范要求課程設(shè)計(jì)論文的質(zhì)量指導(dǎo)教師對(duì)課程設(shè)計(jì)的評(píng)定意見(jiàn)綜合成績(jī) 指導(dǎo)教師簽字 年 月 日滑動(dòng)窗口協(xié)議模擬程序的設(shè)計(jì)與實(shí)現(xiàn)學(xué)生:梁碧瑩 指導(dǎo)老師:王靜摘要:本文主要介紹如何根據(jù)滑動(dòng)窗口協(xié)議的原理,在Visual C+的平臺(tái)上設(shè)計(jì)一個(gè)滑動(dòng)窗口協(xié)議模擬程序,并最終使該程序得以實(shí)現(xiàn)。本次程序設(shè)計(jì)分兩部分:第一部分是發(fā)送方,第二部分是接收方。通過(guò)發(fā)送方和接收方之間的數(shù)據(jù)幀傳輸模擬,學(xué)習(xí)滑動(dòng)窗口協(xié)議控制流量的原理和方法,以及滑動(dòng)窗口協(xié)議的工作機(jī)制。關(guān)鍵詞:滑動(dòng)窗口協(xié)議 流量控制 工作機(jī)制 模擬程序Design and Implementation of

4、0;Sliding Window Protocol ProceduresStudent: Liang Biying Instructor: Wang JingAbstract: This paper describes the principle of Sliding Window Protocol and how to design and implement a procedure about the Sliding Window Protocol. The program design in two parts, one is&

5、#160;the sender, the other is the receiver. After all, studying the principle and method of how the Sliding Window Protocol control the flow, and how the Sliding Window Protocol works through the transmission of data between the sender and the receiver.Keywords: Sliding window pr

6、otocol Flow control Working mechanism Simulation program目錄1 引言11.1滑動(dòng)窗口協(xié)議概述11.2本次設(shè)計(jì)任務(wù)12滑動(dòng)窗口協(xié)議介紹22.1滑動(dòng)窗口協(xié)議工作原理22.2滑動(dòng)窗口算法23設(shè)計(jì)方案及分析53.1 窗口機(jī)制總體設(shè)計(jì)及分析53.2協(xié)議選擇及分析63.3發(fā)送方與接收方設(shè)計(jì)流程64程序測(cè)試125總結(jié)155.1程序改進(jìn)與完善155.2設(shè)計(jì)總結(jié)15參考文獻(xiàn)16附錄171 引言隨著網(wǎng)絡(luò)的不斷壯大,用戶數(shù)量、信息量的需求不斷增加,網(wǎng)絡(luò)負(fù)荷越來(lái)越重。此時(shí),我們迫切需要一種機(jī)制來(lái)控制網(wǎng)絡(luò)的流量,減少網(wǎng)絡(luò)擁堵的幾率,提高傳輸?shù)男?。因此,一種名為滑

7、動(dòng)窗口的協(xié)議應(yīng)運(yùn)而生?;瑒?dòng)窗口協(xié)議,是TCP使用的一種流量控制方法。該協(xié)議允許發(fā)送方在停止并等待確認(rèn)前可以連續(xù)發(fā)送多個(gè)分組。由于發(fā)送方不必每發(fā)一個(gè)分組就停下來(lái)等待確認(rèn),因此該協(xié)議可以加速數(shù)據(jù)的傳輸。經(jīng)測(cè)試證明,該協(xié)議還能有效地解決TCP的高協(xié)議處理開(kāi)銷和UDP的低可靠性之間的矛盾,1.1 滑動(dòng)窗口協(xié)議概述 滑動(dòng)窗口協(xié)議,是TCP使用的一種流量控制方法。滑動(dòng)窗口協(xié)議也稱為Go-Back-N(GBN)協(xié)議。在該協(xié)議中,允許發(fā)送方傳輸多個(gè)分組(當(dāng)有多個(gè)分組時(shí))而不需等待確認(rèn),但它也受限于在流水賬中未確認(rèn)的分組數(shù)不能超過(guò)最大允許數(shù)N。只有在接收窗口向前滑動(dòng)時(shí)(與此同時(shí)也發(fā)送了確認(rèn)),發(fā)送窗口

8、才有可能向前滑動(dòng)。收發(fā)兩端的窗口按照以上規(guī)律不斷地向前滑動(dòng),因此這種協(xié)議又稱為滑動(dòng)窗口協(xié)議。當(dāng)發(fā)送窗口和接收窗口的大小都等于 1時(shí),就是停止等待協(xié)議。當(dāng)發(fā)送窗口大于1,接收窗口等于1時(shí),就是回退N步協(xié)議。當(dāng)發(fā)送窗口和接收窗口的大小均大于1時(shí),就是選擇重發(fā)協(xié)議。協(xié)議中規(guī)定,對(duì)于窗口內(nèi)未經(jīng)確認(rèn)的分組需要重傳。這種分組的數(shù)量最多可以等于發(fā)送窗口的大小,即滑動(dòng)窗口的大小n減去1(因?yàn)榘l(fā)送窗口不可能大于(n-1),起碼接收窗口要大于等于1)。1.2 本次設(shè)計(jì)任務(wù)本次的設(shè)計(jì)任務(wù)是根據(jù)滑動(dòng)窗口協(xié)議的工作原理,在Visual C+ 6.0的平臺(tái)上用C+語(yǔ)言編寫一個(gè)基于TCP滑動(dòng)窗口協(xié)議的模擬程序。要求該程序能

9、夠?qū)崿F(xiàn)滑動(dòng)窗口協(xié)議的發(fā)送和接收數(shù)據(jù)幀功能,在此功能上體現(xiàn)滑動(dòng)窗口協(xié)議的運(yùn)作,如:發(fā)送幀被接收與否的判斷,幀超時(shí)重發(fā),幀緩存等。2 滑動(dòng)窗口協(xié)議介紹2.1 滑動(dòng)窗口協(xié)議工作原理TCP協(xié)議在工作時(shí),如果發(fā)送端的TCP協(xié)議軟件每傳輸一個(gè)數(shù)據(jù)分組后,必須等待接收端的確認(rèn)才能夠發(fā)送下一個(gè)分組,由于網(wǎng)絡(luò)傳輸?shù)臅r(shí)延,將有大量時(shí)間被用于等待確認(rèn),導(dǎo)致傳輸效率低下。為此TCP在進(jìn)行數(shù)據(jù)傳輸時(shí)使用了滑動(dòng)窗口機(jī)制。TCP滑動(dòng)窗口用來(lái)暫存兩臺(tái)計(jì)算機(jī)間要傳送的數(shù)據(jù)分組。每臺(tái)運(yùn)行TCP協(xié)議的計(jì)算機(jī)有兩個(gè)滑動(dòng)窗口:一個(gè)用于數(shù)據(jù)發(fā)送,另一個(gè)用于數(shù)據(jù)接收。發(fā)送端待發(fā)數(shù)據(jù)分組在緩沖區(qū)排隊(duì)等待送出。被滑動(dòng)窗口框入的分組,是可以在未

10、收到接收確認(rèn)的情況下最多送出的部分。滑動(dòng)窗口左端標(biāo)志X的分組,是已經(jīng)被接收端確認(rèn)收到的分組。隨著新的確認(rèn)到來(lái),窗口不斷向右滑動(dòng)。TCP協(xié)議軟件依靠滑動(dòng)窗口機(jī)制解決傳輸效率和流量控制問(wèn)題。它可以在收到確認(rèn)信息之前發(fā)送多個(gè)數(shù)據(jù)分組。這種機(jī)制使得網(wǎng)絡(luò)通信處于忙碌狀態(tài),提高了整個(gè)網(wǎng)絡(luò)的吞吐率,它還解決了端到端的通信流量控制問(wèn)題,允許接收端在擁有容納足夠數(shù)據(jù)的緩沖之前對(duì)傳輸進(jìn)行限制。在實(shí)際運(yùn)行中,TCP滑動(dòng)窗口的大小是可以隨時(shí)調(diào)整的。收發(fā)端TCP協(xié)議軟件在進(jìn)行分組確認(rèn)通信時(shí),還交換滑動(dòng)窗口控制信息,使得雙方滑動(dòng)窗口大小可以根據(jù)需要?jiǎng)討B(tài)變化,達(dá)到在提高數(shù)據(jù)傳輸效率的同時(shí),防止擁塞的發(fā)生。稱窗口左邊沿向右邊

11、沿靠近為窗口合攏,這種現(xiàn)象發(fā)生在數(shù)據(jù)被發(fā)送和確認(rèn)時(shí)。當(dāng)窗口右邊沿向右移動(dòng)時(shí)將允許發(fā)送更多的數(shù)據(jù),稱之為窗口張開(kāi)。這種現(xiàn)象發(fā)生在另一端的接收進(jìn)程讀取已經(jīng)確認(rèn)的數(shù)據(jù)并釋放了TCP的接收緩存時(shí)。當(dāng)右邊沿向左移動(dòng)時(shí),稱為窗口收縮。Host Requirements RFC強(qiáng)烈建議不要使用這種方式。但TCP必須能夠在某一端產(chǎn)生這種情況時(shí)進(jìn)行處理。如果左邊沿到達(dá)右邊沿,則稱其為一個(gè)零窗口。2.2 滑動(dòng)窗口算法滑動(dòng)窗口算法工作過(guò)程如下:首先,發(fā)送方為每1幀賦一個(gè)序號(hào)(sequence number),記作SeqNum。現(xiàn)在,我們忽略SeqNum是由有限大小的頭部字段實(shí)現(xiàn)的事實(shí),而假設(shè)它能無(wú)限增大。發(fā)送方維護(hù)

12、3個(gè)變量:發(fā)送窗口大小(send window size),記作SWS,給出發(fā)送方能夠發(fā) 送但未確認(rèn)的幀數(shù)的上界; LAR表示最近收到的確認(rèn)幀(last acknowledgement received)的序號(hào);LFS表示最近發(fā)送的幀(last frame sent)的序號(hào),發(fā)送方還維持如下的不變式:LAR-LFSSWS 。圖2-1 滑動(dòng)窗口算法的時(shí)間線當(dāng)一個(gè)確認(rèn)到達(dá)時(shí),發(fā)送方向右移動(dòng)LAR,從而允許發(fā)送方發(fā)送另一幀。同時(shí),發(fā)送方為所發(fā)的每個(gè)幀設(shè)置一個(gè)定時(shí)器,如果定時(shí)器在ACK到達(dá)之前超時(shí),則重發(fā)此幀。注意:發(fā)送方必須存儲(chǔ)最多SWS個(gè)幀,因?yàn)樵谒鼈兊玫酱_認(rèn)之前必須

13、準(zhǔn)備重發(fā)。接收方維護(hù)下面3個(gè)變量:接收窗口大?。╮eceive window size),記為RWS,給出接收方所能接收的無(wú)序幀數(shù)目的上界;LAF表示可接收幀(largest acceptable frame)的序號(hào);LFR表示最近收到的幀(last frame rece ived)的序號(hào)。接收方也維持如下不變式:LFS-LARSWS 圖2-2 接收方的滑動(dòng)窗口當(dāng)一個(gè)具有順序號(hào)SeqNum的幀到達(dá)時(shí),接收方采取如下行動(dòng):如果SeqNumLFR或SeqNum> LAF,那么幀不在接收窗口內(nèi),于是被丟棄;如果LFRSeqNumLAF,那么幀在接收窗口內(nèi),于是被接收。現(xiàn)在接收方需要決

14、定是否發(fā)送一個(gè)ACK。設(shè)SeqNum To ACK表示未被確認(rèn)幀的最大序號(hào),則序號(hào)小于或等于SeqNum To ACK的幀都已收到。即使已經(jīng)收到更高序號(hào)的分組,接收方仍確認(rèn)SeqNum To ACK的接收。這種確認(rèn)被稱為是累積的(cumulative)。然后它設(shè)置LFA = SeqNum To ACK,并調(diào)整LFA = LFR + RWS。LFRLFR圖2-3 接收方的滑動(dòng)窗口窗口協(xié)議算法有三個(gè)功能:l 在不可靠鏈路上可靠地傳輸幀l 保持幀的傳輸順序l 支持流量控制3 設(shè)計(jì)方案及分析3.1 窗口機(jī)制總體設(shè)計(jì)及分析圖3-1 發(fā)送方和接收方狀態(tài)示意圖 設(shè)計(jì)分析:(1) 初始態(tài),發(fā)送方?jīng)]有

15、幀發(fā)出,發(fā)送窗口前后沿相重合。接收方0號(hào)窗口打開(kāi),等待接收0號(hào)幀;(2) 發(fā)送方打開(kāi)0號(hào)窗口,表示已發(fā)出0幀但尚未確認(rèn)返回信息。此時(shí)接收窗口狀態(tài)不變;(3) 發(fā)送方打開(kāi)0、1號(hào)窗口,表示0、1號(hào)幀均在等待確認(rèn)之列。至此,發(fā)送方打開(kāi)的窗口數(shù)已達(dá)規(guī)定限度,在未收到新的確認(rèn)返回幀之前,發(fā)送方將暫停發(fā)送新的數(shù)據(jù)幀。接收窗口此時(shí)狀態(tài)仍未變;(4) 接收方已收到0號(hào)幀,0號(hào)窗口關(guān)閉,1號(hào)窗口打開(kāi),表示準(zhǔn)備接收1號(hào)幀。此時(shí)發(fā)送窗口狀態(tài)不變;(5) 發(fā)送方收到接收方發(fā)來(lái)的0號(hào)幀確認(rèn)返回信息,關(guān)閉0號(hào)窗口,表示從重發(fā)表中刪除0號(hào)幀。此時(shí)接收窗口狀態(tài)仍不變;(6) 發(fā)送方繼續(xù)發(fā)送2號(hào)幀,2號(hào)窗口打開(kāi),表示2號(hào)幀也

16、納入待確認(rèn)之列。至此,發(fā)送方打開(kāi)的窗口又已達(dá)規(guī)定限度,在未收到新的確認(rèn)返回幀之前,發(fā)送方將暫停發(fā)送新的數(shù)據(jù)幀,此時(shí)接收窗口狀態(tài)仍不變;(7) 接收方已收到1號(hào)幀,1號(hào)窗口關(guān)閉,2號(hào)窗口打開(kāi),表示準(zhǔn)備接收2號(hào)幀。此時(shí)發(fā)送窗口狀態(tài)不變;(8) 發(fā)送方收到接收方發(fā)來(lái)的1號(hào)幀收畢的確認(rèn)信息,關(guān)閉1號(hào)窗口,表示從重發(fā)表中刪除1號(hào)幀。此時(shí)接收窗口狀態(tài)仍不變。3.2 協(xié)議選擇及分析在設(shè)計(jì)過(guò)程中,我主要運(yùn)用了選擇重傳協(xié)議,該協(xié)議能很好地彌補(bǔ)了1比特滑動(dòng)窗口協(xié)議和后退n協(xié)議的缺點(diǎn),是比較完善的滑動(dòng)窗口協(xié)議。在選擇重傳協(xié)議中,當(dāng)接收方發(fā)現(xiàn)某幀出錯(cuò)后,其后繼續(xù)送來(lái)的正確的幀雖然不能立即遞交給接收方的高層,但接收方仍

17、可收下來(lái),存放在一個(gè)緩沖區(qū)中,同時(shí)要求發(fā)送方重新傳送出錯(cuò)的那一幀。一旦收到重新傳來(lái)的幀后,就可以原已存于緩沖區(qū)中的其余幀一并按正確的順序遞交高層。這種方法稱為選擇重發(fā)(SELECTICE REPEAT),其工作過(guò)程如圖所示。顯然,選擇重發(fā)減少了浪費(fèi),但要求接收方有足夠大的緩沖區(qū)空間。圖3-2 選擇重傳協(xié)議原理圖3.3 發(fā)送方與接收方設(shè)計(jì)流程由于我設(shè)計(jì)的程序?yàn)槟M程序,因此我把發(fā)送方和接收方集合在同一版面上。它們各自的功能同時(shí)在同一版面上實(shí)現(xiàn)及顯示。在程序?qū)崿F(xiàn)后,我們可以通過(guò)在同一版面根據(jù)提示輸入相關(guān)信息,即可得到模擬過(guò)程。雖然只有一個(gè)版面,但是發(fā)送方和接收方的功能是清晰的、相對(duì)齊全的。發(fā)送方和

18、接收方的設(shè)計(jì)流程如下:圖3-3 發(fā)送方與接收方設(shè)計(jì)流程根據(jù)流程圖的實(shí)現(xiàn)步驟,我編寫了以下的代碼。(1)發(fā)送方程序:本程序設(shè)有四個(gè)變量:一是窗口大小變量,二是第一幀序列號(hào)變量,三是最近發(fā)送的幀變量,最后一個(gè)是最近收到的確認(rèn)幀變量。swpstate1.head=NULL; /變量初始值為空swpstate1.sendq=sendq_rear=(structsendq_slot*)malloc(sizeof(structsendq_slot);if(!swpstate1.sendq) exit(1);sendq_rear->next=NULL;printf("請(qǐng)輸入窗口大?。?quo

19、t;);scanf("%ld",&swpstate1.sws); /輸入窗口大小swpstate1.rws=swpstate1.sws; /把窗口大小的值賦給變量if (swpstate1.sws>0) printf("請(qǐng)輸入第一幀的序列號(hào):"); scanf("%ld",&swpstate1.hdr.seqnum); /輸入第一幀序列號(hào)swpstate1.nfe=swpstate1.hdr.seqnum; /把第一幀的值放進(jìn)緩沖池內(nèi)sendp=(struct sendq_slot*) malloc (size

20、of(struct sendq_slot); if(!sendp) exit(1);sendp->msg=swpstate1.hdr.seqnum;sendp->timeout=1;sendp->next=NULL;sendq_rear->next=sendp;sendq_rear=sendp;-swpstate1.sws;swpstate1.lfs=swpstate1.hdr.seqnum; /最近發(fā)送的幀取值swpstate1.lar=swpstate1.hdr.seqnum; /最近收到的確認(rèn)幀取值dowhile(swpstate1.sws>0) /當(dāng)窗口大

21、小大于0時(shí),執(zhí)行以下的循環(huán)sendp=(struct sendq_slot*)malloc(sizeof(struct sendq_slot); if(!sendp) exit(1); sendp->msg=swpstate1.lfs+1; /如果輸入的幀序號(hào)大于之前幀序號(hào),那么窗口向前滑動(dòng) sendp->timeout=1; /時(shí)延為1 sendp->next=NULL; sendq_rear->next=sendp; sendq_rear=sendp; -swpstate1.sws; +swpstate1.lfs;swpstate1.hdr.acknum=0; /A

22、CK清空swpstate1.hdr.flags=0; /存儲(chǔ)緩沖池清空printf("最近收到的ACK的幀序號(hào):%ldn",swpstate1.lar); /輸出最近收到的ACK幀序號(hào)printf("最近發(fā)送的幀序號(hào)(發(fā)送新幀后):%ldn",swpstate1.lfs);/輸出最近發(fā)送幀序號(hào)(2)接收方程序:收到的包是否含有Push標(biāo)志?收到包的序號(hào)與等待接收的序號(hào)是否一致?收到包的序號(hào)在接收窗口范圍內(nèi)?NY直接提取數(shù)據(jù),提前應(yīng)用進(jìn)程Y入接收隊(duì)列YN處理在接收隊(duì)列中的包(如果是普通包要判斷序號(hào),或者進(jìn)行拆包,組包操作)結(jié)束N圖3-4 數(shù)據(jù)包接收過(guò)程l

23、接收方的接收原則從總體上看是先判斷輸入的數(shù)據(jù)幀是否在接收范圍之內(nèi),若是,則繼續(xù)判斷是否符合其他接收條件;若不是,則馬上丟棄該數(shù)據(jù)幀,不再進(jìn)行其他條件的判斷。struct sendq_slot *sendq_rear,*sendp,*p3,*p4; /設(shè)定變量struct recvq_slot *recvp,*recvq_rear,*p1,*p2; if(swpstate1.hdr.flags=0) /上次輸入的數(shù)據(jù)幀被放置在緩存區(qū),輸入?yún)^(qū)被清空 do /如果繼續(xù)接收數(shù)據(jù)幀則實(shí)施下面循環(huán) printf("請(qǐng)輸入收到的數(shù)據(jù)幀號(hào):"); scanf("%ld"

24、,&a); if(a>=swpstate1.nfe&&a<=swpstate1.lfs) /判斷數(shù)據(jù)幀應(yīng)被接收或緩存 if(swpstate1.head=NULL) recvp=recvq_rear=(structrecvq_slot*)malloc(sizeof(structrecvq_slot); recvp->next=NULL; swpstate1.head=recvp; else if(swpstate1.head!=NULL) recvp=(struct recvq_slot*)malloc(sizeof(struct recvq_slot

25、); recvp->next=NULL; recvq_rear->next=recvp; recvq_rear=recvp; else printf("所輸數(shù)據(jù)不在接收窗口內(nèi)!"); break; /跳出該循環(huán) l 若輸入數(shù)據(jù)幀在接收范圍內(nèi)則繼續(xù)判斷并進(jìn)行以下循環(huán)。 recvp->msg=a; if(recvp->msg=swpstate1.nfe) /是否放入緩存判斷 recvp->received=1; else recvp->received=0; -swpstate1.rws; if(recvp->received=1) /

26、數(shù)據(jù)幀被接收,則進(jìn)行下面語(yǔ)句 a=a-1; do a=a+1; if(swpstate1.head=NULL) break; p1=swpstate1.head; flag=0; while(a!=p1->msg)&&(p1->next!=NULL) p2=p1;p1=p1->next; if(a=p1->msg) flag=1; if(p1=swpstate1.head) swpstate1.head=swpstate1.head->next; else p2->next=p1->next; swpstate1.nfe=a+1; sw

27、pstate1.hdr.acknum=a+1; swpstate1.hdr.flags=1; while(flag=1); printf("ACK號(hào)(期待的下一幀的序號(hào)):%ldn",swpstate1.nfe); printf("沒(méi)按序接受的序號(hào):n"); p1=swpstate1.head; while(p1!=NULL) printf("%ldt",p1->msg); p1=p1->next; l 當(dāng)接收完一個(gè)數(shù)據(jù)幀時(shí),我們可以選擇終止下面的繼續(xù)接收,也可以選擇繼續(xù)接收。如果繼續(xù)接收,那么程序跳到判斷循環(huán),繼續(xù)判斷是

28、否接收下一個(gè)數(shù)據(jù)幀,原理與上面相當(dāng)。while(swpstate1.rws>0)&&(b=1); if(swpstate1.hdr.flags=1) p3=swpstate1.sendq->next; flag=0; while(swpstate1.hdr.acknum)!=p3->msg&&p3->next!=NULL) p4=p3;p3=p3->next; if(swpstate1.hdr.acknum=p3->msg) flag=1; if(p3->msg=swpstate1.sendq->next->

29、msg) swpstate1.sendq->next=p3; else swpstate1.sendq->next=p3; swpstate1.sws=swpstate1.sws+(swpstate1.sendq->next->msg-swpstate1.lar); swpstate1.lar=swpstate1.sendq->next->msg; swpstate1.hdr.seqnum=swpstate1.hdr.acknum; printf("最近收到的ACK的幀序號(hào)(收到ACK后):%ldn",swpstate1.lar); pr

30、intf("最近發(fā)送的幀序號(hào)(此時(shí)還未發(fā)送新的數(shù)據(jù)):%ldn",swpstate1.lfs); 4 程序測(cè)試下面我以窗口大小為11,第一幀序列號(hào)為3,做程序的測(cè)試。圖4-1 程序測(cè)試整體圖(1)整體窗口展示,命令行界面圖4-2 整體窗口展示(2) 輸入窗口大小及第一幀序列號(hào)圖4-3 信息設(shè)置輸入(3)當(dāng)輸入的接收幀并不是ACK期待的幀,那么根據(jù)滑動(dòng)窗口協(xié)議該幀不被接收,且把該幀存放在緩沖區(qū)。圖4-4 幀不被接收的情況(4)當(dāng)前面輸入的都不是系統(tǒng)所期待的幀,那么這些幀會(huì)一直被存放在緩沖區(qū)。直到輸入下一個(gè)輸入的幀的序號(hào)比前面輸入的幀的序號(hào)大,且是系統(tǒng)所期待的幀時(shí),之前和當(dāng)前輸

31、入的幀會(huì)一并被接收,緩沖區(qū)清空。繼續(xù)接收命令,進(jìn)行新的幀的檢測(cè)及接收。圖4-5 幀被接收的情況(5)若輸入的幀超過(guò)了窗口大小,那么系統(tǒng)會(huì)顯示該幀不在接收范圍內(nèi),并拒絕接收。圖4-6 幀超出窗口大小范圍5 總結(jié)5.1 程序改進(jìn)與完善該滑動(dòng)窗口協(xié)議模擬程序還有進(jìn)一步完善的余地,例如可以對(duì)以下一些地方進(jìn)行改進(jìn):(1)改模擬程序通過(guò)命令行來(lái)實(shí)行,缺少形象直觀的界面,希望日后可以設(shè)計(jì)比較簡(jiǎn)單明了的界面來(lái)展示程序的主要模擬功能。(2)現(xiàn)在我們模擬的只是一些用序號(hào)代名的簡(jiǎn)單的幀,建議可以改善程序,使該系統(tǒng)可以模擬更接近真實(shí)的數(shù)據(jù)幀。這樣可以聯(lián)系實(shí)際更直觀地去驗(yàn)證滑動(dòng)窗口協(xié)議。(3)整體來(lái)說(shuō),滑動(dòng)窗口在實(shí)驗(yàn)中

32、是固定的,這樣便于處理幀號(hào)和ack的確認(rèn)以及存儲(chǔ)。但建議可以在日后改進(jìn)使其變成動(dòng)態(tài)的。5.2 設(shè)計(jì)總結(jié)以上為我所設(shè)計(jì)的滑動(dòng)窗口模擬程序,它經(jīng)過(guò)多次修改和整理,已是一個(gè)比較不錯(cuò)的設(shè)計(jì),可以基本實(shí)現(xiàn)所需功能,但因?yàn)樗接邢?,此程序中也存在一定的?wèn)題,這需要以后更進(jìn)一步的改進(jìn)。參考文獻(xiàn)1 謝希仁. 計(jì)算機(jī)網(wǎng)絡(luò)M. 4版. 北京:電子工業(yè)出版社, 2003.2 李仁發(fā),何彥. 基于虛擬實(shí)驗(yàn)方法的滑動(dòng)窗口協(xié)議分析J. 系統(tǒng)仿真學(xué)報(bào), 2002, 8 (14) : 1026 - 1063.3 李建中,張冬冬. 滑動(dòng)窗口規(guī)模的動(dòng)態(tài)調(diào)整算法J. 軟件學(xué)報(bào), 2004, 12 (15) : 1800 - 181

33、4.4 王栩,李建中,王偉平. 基于滑動(dòng)窗口的數(shù)據(jù)流壓縮技術(shù)及連續(xù)查詢處理方法 J . 計(jì)算機(jī)研究與發(fā)展, 2004, 10 (41) : 1639- 1644.5 特南鮑姆. 計(jì)算機(jī)網(wǎng)絡(luò)(第四版). 清華出版社附錄#include<stdio.h>#include<stdlib.h>#include<malloc.h>main()struct swphdrunsigned long seqnum;unsigned long acknum;unsigned short flags; /*flag=0表示這是一個(gè)數(shù)據(jù)幀,flag=1表示這是一個(gè)ACK幀*/;s

34、truct sendq_slot unsigned short timeout;/*1時(shí)表示計(jì)時(shí)啟動(dòng),0時(shí)表示已收到確認(rèn)*/unsigned long msg;struct sendq_slot *next; struct recvq_slot unsigned short received;/*1表示順序接收,0表示錯(cuò)序接受*/unsigned long msg;struct recvq_slot *next;struct swpstateunsigned long lar;unsigned long lfs;unsigned long sws;struct swphdr hdr;unsig

35、ned long rws;struct sendq_slot *sendq;unsigned long nfe;struct recvq_slot *head;swpstate1;unsigned long a;int flag,b;/*發(fā)送*/struct sendq_slot *sendq_rear,*sendp,*p3,*p4;struct recvq_slot *recvp,*recvq_rear,*p1,*p2;swpstate1.head=NULL;swpstate1.sendq=sendq_rear=(structsendq_slot*)malloc(sizeof(structs

36、endq_slot);if(!swpstate1.sendq) exit(1);sendq_rear->next=NULL;printf("請(qǐng)輸入窗口大小:");scanf("%ld",&swpstate1.sws);swpstate1.rws=swpstate1.sws;if (swpstate1.sws>0) printf("請(qǐng)輸入第一幀的序列號(hào):"); scanf("%ld",&swpstate1.hdr.seqnum);swpstate1.nfe=swpstate1.hdr.se

37、qnum;sendp=(struct sendq_slot*)malloc(sizeof(struct sendq_slot);if(!sendp) exit(1);sendp->msg=swpstate1.hdr.seqnum;sendp->timeout=1;sendp->next=NULL;sendq_rear->next=sendp;sendq_rear=sendp;-swpstate1.sws;swpstate1.lfs=swpstate1.hdr.seqnum;swpstate1.lar=swpstate1.hdr.seqnum;dowhile(swpsta

38、te1.sws>0)sendp=(struct sendq_slot*)malloc(sizeof(struct sendq_slot); if(!sendp) exit(1); sendp->msg=swpstate1.lfs+1; sendp->timeout=1; sendp->next=NULL; sendq_rear->next=sendp; sendq_rear=sendp; -swpstate1.sws; +swpstate1.lfs;swpstate1.hdr.acknum=0;swpstate1.hdr.flags=0;printf("

39、最近收到的ACK的幀序號(hào):%ldn",swpstate1.lar);printf("最近發(fā)送的幀序號(hào)(發(fā)送新幀后):%ldn",swpstate1.lfs);/*接收*/ if(swpstate1.hdr.flags=0) do printf("請(qǐng)輸入收到的數(shù)據(jù)幀號(hào):"); scanf("%ld",&a); if(a>=swpstate1.nfe&&a<=swpstate1.lfs) if(swpstate1.head=NULL) recvp=recvq_rear=(structrecvq

40、_slot*)malloc(sizeof(structrecvq_slot); recvp->next=NULL; swpstate1.head=recvp; else if(swpstate1.head!=NULL) recvp=(struct recvq_slot*)malloc(sizeof(struct recvq_slot); recvp->next=NULL; recvq_rear->next=recvp; recvq_rear=recvp; else printf("所輸數(shù)據(jù)不在接收窗口內(nèi)!"); break; recvp->msg=a; if(recvp->msg=swpstate1.nfe) recvp->received=1; else recvp->received=0; -swpstate1.rws; if(recvp->received=1) a=a-1; do a=a+1;

溫馨提示

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