揚州大學計算機網(wǎng)絡(luò)課程設(shè)計模擬滑動窗口的實現(xiàn)_第1頁
揚州大學計算機網(wǎng)絡(luò)課程設(shè)計模擬滑動窗口的實現(xiàn)_第2頁
揚州大學計算機網(wǎng)絡(luò)課程設(shè)計模擬滑動窗口的實現(xiàn)_第3頁
揚州大學計算機網(wǎng)絡(luò)課程設(shè)計模擬滑動窗口的實現(xiàn)_第4頁
揚州大學計算機網(wǎng)絡(luò)課程設(shè)計模擬滑動窗口的實現(xiàn)_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、各專業(yè)全套優(yōu)秀畢業(yè)設(shè)計圖紙課程設(shè)計報告 課程:計算機通信與網(wǎng)絡(luò)題目:滑動窗口協(xié)議的模擬實現(xiàn) 班級: 物聯(lián)1301 學號: 131408119 姓名: 滕玲 一、 任務(wù)描述1. 深入理解計算機網(wǎng)絡(luò)中可靠傳輸?shù)膶崿F(xiàn)原理。 2. 編寫兩個程序:一個模擬提供可靠傳輸服務(wù)的發(fā)送實體;一個模擬提供可靠傳輸服務(wù)的接收實體。3. 撰寫課程設(shè)計報告二、可靠傳輸?shù)膶崿F(xiàn)原理1. 理想的數(shù)據(jù)傳輸:假定1:鏈路是理想的傳輸信道(不會出錯和丟失)假定2:不管發(fā)方以多快的速率發(fā)送數(shù)據(jù),收方總來得及收下,并及時上交主機(接收緩沖區(qū)容量無限大永不會溢出或收發(fā)速率精確相等)2.差錯控制方法=確認+重發(fā)a.為了防止數(shù)據(jù)傳輸中出錯,

2、在發(fā)送完一個分組后,必須暫時保留已發(fā)送的分組的副本,直到收到接收方的肯定確認。b.為了防止數(shù)據(jù)丟失,導(dǎo)致發(fā)送方死等,發(fā)送方在發(fā)出一個分組的同時,啟動一個計時器,如果超時還沒有收到確認,則主動重發(fā)。c.為了防止因確認丟失導(dǎo)致的重復(fù)接收,對每個協(xié)議數(shù)據(jù)單元編號,接收方通過編號判斷分組是否重復(fù)分組。 3.流量控制方法a.流量控制要求發(fā)送方根據(jù)接收方的能力調(diào)整發(fā)送速度。b.最保守的做法是每發(fā)出一個協(xié)議數(shù)據(jù)單元,僅當?shù)鹊浇邮辗降脑S可確認,再發(fā)送下一個協(xié)議數(shù)據(jù)單元。但是這樣做的話,發(fā)送效率很低。即使接收方足夠快,也要經(jīng)過兩點間傳播時延的2倍時間,才能發(fā)出去一個協(xié)議數(shù)據(jù)單元。c.可以不像上面一樣將接收方按最

3、壞情形設(shè)想,連續(xù)發(fā)送多個協(xié)議數(shù)據(jù)單元數(shù)。如果設(shè)想正確,在兩點間傳播時延的2倍時間內(nèi),就可以發(fā)送多個協(xié)議數(shù)據(jù)單元,提高發(fā)送效率。當然,由于發(fā)出去的每個協(xié)議數(shù)據(jù)單元都有可能遇到問題需要重發(fā),發(fā)送方必須設(shè)置多個發(fā)送緩沖區(qū)以保存副本,發(fā)送緩沖區(qū)的個數(shù)決定了發(fā)送速率。當緩沖區(qū)滿,即使有用戶請求到達,也不會發(fā)送。d.實用的可靠傳輸協(xié)議既要進行差錯控制,又要進行流量控制。流量控制的加入,給發(fā)送方實體增加了一種可能情形:當用戶發(fā)送請求到達,發(fā)送實體因為發(fā)送緩沖區(qū)滿,拒絕發(fā)送。e.滑動窗口協(xié)議實現(xiàn)了上述可靠傳輸原理。4.滑動窗口協(xié)議a.原理: 所有滑動窗口協(xié)議中,每個外出協(xié)議數(shù)據(jù)單元包含一個序號:0某一最大值,

4、如序號長度為n,最大值通常為2n-1。發(fā)送方在任何時刻,決定一個用戶請求是否被滿足的條件是是否有緩沖區(qū)存放副本。隨著數(shù)據(jù)的發(fā)送和確認的到達,已經(jīng)發(fā)出的協(xié)議數(shù)據(jù)單元和允許發(fā)送的協(xié)議數(shù)據(jù)單元的個數(shù)總等于發(fā)送緩沖區(qū)大小,并且它們的序號變化的規(guī)律如同在序號序列上滑動窗口一樣。而為了防止重復(fù)接收,接收方維持著已經(jīng)看到過的序號/期望看到的序號,隨著數(shù)據(jù)不斷到達,這個序號也不斷變化,變化的規(guī)律如同在序號序列上滑動窗口一樣。b.類型: 停等協(xié)議:發(fā)送窗口=1,接收窗口=1退后n幀協(xié)議:發(fā)送窗口1,接收窗口=1選擇重傳協(xié)議:發(fā)送窗口 1,接收窗口1三、發(fā)送方模擬程序的設(shè)計與實現(xiàn)swpstate1.head=nu

5、ll; /變量初始值為空swpstate1.sendq=sendq_rear=(structsendq_slot*)malloc(sizeof(structsendq_slot);if(!swpstate1.sendq) exit(1);sendq_rear-next=null;printf(請輸入窗口大?。?;scanf(%ld,&swpstate1.sws); /輸入窗口大小swpstate1.rws=swpstate1.sws; /把窗口大小的值賦給變量if (swpstate1.sws0) printf(請輸入第一幀的序列號:); scanf(%ld,&swpstate1.hdr.se

6、qnum); /輸入第一幀序列號swpstate1.nfe=swpstate1.hdr.seqnum; /把第一幀的值放進緩沖池內(nèi)sendp=(struct sendq_slot*) malloc (size 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;

7、/最近發(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-msg=swpstate1.lfs+1; /如果輸入的幀序號大于之前幀序號,那么窗口向前滑動 sendp-timeout=1; /時延為1 sendp-next=null; sendq_rear-next=sendp; sendq_

8、rear=sendp; -swpstate1.sws; +swpstate1.lfs;swpstate1.hdr.acknum=0; /ack清空swpstate1.hdr.flags=0; /存儲緩沖池清空printf(最近收到的ack的幀序號:%ldn,swpstate1.lar); /輸出最近收到的ack幀序號printf(最近發(fā)送的幀序號(發(fā)送新幀后):%ldn,swpstate1.lfs);/輸出最近發(fā)送幀序號四、接收方模擬程序的設(shè)計與實現(xiàn)1. 接收方的接收原則從總體上看是先判斷輸入的數(shù)據(jù)幀是否在接收范圍之內(nèi),若是,則繼續(xù)判斷是否符合其他接收條件;若不是,則馬上丟棄該數(shù)據(jù)幀,不再進行

9、其他條件的判斷。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ù)幀則實施下面循環(huán) printf(請輸入收到的數(shù)據(jù)幀號:); scanf(%ld,&a); if(a=swpstate1.nfe&anext=null; swpstate1.head=recvp; else if(swpstate1.head!=null) recvp

10、=(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; /跳出該循環(huán) 2. 若輸入數(shù)據(jù)幀在接收范圍內(nèi)則繼續(xù)判斷并進行以下循環(huán)。 recvp-msg=a; if(recvp-msg=swpstate1.nfe) /是否放入緩存判斷 recvp-received=1; else recvp-received=0; -swpstate1.rws; if(recvp-

11、received=1) /數(shù)據(jù)幀被接收,則進行下面語句 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; swpstate1.hdr.acknum=a+1;

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

13、gs=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-next=p3; else swpstate1.sendq-next=p3; swpstate1.sws=swpstate1.sws+(swpstate1.sendq-next-msg-swpstat

14、e1.lar); swpstate1.lar=swpstate1.sendq-next-msg; swpstate1.hdr.seqnum=swpstate1.hdr.acknum; printf(最近收到的ack的幀序號(收到ack后):%ldn,swpstate1.lar); printf(最近發(fā)送的幀序號(此時還未發(fā)送新的數(shù)據(jù)):%ldn,swpstate1.lfs); 五、總結(jié)1. 程序改進與完善該滑動窗口協(xié)議模擬程序還有進一步完善的余地,例如可以對以下一些地方進行改進:a. 改模擬程序通過命令行來實行,缺少形象直觀的界面,希望日后可以設(shè)計比較簡單明了的界面來展示程序的主要模擬功能。b

15、. 現(xiàn)在我們模擬的只是一些用序號代名的簡單的幀,建議可以改善程序,使該系統(tǒng)可以模擬更接近真實的數(shù)據(jù)幀。這樣可以聯(lián)系實際更直觀地去驗證滑動窗口協(xié)議。c. 整體來說,滑動窗口在實驗中是固定的,這樣便于處理幀號和ack的確認以及存儲。但建議可以在日后改進使其變成動態(tài)的。2. 設(shè)計總結(jié)以上為我所設(shè)計的滑動窗口模擬程序。在程序設(shè)計時,我首先了解了其相關(guān)原理并且參考了很多與此有關(guān)的書籍。例如,李建中和張冬冬的滑動窗口規(guī)模的動態(tài)調(diào)整算法,王栩、李建中、王偉平的基于滑動窗口的數(shù)據(jù)流壓縮技術(shù)及連續(xù)查詢處理方法等等。與此同時我還向同學請教了很多問題,它經(jīng)過多次修改和整理,可以基本實現(xiàn)所需功能,但因為水平有限,此程

16、序中也存在一定的問題,這需要以后更進一步的改進。我希望通過本次的課程設(shè)計能夠端正我的學習態(tài)度,鍛煉我的文字表達和語言表達能力,提高我的動手實踐能力。附源程序:#include #include #include main() struct swphdr unsigned long seqnum; unsigned long acknum; unsigned short flags; /*flag=0表示這是一個數(shù)據(jù)幀,flag=1表示這是一個ack幀*/ ; struct sendq_slot unsigned short timeout;/*1時表示計時啟動,0時表示已收到確認*/ unsi

17、gned long msg; struct sendq_slot *next; ; struct recvq_slot unsigned short received;/*1表示順序接收,0表示錯序接受*/ unsigned long msg; struct recvq_slot *next; ; struct swpstate unsigned long lar; unsigned long lfs; unsigned long sws; struct swphdr hdr; unsigned long rws; struct sendq_slot *sendq; unsigned long

18、 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=(struct sendq_slot*)malloc(sizeof(struct sendq_slot); if(!swpstate1.sendq) exit(1)

19、; sendq_rear-next=null; printf(請輸入窗口大?。?; scanf(%ld,&swpstate1.sws); swpstate1.rws=swpstate1.sws; if (swpstate1.sws0) printf(請輸入第一幀的序列號:); scanf(%ld,&swpstate1.hdr.seqnum); swpstate1.nfe=swpstate1.hdr.seqnum; sendp=(struct sendq_slot*)malloc(sizeof(struct sendq_slot); if(!sendp) exit(1); sendp-msg=s

20、wpstate1.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 while(swpstate1.sws0) sendp=(struct sendq_slot*)malloc(sizeof(struct sendq_slot); if(!sendp) exit(1); sendp-msg=s

21、wpstate1.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的幀序號:%ldn,swpstate1.lar); printf(最近發(fā)送的幀序號(發(fā)送新幀后):%ldn,swpstate1.lfs); /*接收*/ if(swpstate1.hdr.flags=0) do printf(請輸

22、入收到的數(shù)據(jù)幀號:); scanf(%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(所輸數(shù)據(jù)不在接收窗口內(nèi)!); break; recvp-msg=a; if(recvp-msg=swpstate1.nf

23、e) 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) 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號(期

溫馨提示

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

評論

0/150

提交評論