滑動窗口的仿真協議_第1頁
滑動窗口的仿真協議_第2頁
滑動窗口的仿真協議_第3頁
滑動窗口的仿真協議_第4頁
滑動窗口的仿真協議_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 計算機網絡課程設計書 學 院計算機與信息工程學院專 業(yè)網絡工程課程名稱計算機網絡題 目滑動窗口協議仿真完成期限自2015年6月23日至2015年6月29日共1周內容及任務1、 項目的目的 掌握滑動窗口協議的工作原理,并能夠用所學計算機高級語言進行編程模擬其運行過程;培養(yǎng)學生的動手實踐和思考能力。二,項目任務的主要內容和要求 (1)本次設計任務是根據滑動窗口協議的工作原理,在Visual C+ 6.0的平臺上用C+語言編寫一個基本TCP滑動窗口協議的模擬程序。 (2)要求該程序能夠實現滑動窗口協議的發(fā)送和接收數據幀功能,在此功能上體現滑動窗口協議的運作。 (3) 程序按照滑動窗口協議實現端對端

2、的數據傳送。包括協議的各種策略,如包丟失、停等應答、超時等都應有所仿真實現;(4) 顯示數據傳送過程中的各項具體數據。雙方幀的個數變化,幀序號,發(fā)送和接受速度,暫?;蛑貍魈崾镜龋?、 項目設計(研究)思路 (1) 查閱相關資料,理解滑動窗口協議的工作原理; (2) 設計滑動窗口協議實現端對端數據傳送的功能流程圖; (3) 編寫代碼實現滑動窗口協議工作的模擬程序,包括包丟失、停等應答、超時等; (4) 測試程序功能的實現情況。4、 具體成果形式和要求 (1)滑動窗口協議實現端對端數據傳送的模擬程序。 (2)按照要求撰寫課程設計報告并準備答辯。進度安排起止日期工作內容2015.6.23-2015.

3、6.24了解網絡協議編程的基本知識;2015.6.25-2015.6.26了解滑動窗口協議的工作機制;2015.6.27-2015.6.28使用編程語言編寫一個滑動窗口協議的模擬程序,按要求實現程序。2015.6.29最后匯總,調試,答辯主要參考資料1 謝希仁. 計算機網絡M. 4版. 北京:電子工業(yè)出版社, 2003.2 李仁發(fā).何彥. 基于虛擬實驗方法的滑動窗口協議分析J. 系統仿真學報. 2002. 8 (14) ; 1026 - 1063.3 李建中,張冬冬. 滑動窗口規(guī)模的動態(tài)調整算法J. 軟件學報. 2004. 12 (15) : 1800 - 1814.4 王栩,李建中,王偉平.

4、 基于滑動窗口的數據流壓縮技術及連續(xù)查詢處理方法 J . 計算機研究與發(fā)展. 2004. 10 (41) : 1639- 1644.5 特南鮑姆. 計算機網絡(第四版). 清華出版社指導教師意見(簽字): 年月日系(教研室)主任意見(簽字): 年月日 計算機網絡課程設計說明書(封面) 學院名稱: 計算機與信息工程學院 班級名稱: 網絡工程一班 學生姓名: 學 號: 201321 題 目: 滑動窗口協議仿真 指導教師姓 名: 邵雪梅 起止日期: 2015.6.232015.6.29 第一部分:正文部分一,選題背景 早期的網絡通信中,通信雙方不會考慮網絡的擁擠情況直接發(fā)送數據。由于大家不知道網絡擁

5、塞狀況,一起發(fā)送數據,導致中間結點阻塞掉包,誰也發(fā)不了數據。在數據傳輸過程中,我們總是希望數據傳輸的更快一些,但如果發(fā)送方把數據發(fā)送的過快,接收方就可能來不及接收,這就造成數據的丟失。因此就有了滑動窗口機制來解決這些問題。早期我們使用的是1bit滑動窗口協議,一次只發(fā)送一個幀,等收到ack確認才發(fā)下一個幀,這樣對信道的利用率太低了。因此提出了一種采用累積確認的連續(xù)ARQ協議,接收方不必對收到的幀逐個發(fā)送ack確認,而是收到幾個幀后,對按序到達的最后一個幀發(fā)送ack確認。同1bit滑動窗口協議相比,大大減少了ack數量,并消除了延遲ack對傳輸效率的影響。但是,這會產生一個新的問題,如果發(fā)送方發(fā)

6、送了5個幀,而中間的第3個幀丟失了。這時接收方只能對前2個幀發(fā)出確認。發(fā)送方無法知道后面三個幀的下落,只好把后面的3個幀再重傳一次,這就是回退N協議。為了解決這個問題,又提出了選擇重傳協議。當接收方發(fā)現某幀出錯后,繼續(xù)接受后面送來的正確的幀,只是不交付它們,存放在自己的緩沖區(qū)中,并且要求發(fā)送方重傳出錯的那一幀。一旦收到重傳來的幀后,就可以將存于緩沖區(qū)中的其余幀一并按正確的順序遞交給主機。本文主要介紹如何根據滑動窗口協議的原理,在Visual C+的平臺上設計一個滑動窗口協議模擬程序,并最終使該程序得以實現。本次程序設計分兩部分:第一部分是發(fā)送方,第二部分是接收方。通過發(fā)送方和接收方之間的數據幀

7、傳輸模擬,學習滑動窗口協議控制流量的原理和方法,以及滑動窗口協議的工作機制。二、設計理念2.1 滑動窗口協議工作原理TCP滑動窗口用來暫存兩臺計算機間要傳送的數據分組。每臺運行TCP協議的計算機有兩個滑動窗口:一個用于數據發(fā)送,另一個用于數據接收。發(fā)送端待發(fā)數據分組在緩沖區(qū)排隊等待送出。被滑動窗口框入的分組,是可以在未收到接收確認的情況下最多送出的部分?;瑒哟翱谧蠖藰酥綳的分組,是已經被接收端確認收到的分組。隨著新的確認到來,窗口不斷向右滑動。滑動窗口算法工作過程如下:首先,發(fā)送方為每1幀賦一個序號(sequence number),記作SeqNum?,F在,我們忽略SeqNum是由有限大小的頭

8、部字段實現的事實,而假設它能無限增大。發(fā)送方維護3個變量:發(fā)送窗口大?。╯end window size),記作SWS,給出發(fā)送方能夠發(fā)送但未確認的幀數的上界;LAR表示最近收到的確認幀(last acknowledgement received)的序號;LFS表示最近發(fā)送的幀(last frame sent)的序號,發(fā)送方還維持如下的不變式:LAR-LFSSWS。 2-1滑動窗口協議工作圖窗口協議算法有三個功能:l 在不可靠鏈路上可靠地傳輸幀l 保持幀的傳輸順序l 支持流量控制2.2 選擇重傳協議在選擇重傳協議中,當接收方發(fā)現某幀出錯后,其后繼續(xù)送來的正確的幀雖然不能立即遞交給接收方的高層,

9、但接收方仍可收下來,存放在一個緩沖區(qū)中,同時要求發(fā)送方重新傳送出錯的那一幀。一旦收到重新傳來的幀后,就可以原已存于緩沖區(qū)中的其余幀一并按正確的順序遞交高層。這種方法稱為選擇重發(fā)(SELECTICE REPEAT),其工作過程如圖所示。顯然,選擇重發(fā)減少了浪費,但要求接收方有足夠大的緩沖區(qū)空間。 2-2 選擇重傳協議原理圖三、過程論述(1)發(fā)送方程序流程圖:3-1發(fā)送方程序流程圖 (2)接收方程序流程圖:收到的包是否含有Push標志?收到包的序號與等待接收的序號是否一致?收到包的序號在接收窗口范圍內?NY直接提取數據,提前應用進程Y入接收隊列YN處理在接收隊列中的包(如果是普通包要判斷序號,或者

10、進行拆包,組包操作)結束N3-2接受方程序流程圖3.2 功能實現(1)發(fā)送方程序:本程序設有四個變量:一是窗口大小變量,二是第一幀序列號變量,三是最近發(fā)送的幀變量,最后一個是最近收到的確認幀變量。swpstate1.head=NULL; /變量初始值為空swpstate1.sendq=sendq_rear=(structsendq_slot*)malloc(sizeof(structsendq_slot);if(!swpstate1.sendq) exit(1);sendq_rear-next=NULL;printf(請輸入窗口大?。?;scanf(%ld,&swpstate1.sws); /

11、輸入窗口大小swpstate1.rws=swpstate1.sws; /把窗口大小的值賦給變量if (swpstate1.sws0) printf(請輸入第一幀的序列號:); scanf(%ld,&swpstate1.hdr.seqnum); /輸入第一幀序列號swpstate1.nfe=swpstate1.hdr.seqnum; /把第一幀的值放進緩沖池內sendp=(struct sendq_slot*) malloc (size of(struct sendq_slot); if(!sendp) exit(1);sendp-msg=swpstate1.hdr.seqnum;sendp-t

12、imeout=1;sendp-next=NULL;sendq_rear-next=sendp;sendq_rear=sendp;-swpstate1.sws;swpstate1.lfs=swpstate1.hdr.seqnum; /最近發(fā)送的幀取值swpstate1.lar=swpstate1.hdr.seqnum; /最近收到的確認幀取值dowhile(swpstate1.sws0) /當窗口大小大于0時,執(zhí)行以下的循環(huán)sendp=(struct sendq_slot*)malloc(sizeof(struct sendq_slot); if(!sendp) exit(1); sendp-m

13、sg=swpstate1.lfs+1; /如果輸入的幀序號大于之前幀序號,那么窗口向前滑動 sendp-timeout=1; /時延為1 sendp-next=NULL; sendq_rear-next=sendp; sendq_rear=sendp; -swpstate1.sws; +swpstate1.lfs;swpstate1.hdr.acknum=0; /ACK清空swpstate1.hdr.flags=0; /存儲緩沖池清空printf(最近收到的ACK的幀序號:%ldn,swpstate1.lar); /輸出最近收到的ACK幀序號printf(最近發(fā)送的幀序號(發(fā)送新幀后):%ld

14、n,swpstate1.lfs);/輸出最近發(fā)送幀序號(2)接收方的接收原則從總體上看是先判斷輸入的數據幀是否在接收范圍之內,若是,則繼續(xù)判斷是否符合其他接收條件;若不是,則馬上丟棄該數據幀,不再進行其他條件的判斷。struct sendq_slot *sendq_rear,*sendp,*p3,*p4; /設定變量struct recvq_slot *recvp,*recvq_rear,*p1,*p2; if(swpstate1.hdr.flags=0) /上次輸入的數據幀被放置在緩存區(qū),輸入區(qū)被清空 do /如果繼續(xù)接收數據幀則實施下面循環(huán) printf(請輸入收到的數據幀號:); sca

15、nf(%ld,&a); if(a=swpstate1.nfe&anext=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(所輸數據不在接收窗口內!); break; /跳出該循環(huán) (3)若輸入數據幀在接收范圍內則繼續(xù)判斷并進行以下循環(huán)。 recvp-msg=a; if(r

16、ecvp-msg=swpstate1.nfe) /是否放入緩存判斷 recvp-received=1; else recvp-received=0; -swpstate1.rws; if(recvp-received=1) /數據幀被接收,則進行下面語句 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) swp

17、state1.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號(期待的下一幀的序號):%ldn,swpstate1.nfe); printf(沒按序接受的序號:n); p1=swpstate1.head; while(p1!=NULL) printf(%ldt,p1-msg); p1=p1-next; (4)當接收完一個數據幀時,我們可以選擇終止下面的繼續(xù)接收,

18、也可以選擇繼續(xù)接收。如果繼續(xù)接收,那么程序跳到判斷循環(huán),繼續(xù)判斷是否接收下一個數據幀,原理與上面相當。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.sendq-next-msg) swpstate1.sendq-

19、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的幀序號(收到ACK后):%ldn,swpstate1.lar); printf(最近發(fā)送的幀序號(此時還未發(fā)送新的數據):%ldn,swpstate1.lfs); 四、結果分析滑動窗口

20、協議的基本原理就是在任意時刻,發(fā)送方都維持了一個連續(xù)的允許發(fā)送的幀的序號,稱為發(fā)送窗口;同時,接收方也維持了一個連續(xù)的允許接收的幀的序號,稱為接收窗口。發(fā)送窗口和接收窗口的序號的上下界不一定要一樣,甚至大小也可以不同。不同的滑動窗口協議窗口大小一般不同。發(fā)送方窗口內的序號代表了那些已經被發(fā)送,但是還沒有被確認的幀,或者是那些可以被發(fā)送的幀。接受方為其窗口內的每一個序號保留了一個緩沖區(qū)。與每個緩沖區(qū)相關聯的還有一位,用來指明該緩沖區(qū)是滿的還是空的。 若從滑動窗口的觀點來統一看待1比特滑動窗口、后退n及選擇重傳三種協議,它們的差別僅在于各自窗口尺寸的大小不同而已。1比特滑動窗口協議:發(fā)送窗口=1,接收窗口=1;后退N協議:發(fā)送窗口1,接收窗口=1;選擇重傳協議:發(fā)送窗口1,接收窗口五、結論(或總結)下面我以窗口大小為11,第一幀序列號為3,做程序的測試 圖5 測試結果(1)整體窗口展示,命令行界面 5-1圖(2)輸入窗口大小及第一幀序列號 5-2圖(3)當輸入的接收幀并不是ACK期待的幀,那么根據滑動窗口協議該幀不被接收,且把該幀存放在緩沖區(qū)。 5-3圖(4)若輸入的幀超過了窗口大小,那么系統會顯示該幀不在接收范圍內,并拒絕接收。 5-4圖 5-

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論