滑動(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è),還剩23頁(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ū),能正確闡述設(shè)計(jì)結(jié)果。(2)通過(guò)課程設(shè)計(jì)培

2、養(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)容的程度課程設(shè)計(jì)完成情況課程設(shè)計(jì)動(dòng)手能力文字表達(dá)學(xué)習(xí)態(tài)度規(guī)范要求課程設(shè)計(jì)論文的質(zhì)量指導(dǎo)教師

3、對(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 Sliding Window Protocol Procedure

4、sStudent: Liang BiyingInstructor: 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 the sender, the other is the receiver. After all, studying the pri

5、nciple 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 protocol Flow control Working mechanismSimulation program目錄1 引言 11.1滑動(dòng)窗口協(xié)議概述 11.2本次設(shè)計(jì)任務(wù) 12滑動(dòng)窗

6、口協(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é) 165.1程序改進(jìn)與完善 165.2 設(shè)計(jì)總結(jié) 16參考文獻(xiàn) 17附錄 181 引言隨著網(wǎng)絡(luò)的不斷壯大, 用戶數(shù)量、 信息量的需求不斷增加, 網(wǎng)絡(luò)負(fù)荷越來(lái)越 重。此時(shí),我們迫切需要一種機(jī)制來(lái)控制網(wǎng)絡(luò)的流量,減少網(wǎng)絡(luò)擁堵的幾率,提 高傳輸?shù)男省R虼?,一種名為滑動(dòng)窗口的協(xié)議應(yīng)運(yùn)而生?;瑒?dòng)窗口協(xié)議,是 TCP 使用的一種方法。該協(xié)議允許發(fā)送方在停止并等待 確認(rèn)前可以連續(xù)發(fā)送多個(gè)分組。由于發(fā)送方不必每

7、發(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ā)送窗口才有 可能向前滑動(dòng)。 收發(fā)兩端的窗口按照以上規(guī)律不斷地向前滑動(dòng), 因此這種協(xié)議又 稱為滑動(dòng)窗口協(xié)議。當(dāng)發(fā)送窗口和接收窗

8、口的大小都等于 1 時(shí),就是。當(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é)議的模擬程序。要求該程序能夠?qū)崿F(xiàn)滑動(dòng)窗口協(xié)議的發(fā)送和接收數(shù)據(jù)幀功能, 在此功能上體 現(xiàn)滑動(dòng)窗口協(xié)議的運(yùn)作, 如:發(fā)

9、送幀被接收與否的判斷, 幀超時(shí)重發(fā), 幀緩存等2 滑動(dòng)窗口協(xié)議介紹2.1 滑動(dòng)窗口協(xié)議工作原理TCP協(xié)議在工作時(shí),如果發(fā)送端的 TCP協(xié)議每傳輸一個(gè)數(shù)據(jù)分組后,必須 等待接收端的確認(rèn)才能夠發(fā)送下一個(gè)分組, 由于的時(shí)延, 將有大量時(shí)間被用于等 待確認(rèn),導(dǎo)致傳輸效率低下。為此 TCP 在進(jìn)行數(shù)據(jù)傳輸時(shí)使用了。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ù)分組在排隊(duì)等待送出。 被滑動(dòng)窗口框入的分組, 是可以在未收到接收確 認(rèn)的情況下最多送出的部分。滑動(dòng)窗口左端標(biāo)志X的分組,是已經(jīng)被接收端確

10、認(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í), 防 止擁塞的發(fā)生。 稱窗口左邊沿向右邊沿靠近為窗口合攏, 這種現(xiàn)象發(fā)生在數(shù)據(jù) 被發(fā)送和確認(rèn)時(shí)。當(dāng)窗口右

11、邊沿向右移動(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)(sequenee number),記作SeqNum?,F(xiàn)在,我們忽略SeqNum是由有限大小的頭部字段實(shí)現(xiàn)的事實(shí),而假設(shè)它能無(wú)限增大 發(fā)送方維護(hù)3個(gè)變量:發(fā)送窗口大小(send window si

12、ze),記作SWS,給出發(fā)送方能夠發(fā)送但未確認(rèn)的幀數(shù)的上界;LAR表示最近收到的確認(rèn)幀(last ack no wledgeme nt received 的序號(hào);LFS 表示最近發(fā)送的幀(last frame sen)的序號(hào),發(fā)送方還維持如下的不變式:LAR-LFS詬WS當(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)之前必須準(zhǔn)備重發(fā)。接收方維護(hù)下面 3個(gè)變量:接收窗口大小(receive window size),記為RWS,給出接收

13、方所能接收的無(wú)序幀數(shù)目的上界;LAF表示可接收幀(largest acceptable frame 的序號(hào);LFR 表示最近收到的幀(last frame rece ived)的序號(hào)。接收方也維持如下不變式:LFS-LAFK SWS:5WSLARLFS圖2-2接收方的滑動(dòng)窗口當(dāng)一個(gè)具有順序號(hào)SeqNum的幀到達(dá)時(shí),接收方采取如下行動(dòng):如果SeqNumC LFR或SeqNum LAF,那么幀不在接收窗口內(nèi),于是被丟棄;如果LFRv SeqNum LAF,那么幀在接收窗口內(nèi),于是被接收。現(xiàn)在接收方需要決定是否 發(fā)送一個(gè)ACK。設(shè)SeqNum To ACK表示未被確認(rèn)幀的最大序號(hào),則序號(hào)小于或等于S

14、eqNum To ACK的幀都已收到。即使已經(jīng)收到更高序號(hào)的分組,接收方仍 確認(rèn)SeqNum To ACK的接收。這種確認(rèn)被稱為是累積的 (cumulative )。然后它設(shè) 置 LFA = SeqNum To ACK,并調(diào)整 LFA = LFR + RWS。圖2-3接收方的滑動(dòng)窗口窗口協(xié)議算法有三個(gè)功能:在不可靠鏈路上可靠地傳輸幀保持幀的傳輸順序支持流量控制3設(shè)計(jì)方案及分析3.1窗口機(jī)制總體設(shè)計(jì)及分析按收方觀沐 塩送 發(fā)送 接 枚接收鯛發(fā)迭 接匪 接收確初想 Q號(hào)柚 】號(hào)恤 0號(hào)幀 認(rèn)。號(hào)料2VW 1號(hào)幀 認(rèn)I號(hào)軸圖3-1發(fā)送方和接收方狀態(tài)示意圖設(shè)計(jì)分析:(1)初始態(tài),發(fā)送方?jīng)]有幀發(fā)出,發(fā)送

15、窗口前后沿相重合。接收方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ì)齊全的

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

19、口大小:);sca nf(%ld,&swpstate1.sws); 輸入窗口大小 swpstate1.rws=swpstate1.sws; 把窗口大小的值賦給變量 if (swpstate1.sws0)printf(請(qǐng)輸入第一幀的序列號(hào):);scanf(%ld,&swpstate1.hdr.seqnum); 輸入第一幀序列號(hào)swpstate1. nfe=swpstate1.hdr.seq num; / 把第一幀的值放進(jìn)緩沖池內(nèi)sen dp=(struct sen dq_slot*) malloc (size of(struct sen dq_slot);if(!sendp) exit(1);

20、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.sws0) /當(dāng)窗口大小大于 0 時(shí),執(zhí)行以下的循環(huán)sendp=(struct sendq_slot*)malloc(sizeof(str

21、uct 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; /ACK 清空 swpstate1.hdr.flags=0;/存儲(chǔ)緩沖池清空printf(最近收到的 ACK勺幀序號(hào):ldn,swpstate1.l

22、ar);輸出最近收到的ACK幀序號(hào)printf( 最近發(fā)送的幀序號(hào)(發(fā)送新幀后 ): %ldn,swpstate1.lfs); /輸出最近發(fā)送幀序號(hào)(2)接收方程序:圖3-4數(shù)據(jù)包接收過(guò)程接收方的接收原則從總體上看是先判斷輸入的數(shù)據(jù)幀是否在接收范圍之內(nèi), 若是,則繼續(xù)判斷是否符合其他接收條件;若不是,則馬上丟棄該數(shù)據(jù)幀, 不再進(jìn)行其他條件的判斷。struct sen dq_slot *se ndq_rear,*se ndp,*p3,*p4; / 設(shè)定變量struct recvq_slot *recvp,*recvq_rear,*p1,*p2;if(swpstate1.hdr.flags=0)/

23、上次輸入的數(shù)據(jù)幀被放置在緩存區(qū),輸入?yún)^(qū)被清空do 如果繼續(xù)接收數(shù)據(jù)幀則實(shí)施下面循環(huán)prin tf(請(qǐng)輸入收到的數(shù)據(jù)幀號(hào):); scan f(%ld,&a);if(a=swpstate1. nfe&anext=NULL;swpstate1.head=recvp;elseif(swpstate1.head!=NULL)recvp=(struct recvq_slot*)malloc(sizeof(struct recvq_slot); recvp-next=NULL;recvq_rear-next=recvp; recvq_rear=recvp;elseprintf( 所輸數(shù)據(jù)不在接收窗口內(nèi)! )

24、; break; /跳出該循環(huán)若輸入數(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) /數(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-n

25、ext;if(a=p1-msg)flag=1;if(p1=swpstate1.head)swpstate1.head=swpstate1.head-next;else p2-next=p1-next;swpstate1.nfe=a+1;swpstate1.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

26、-next;當(dāng)接收完一個(gè)數(shù)據(jù)幀時(shí),我們可以選擇終止下面的繼續(xù)接收,也可以選擇繼 續(xù)接收。如果繼續(xù)接收,那么程序跳到判斷循環(huán),繼續(xù)判斷是否接收下一個(gè) 數(shù)據(jù)幀,原理與上面相當(dāng)。while(swpstate1.rws0)&(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.send

27、q-next-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); printf(最近發(fā)送的幀序號(hào)(此時(shí)還未發(fā)送新的數(shù)據(jù)):%ldn,s

28、wpstate1.lfs);4程序測(cè)試F面我以窗口大小為11,第一幀序列號(hào)為3,做程序的測(cè)試。后 3 了需U .巔弘 F55童師 11?.rt!.n 童KftT裂; 口一陶的到I 扎技也;4匕垛農(nóng)收幀1若是.輸扎i獸干邑輸5訶導(dǎo)適S西左4制序號(hào)1 技于接燙的序號(hào)=韻宰機(jī)收幻 昔孔itijM,若盂邑圖4-1程序測(cè)試整體圖(1)整體窗口展示,命令行界面B 恥2肌71 ?#動(dòng)嗇口愣溟m1圖4-2整體窗口展示(2) 輸入窗口大小及第一幀序列號(hào)圖4-3信息設(shè)置輸入(3) 當(dāng)輸入的接收幀并不是 ACK期待的幀,那么根據(jù)滑動(dòng)窗口協(xié)議該幀不被接 收,且把該幀存放在緩沖區(qū)。圖4-4幀不被接收的情況(4) 當(dāng)前面

29、輸入的都不是系統(tǒng)所期待的幀,那么這些幀會(huì)一直被存放在緩沖區(qū) 直到輸入下一個(gè)輸入的幀的序號(hào)比前面輸入的幀的序號(hào)大,且是系統(tǒng)所期 待的幀時(shí),之前和當(dāng)前輸入的幀會(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)在我們模擬

30、的只是一些用序號(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)中是固定的,這樣便于處理幀號(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

31、. 系統(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 - 1814.4 王栩,李建中 , 王偉平 . 基于滑動(dòng)窗口的數(shù)據(jù)流壓縮技術(shù)及連續(xù)查詢處理方 法 J . 計(jì)算機(jī)研究與發(fā)展 , 2004, 10 (41) : 1639- 1644.5 特南鮑姆 . 計(jì)算機(jī)網(wǎng)絡(luò)(第四版) . 清華出版社附錄#include #include#include main()struct swphdrunsigned long seqnum;unsigned long acknum

32、;unsigned short flags; /*flag=0 表示這是一個(gè)數(shù)據(jù)幀,flag=1 表示這是一個(gè) ACK幀*/;struct sendq_slotunsigned short timeout;/*1 時(shí)表示計(jì)時(shí)啟動(dòng), 0時(shí)表示已收到確認(rèn) */unsigned long msg;struct sendq_slot *next;struct recvq_slotunsigned short received;/*1 表示順序接收, 0 表示錯(cuò)序接受 */ unsigned long msg;struct recvq_slot *next;struct swpstateunsigned

33、 long lar;unsigned long lfs;unsigned long sws; struct swphdr hdr;unsigned 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.h

34、ead=NULL;swpstate1.sendq=sendq_rear=(structsendq_slot*)malloc(sizeof(structsendq_slot); if(!swpstate1.sendq) exit(1); sendq_rear-next=NULL; printf( 請(qǐng)輸入窗口大?。?); scanf(%ld,&swpstate1.sws); swpstate1.rws=swpstate1.sws;if (swpstate1.sws0)printf( 請(qǐng)輸入第一幀的序列號(hào): ); scanf(%ld,&swpstate1.hdr.seqnum); swpstate1

35、.nfe=swpstate1.hdr.seqnum; 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;do

36、 while(swpstate1.sws0)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(” 最近收到的 ACK的幀序

37、號(hào):ldn,swpstate1.lar);printf( 最近發(fā)送的幀序號(hào)(發(fā)送新幀后 ): %ldn,swpstate1.lfs); /* 接收 */if(swpstate1.hdr.flags=0)doprintf( 請(qǐng)輸入收到的數(shù)據(jù)幀號(hào): ); scanf(%ld,&a);if(a=swpstate1.nfe&anext=NULL;swpstate1.head=recvp;elseif(swpstate1.head!=NULL)recvp=(struct recvq_slot*)malloc(sizeof(struct recvq_slot); recvp-next=NULL;recvq_rear-next=recvp; r

溫馨提示

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