版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、各專業(yè)全套優(yōu)秀畢業(yè)設(shè)計圖紙課程設(shè)計報告 課程:計算機(jī)通信與網(wǎng)絡(luò)題目:滑動窗口協(xié)議的模擬實(shí)現(xiàn) 班級: 物聯(lián)1301 學(xué)號: 131408119 姓名: 滕玲 一、 任務(wù)描述1. 深入理解計算機(jī)網(wǎng)絡(luò)中可靠傳輸?shù)膶?shí)現(xiàn)原理。 2. 編寫兩個程序:一個模擬提供可靠傳輸服務(wù)的發(fā)送實(shí)體;一個模擬提供可靠傳輸服務(wù)的接收實(shí)體。3. 撰寫課程設(shè)計報告二、可靠傳輸?shù)膶?shí)現(xiàn)原理1. 理想的數(shù)據(jù)傳輸:假定1:鏈路是理想的傳輸信道(不會出錯和丟失)假定2:不管發(fā)方以多快的速率發(fā)送數(shù)據(jù),收方總來得及收下,并及時上交主機(jī)(接收緩沖區(qū)容量無限大永不會溢出或收發(fā)速率精確相等)2.差錯控制方法=確認(rèn)+重發(fā)a.為了防止數(shù)據(jù)傳輸中出錯,
2、在發(fā)送完一個分組后,必須暫時保留已發(fā)送的分組的副本,直到收到接收方的肯定確認(rèn)。b.為了防止數(shù)據(jù)丟失,導(dǎo)致發(fā)送方死等,發(fā)送方在發(fā)出一個分組的同時,啟動一個計時器,如果超時還沒有收到確認(rèn),則主動重發(fā)。c.為了防止因確認(rèn)丟失導(dǎo)致的重復(fù)接收,對每個協(xié)議數(shù)據(jù)單元編號,接收方通過編號判斷分組是否重復(fù)分組。 3.流量控制方法a.流量控制要求發(fā)送方根據(jù)接收方的能力調(diào)整發(fā)送速度。b.最保守的做法是每發(fā)出一個協(xié)議數(shù)據(jù)單元,僅當(dāng)?shù)鹊浇邮辗降脑S可確認(rèn),再發(fā)送下一個協(xié)議數(shù)據(jù)單元。但是這樣做的話,發(fā)送效率很低。即使接收方足夠快,也要經(jīng)過兩點(diǎn)間傳播時延的2倍時間,才能發(fā)出去一個協(xié)議數(shù)據(jù)單元。c.可以不像上面一樣將接收方按最
3、壞情形設(shè)想,連續(xù)發(fā)送多個協(xié)議數(shù)據(jù)單元數(shù)。如果設(shè)想正確,在兩點(diǎn)間傳播時延的2倍時間內(nèi),就可以發(fā)送多個協(xié)議數(shù)據(jù)單元,提高發(fā)送效率。當(dāng)然,由于發(fā)出去的每個協(xié)議數(shù)據(jù)單元都有可能遇到問題需要重發(fā),發(fā)送方必須設(shè)置多個發(fā)送緩沖區(qū)以保存副本,發(fā)送緩沖區(qū)的個數(shù)決定了發(fā)送速率。當(dāng)緩沖區(qū)滿,即使有用戶請求到達(dá),也不會發(fā)送。d.實(shí)用的可靠傳輸協(xié)議既要進(jìn)行差錯控制,又要進(jìn)行流量控制。流量控制的加入,給發(fā)送方實(shí)體增加了一種可能情形:當(dāng)用戶發(fā)送請求到達(dá),發(fā)送實(shí)體因?yàn)榘l(fā)送緩沖區(qū)滿,拒絕發(fā)送。e.滑動窗口協(xié)議實(shí)現(xiàn)了上述可靠傳輸原理。4.滑動窗口協(xié)議a.原理: 所有滑動窗口協(xié)議中,每個外出協(xié)議數(shù)據(jù)單元包含一個序號:0某一最大值,
4、如序號長度為n,最大值通常為2n-1。發(fā)送方在任何時刻,決定一個用戶請求是否被滿足的條件是是否有緩沖區(qū)存放副本。隨著數(shù)據(jù)的發(fā)送和確認(rèn)的到達(dá),已經(jīng)發(fā)出的協(xié)議數(shù)據(jù)單元和允許發(fā)送的協(xié)議數(shù)據(jù)單元的個數(shù)總等于發(fā)送緩沖區(qū)大小,并且它們的序號變化的規(guī)律如同在序號序列上滑動窗口一樣。而為了防止重復(fù)接收,接收方維持著已經(jīng)看到過的序號/期望看到的序號,隨著數(shù)據(jù)不斷到達(dá),這個序號也不斷變化,變化的規(guī)律如同在序號序列上滑動窗口一樣。b.類型: 停等協(xié)議:發(fā)送窗口=1,接收窗口=1退后n幀協(xié)議:發(fā)送窗口1,接收窗口=1選擇重傳協(xié)議:發(fā)送窗口 1,接收窗口1三、發(fā)送方模擬程序的設(shè)計與實(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; /把第一幀的值放進(jìn)緩沖池內(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; /最近收到的確認(rèn)幀取值dowhile(swpstate1.sws0) /當(dāng)窗口大小大于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è)計與實(shí)現(xiàn)1. 接收方的接收原則從總體上看是先判斷輸入的數(shù)據(jù)幀是否在接收范圍之內(nèi),若是,則繼續(xù)判斷是否符合其他接收條件;若不是,則馬上丟棄該數(shù)據(jù)幀,不再進(jìn)行
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ù)幀則實(shí)施下面循環(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ù)判斷并進(jìn)行以下循環(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ù)幀被接收,則進(jìn)行下面語句 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. 當(dāng)接收完一個數(shù)據(jù)幀時,我們可以選擇終止下面的繼續(xù)接收,也可以選擇繼續(xù)接收。如果繼續(xù)接收,那么程序跳到判斷循環(huán),繼續(xù)判斷是否接收下一個數(shù)據(jù)幀,原理與上面相當(dāng)。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. 程序改進(jìn)與完善該滑動窗口協(xié)議模擬程序還有進(jìn)一步完善的余地,例如可以對以下一些地方進(jìn)行改進(jìn):a. 改模擬程序通過命令行來實(shí)行,缺少形象直觀的界面,希望日后可以設(shè)計比較簡單明了的界面來展示程序的主要模擬功能。b
15、. 現(xiàn)在我們模擬的只是一些用序號代名的簡單的幀,建議可以改善程序,使該系統(tǒng)可以模擬更接近真實(shí)的數(shù)據(jù)幀。這樣可以聯(lián)系實(shí)際更直觀地去驗(yàn)證滑動窗口協(xié)議。c. 整體來說,滑動窗口在實(shí)驗(yàn)中是固定的,這樣便于處理幀號和ack的確認(rèn)以及存儲。但建議可以在日后改進(jìn)使其變成動態(tài)的。2. 設(shè)計總結(jié)以上為我所設(shè)計的滑動窗口模擬程序。在程序設(shè)計時,我首先了解了其相關(guān)原理并且參考了很多與此有關(guān)的書籍。例如,李建中和張冬冬的滑動窗口規(guī)模的動態(tài)調(diào)整算法,王栩、李建中、王偉平的基于滑動窗口的數(shù)據(jù)流壓縮技術(shù)及連續(xù)查詢處理方法等等。與此同時我還向同學(xué)請教了很多問題,它經(jīng)過多次修改和整理,可以基本實(shí)現(xiàn)所需功能,但因?yàn)樗接邢蓿顺?/p>
16、序中也存在一定的問題,這需要以后更進(jìn)一步的改進(jìn)。我希望通過本次的課程設(shè)計能夠端正我的學(xué)習(xí)態(tài)度,鍛煉我的文字表達(dá)和語言表達(dá)能力,提高我的動手實(shí)踐能力。附源程序:#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時表示已收到確認(rèn)*/ 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 開礦鏟車出售合同范例
- 定制軟件銷售合同范例
- 延期采購合同范例
- 拆招牌施工合同范例
- 中介房產(chǎn)合同范例
- 平房抵押貸款合同模板
- 微店合作合同模板
- 房租租賃合同范例封面
- 工業(yè)尿素銷售合同范例
- 個體商戶合同范例
- 小學(xué)生主題班會開學(xué)第一課學(xué)習(xí)奧運(yùn)精神 爭做強(qiáng)國少年 課件
- 上海市豐鎮(zhèn)中學(xué)2024-2025學(xué)年九年級上學(xué)期分層練習(xí)數(shù)學(xué)試題(無答案)
- 文件評審表(標(biāo)準(zhǔn)樣本)
- 醫(yī)療輔助服務(wù)行業(yè)發(fā)展前景與機(jī)遇展望報告
- 1 小熊購物 (教學(xué)設(shè)計)-2024-2025學(xué)年數(shù)學(xué)三年級上冊北師大版
- (2024年)新人教版部編一年級道德與法治教材解讀5
- 跨學(xué)科主題學(xué)習(xí)-美化校園(課件) 2024-2025學(xué)年七年級地理(人教版2024)
- 2024年醫(yī)師定期考核必刷題庫附含參考答案
- 經(jīng)外周靜脈穿刺中心靜脈置管(PICC)操作技術(shù)專家共識解讀
- 財富:2024年《財富》世界500 強(qiáng)排行榜
- 2024年大學(xué)生安全知識競賽考試題庫500題(含答案)
評論
0/150
提交評論