編程實(shí)現(xiàn)可靠數(shù)據(jù)傳輸原理GO-BAN-N實(shí)驗(yàn)報(bào)告_第1頁
編程實(shí)現(xiàn)可靠數(shù)據(jù)傳輸原理GO-BAN-N實(shí)驗(yàn)報(bào)告_第2頁
編程實(shí)現(xiàn)可靠數(shù)據(jù)傳輸原理GO-BAN-N實(shí)驗(yàn)報(bào)告_第3頁
編程實(shí)現(xiàn)可靠數(shù)據(jù)傳輸原理GO-BAN-N實(shí)驗(yàn)報(bào)告_第4頁
編程實(shí)現(xiàn)可靠數(shù)據(jù)傳輸原理GO-BAN-N實(shí)驗(yàn)報(bào)告_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

...wd......wd......wd...編程實(shí)現(xiàn)可靠數(shù)據(jù)傳輸原理GO-BACK-N實(shí)驗(yàn)姓名:吳杰學(xué)號(hào):13281144班級(jí):計(jì)科1306實(shí)驗(yàn)?zāi)康倪\(yùn)用各種變成語言實(shí)現(xiàn)基于Go-Back-N的可靠數(shù)據(jù)傳輸軟件實(shí)驗(yàn)意義通過本實(shí)驗(yàn),使學(xué)生能夠?qū)煽繑?shù)據(jù)傳輸原理有進(jìn)一步的理解和掌握。實(shí)驗(yàn)步驟利用java編程實(shí)現(xiàn)基于Go-Back-N的可靠數(shù)據(jù)傳輸軟件。運(yùn)行程序,程序?qū)⒛M實(shí)際網(wǎng)絡(luò)中的可靠數(shù)據(jù)傳輸結(jié)果分析通過本次實(shí)驗(yàn),了解了GBN傳輸協(xié)議的相關(guān)知識(shí)。實(shí)驗(yàn)代碼通過查閱資料很容易理解,但是怎么實(shí)現(xiàn)這個(gè)程序?qū)ξ襾碚f是個(gè)問題。附件JAVA語言代碼Sender類packageGBN;importjava.util.Timer;publicclassSenderextendsThread{publicintwindowsize=3; //發(fā)送方窗口長度設(shè)為3publicString[]data={"data1","data2","data3","data4","data5","data6","data7"};//模擬七個(gè)數(shù)據(jù)包publicintsign[]={0,1,2,3,4,5,6}; //為7個(gè)數(shù)據(jù)包標(biāo)號(hào)publicintlocalack=-1; //保存最近收到的ACKpublicTimerslitime=null; //定時(shí)器〔這里定為2秒〕publicintswitches=0; //超時(shí)標(biāo)志,1為超時(shí)publicintwindowsign[]; //當(dāng)前窗口內(nèi)待發(fā)的數(shù)據(jù)分組的序號(hào)publicintacksign=0;//為0表示收到正確ACK,為1表示收到錯(cuò)誤的ACK,必須重發(fā)! publicSender(){windowsign=newint[windowsize];//給窗口分配指定大小的空間for(inti=0;i<3;i++)windowsign[i]=sign[i]; //窗口初始化時(shí)存放前3個(gè)序號(hào) }publicvoidrun(){ System.out.println("發(fā)送方開場發(fā)送分組數(shù)據(jù)!"); }publicvoidgetack(intack){ System.out.println("發(fā)送方收到了ACK,序號(hào)為"+ack+"并且開場加以確認(rèn)!");if(ack!=localack+1){ System.out.println("經(jīng)歷證,這不是發(fā)送方正期待的ACK,立刻重發(fā)序號(hào)為"+(localack+1)+"的數(shù)據(jù)分組!");acksign=1; }else{localack=ack; //表示正確確認(rèn)了ACKacksign=0; } }publicvoidtime(){switches=0; //標(biāo)志初始化為0litime=newTimers(); Timerlimit=newTimer();limit.schedule(litime,0,100); }}Receiver類packageGBN;publicclassReceiverextendsThread{publicintlastdata;publicSendersender;publicvoidrun(Senders){sender=s; System.out.println("接收方開場接收分組數(shù)據(jù)!"); }voidreceive(intdata,Senders){sender=s; //發(fā)送方的參數(shù)傳遞 System.out.println("接收方收到了序號(hào)為"+data+"的分組!");if(data!=0){if(data==lastdata+1){ //數(shù)據(jù)包序號(hào)校驗(yàn),假設(shè)連續(xù)則是正確/所期待的 System.out.println("該數(shù)據(jù)分組正是接收方所期待的,接收方承受了它并準(zhǔn)備回送對(duì)應(yīng)的ACK!");lastdata=data; //更新本地保存的數(shù)據(jù)包序號(hào)變量 respond(lastdata); //回送該正確接收的數(shù)據(jù)包對(duì)應(yīng)的ACK }else{ System.out.println("該數(shù)據(jù)分組不是接收方所期待的,該分組將被丟棄,接收方準(zhǔn)備回送最后承受的數(shù)據(jù)分組對(duì)應(yīng)的ACK!"); respond(lastdata); //假設(shè)不是所期待的數(shù)據(jù)包則丟棄并且重發(fā)上一次的ACK } }else{ System.out.println("該數(shù)據(jù)分組正是接收方所期待的,接收方承受了它并準(zhǔn)備回送對(duì)應(yīng)的ACK!");lastdata=data; respond(lastdata); //首次接收數(shù)據(jù)包并且回送ACK } }voidrespond(intack){ //回送指定序號(hào)的ACKif(sender.litime.limit<20){ //判斷是否超時(shí)〔2秒〕ack=lastdata; //獲取本場保存的數(shù)據(jù)包序號(hào)sender.getack(ack); }else{ System.out.println("計(jì)時(shí)超時(shí)!!〔未丟包但是時(shí)間超過2秒〕發(fā)送方準(zhǔn)備重發(fā)序號(hào)為"+ack+"的數(shù)據(jù)分組!");sender.switches=1; //如果超時(shí),設(shè)置超時(shí)狀態(tài)并顯示警告 } }}Timers類packageGBN;importjava.util.TimerTask;publicclassTimersextendsTimerTask{publicintswitches;publicintlimit;publicvoidrun(){if(limit<20)limit++; //計(jì)時(shí)2秒else{switches=-1;this.cancel(); } //開關(guān)為-1表示超時(shí),并且停頓計(jì)時(shí)器 }publicTimers(){switches=0; //啟動(dòng)計(jì)時(shí)器時(shí)全部初始化limit=0; }}GBN類packageGBN;importjava.util.Random;importjava.io.*;publicclassGBNextendsThread{ staticvoidsenddelay(intx)throwsInterruptedException{ if(x==1){ sleep(300); System.out.println("發(fā)送數(shù)據(jù)分組時(shí)發(fā)生延遲:300毫秒!"); } elseif(x==2){ sleep(750);System.out.println("發(fā)送數(shù)據(jù)分組時(shí)發(fā)生延遲:750毫秒!"); } elseif(x==3){ sleep(1200); System.out.println("發(fā)送數(shù)據(jù)分組時(shí)發(fā)生延遲:1200毫秒!"); } elseif(x==4){ sleep(3000); System.out.println("發(fā)送數(shù)據(jù)分組時(shí)發(fā)生延遲:3000毫秒!"); } } publicstaticvoidmain(String[]args)throwsIOException,InterruptedException{ Senders=newSender(); Receiverre=newReceiver(); s.start(); //發(fā)送端啟動(dòng) re.run(s); //接收端啟動(dòng) sleep(1000); //延遲處理 int[]retimes=newint[7];//計(jì)算每個(gè)分組被發(fā)送的次數(shù) for(inti=0;i<7;i++) retimes[i]=0; //數(shù)據(jù)包順次發(fā)送 for(inti=0;i<=s.sign.length;i++){ while(i>s.localack+1){ //尚有未確認(rèn)的數(shù)據(jù)包,重發(fā)! System.out.println("發(fā)送方開場重新發(fā)送序號(hào)為"+(s.localack+1)+"的數(shù)據(jù)分組"); retimes[s.localack+1]++; intran=newRandom().nextInt(3); intrandelay=newRandom().nextInt(5); s.time(); senddelay(randelay); //設(shè)置隨機(jī)值,模擬數(shù)據(jù)傳輸延遲 if(ran!=1) re.receive(s.localack+1,s); //設(shè)置隨機(jī)值,模擬數(shù)據(jù)丟包過程 else System.out.println("序號(hào)為"+(s.localack+1)+"的分組在傳給接收方途中發(fā)生了丟包!"); } if(i!=s.sign.length){ System.out.println(); System.out.println("發(fā)送方現(xiàn)在開場第一次發(fā)送序號(hào)為"+i+"的數(shù)據(jù)分組"); retimes[i]++; if(i!=0){ for(intk=0;k<3;k++){ //表示至少成功發(fā)送并確認(rèn)了一個(gè)數(shù)據(jù)分組 s.windowsign[k]++; //這種情況下滑動(dòng)窗口向前移動(dòng)! } } System.out.println(); System.out.println("當(dāng)前窗口內(nèi)的分組情況為:"); //顯示當(dāng)前窗口內(nèi)數(shù)據(jù)包情況 for(intp=0;p<3;p++){ if(s.windowsign[p]<=6) System.out.println("第"+p+"號(hào)窗口里面存放的是序號(hào)為"+s.windowsign[p]+"的馬上待發(fā)送的數(shù)據(jù)分組!"); else System.out.println("第"+p+"號(hào)窗口已經(jīng)空了,并且后續(xù)窗口、發(fā)送方?jīng)]有要發(fā)送的數(shù)據(jù)分組了!"); } System.out.println(); intran=newRandom().nextInt(3); intrandelay=newRandom().nextInt(5); s.time(); //計(jì)時(shí)開場〔2秒時(shí)間〕 senddelay(randelay); //設(shè)置隨機(jī)值,模擬數(shù)據(jù)傳輸延遲 if(ran!=1)re.receive(s.sign[i],s); //設(shè)置隨機(jī)值,模擬數(shù)據(jù)丟包過程

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論