版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)報(bào)告 GBN和路由算法姓名:房皓學(xué)號(hào):13410801教師:尹輝GBN模擬實(shí)驗(yàn)實(shí)驗(yàn)?zāi)康倪\(yùn)用java編程語(yǔ)言實(shí)現(xiàn)基于Go-Back-N的可靠數(shù)據(jù)傳輸軟件。實(shí)驗(yàn)意義通過(guò)本實(shí)驗(yàn),使學(xué)生能夠?qū)煽繑?shù)據(jù)傳輸原理有進(jìn)步的理通過(guò)本實(shí)驗(yàn),使學(xué)生能夠?qū)煽繑?shù)據(jù)傳輸原理有進(jìn)步的理解和掌握。實(shí)驗(yàn)背景Go-Back-N的有限狀態(tài)機(jī)模型表示如下圖所示:rdt_send(data)if(nextseqnum<base+N){computeQhksummake_pkt(srdpktfnextseqnum))Tnextseqnum,data;chksum^lidt_send(sndpktfnextseqnumj)if(base==nextseqnum)starljimernextseqnum=nextseqnum+1rdt_rcv(rcv_pl<t)&¬corrupt(rcvpkt)base=getacknum(rvcpkt)+1if(base==nextseqnum)stopjimerelsestarttimerelserdt_rcv(rcv_pl<t)&¬corrupt(rcvpkt)base=getacknum(rvcpkt)+1if(base==nextseqnum)stopjimerelsestarttimerelserefuse_data(dEq)timeoutstarttimerudt_send(sndpkt(base))udt_send(sndpkt(base+l)udt_send(sndpkUnextseqnum-l))(a)defaultudt_send(sndpkt)rdt_rcv(rcvpkt)&&defaultudt_send(sndpkt)notcorrupt(rcvpkt)&&hasseqnum(rcvpkt,expectedseqnum)extract(rcvpkt,data)deliver_data(data)make_pkt(sndpkt,ACK,expectedseqnum)udt_send(sndpkt)(b)圖為Go-Back-N的有限狀態(tài)機(jī)模型(劣)發(fā)送端(b)接受端實(shí)驗(yàn)步驟(1) 選擇java編程語(yǔ)言編程實(shí)現(xiàn)基于Go-Back-N的可靠數(shù)據(jù)傳輸軟件。(2) 在實(shí)際網(wǎng)絡(luò)環(huán)境或模擬不可靠網(wǎng)絡(luò)環(huán)境中測(cè)試和驗(yàn)證自己的可靠數(shù)據(jù)傳輸軟件。實(shí)驗(yàn)環(huán)境(1) 實(shí)驗(yàn)語(yǔ)言:JAVA(2) 實(shí)驗(yàn)平臺(tái):Eclipse(3) 引用庫(kù)函數(shù):隨機(jī)(Random)庫(kù)、計(jì)時(shí)庫(kù)(Timer)類概覽與描述(1)Sender類:繼承于Thread(線程)類,模擬發(fā)送方的一切功能,主要功能函數(shù)有:Publicvoidrun() 啟動(dòng)函數(shù),標(biāo)識(shí)開(kāi)始發(fā)送數(shù)據(jù)包Sender() 構(gòu)造函數(shù),分配并初始化窗口值Publicvoidgetack(intack) ACK接收函數(shù),接收接收方返回的ACK并進(jìn)行驗(yàn)證是否為期待的ACK值(若不是,則重發(fā))D.Publicvoidtime() 定時(shí)器函數(shù),初始化定時(shí),計(jì)時(shí)并記錄超時(shí)與否的狀態(tài)Receiver類:繼承于Thread(線程)類,模擬接收方的一切功能,主要功能函數(shù)有:Publicvoidrun() 啟動(dòng)函數(shù),標(biāo)識(shí)開(kāi)始等待并接收數(shù)據(jù)包VoidReceive(intdata,Senders) 數(shù)據(jù)包接收函數(shù),功能強(qiáng)大!主要包括:接收數(shù)據(jù)包,驗(yàn)證數(shù)據(jù)包,判斷與丟棄數(shù)據(jù)包,發(fā)送ack等Timers類:繼承于TimerTask(計(jì)時(shí)器)類,具有自定義定時(shí)與超時(shí)提醒的功能,主要功能函數(shù)有:Publicvoidrun() 啟動(dòng)函數(shù),標(biāo)識(shí)開(kāi)始計(jì)時(shí)(這里預(yù)設(shè)的是2秒的時(shí)間),超時(shí)后提醒并且停止計(jì)時(shí)器PublicTimers() 構(gòu)造函數(shù),清0計(jì)時(shí)器,等待下一次啟動(dòng)GBN類:繼承于Thread(線程)類,是主函數(shù)類,具有本程序的核心功能,這里先作一部分簡(jiǎn)單介紹,主要函數(shù)功能有:A.Staticvoidsenddelay(intx)throwsInterruptedExceptionPublicTimers() 隨機(jī)延遲函數(shù),模擬數(shù)據(jù)包發(fā)送傳輸過(guò)程中的隨機(jī)延遲,常用延遲值分別為:300ms,750ms,1200ms,3000ms等B. Publicstaticvoidmain(String[]args)throwslOException,InterruptedException() 主函數(shù),功能強(qiáng)大,主要包含以下幾大方面:開(kāi)啟發(fā)送端與接收端(包括計(jì)時(shí)器)超時(shí)或者ACK不匹配等情況導(dǎo)致的發(fā)送方重新發(fā)送數(shù)據(jù)包(第一次)發(fā)送當(dāng)前窗口內(nèi)的數(shù)據(jù)包隨機(jī)函數(shù)模擬數(shù)據(jù)包發(fā)送過(guò)程中的丟包情況實(shí)時(shí)更新與顯示當(dāng)前窗口內(nèi)的數(shù)據(jù)包情況統(tǒng)計(jì)每一個(gè)數(shù)據(jù)包被發(fā)送過(guò)的次數(shù)(含重發(fā))并最終顯示出來(lái)C.staticvoidOutputWindow(Senders) 輸出C.當(dāng)前窗口狀態(tài)函數(shù)。代碼展示與描述(一)Sender類importjava.util.Timer;publicclassSenderextendsThread{publicintwindowsize=4; //發(fā)送方窗口長(zhǎng)度設(shè)為3publicString[]data={"data1","data2","data3",
〃模擬七個(gè)數(shù)據(jù)包〃為7個(gè)數(shù)據(jù)包標(biāo)號(hào)〃保存最近收到的ACK//定時(shí)器(這里定為2〃模擬七個(gè)數(shù)據(jù)包〃為7個(gè)數(shù)據(jù)包標(biāo)號(hào)〃保存最近收到的ACK//定時(shí)器(這里定為2秒)〃超時(shí)標(biāo)志,1為超時(shí)〃當(dāng)前窗口內(nèi)待發(fā)的數(shù)據(jù)分組的序號(hào)〃為0表示收到正確ACK,為1表示收publicpublicpublicpublicpublicintsign[]={0,1,2,3,4,5,6};publicpublicpublicpublicpublicintlocalack=-1;Timerslitime=null;intswitches=0;intwindowsign[];publicintacksign[]={1,1,1,1,1,1,1};到錯(cuò)誤的ACK,必須重發(fā)!publicintsent[]={1,1,1,1,1,1,1};//發(fā)送標(biāo)記,1未發(fā)送,0已發(fā)送publicintacknowledged[]={1,1,1,1,1,1,1};//接收標(biāo)記,1未接收,0已接收publicSender(){windowsign=newint[windowsize];〃給窗口分配指定大小的空間for(inti=0;i<windowsize;i++)windowsign[i]=sign[i]; 〃窗口初始化時(shí)存放前3個(gè)序號(hào)}publicvoidrun(){System.out.println("發(fā)送方:現(xiàn)在開(kāi)始發(fā)送分組數(shù)據(jù)!”);}publicvoidgetack(intack){System.out.println("發(fā)送方:收到了ACK,序號(hào)為"+ack+",現(xiàn)在開(kāi)始確認(rèn)!");if(ack!=localack+1){System.out.println("發(fā)送方:經(jīng)驗(yàn)證,這不是發(fā)送方正期待的ACK,即將重發(fā)序號(hào)為"+(localack+1)+”的數(shù)據(jù)分組!”);//acksign[localack+1]=1;}else{localack=ack; //表示正確確認(rèn)了ACKacksign[localack]=0;}}publicvoidtime(){switches=0; //標(biāo)志初始化為0litime=newTimers();Timerlimit=newTimer();limit.schedule(litime,0,100);}}(二)Receiver類importjava.util.Random;publicclassReceiverextendsThread{publicintlastdata=-1;publicintexpectdata;publicSendersender;publicvoidrun(Senders)(sender=s;System.out.println("接收方:現(xiàn)在接收分組數(shù)據(jù)!”);}voidreceive(intdata,Senders)(sender=s; //發(fā)送方的參數(shù)傳遞System.out.println("接收方:收到了序號(hào)為"+data+”的分組!”);if(data==lastdata+1){〃數(shù)據(jù)包序號(hào)校驗(yàn),若連續(xù)則是正確/所期待的System.out.println("接收方:該數(shù)據(jù)分組正是所期待的,接受它并準(zhǔn)備回送對(duì)應(yīng)的ACK!");if(sender.litime.limit<20){〃判斷是否超時(shí)(2秒)號(hào)變量lastdata++;//更新本地保存的數(shù)據(jù)包序//ack=lastdata;sender.getack(lastdata);〃獲取本場(chǎng)保存的數(shù)據(jù)包序號(hào)}else{expectdata=lastdata+1;System.out.println("發(fā)送方:計(jì)時(shí)超時(shí)??!(未丟包但是時(shí)間超過(guò)2秒)即將重發(fā)序號(hào)為"+expectdata+”的數(shù)據(jù)分組!”);//sender.acksign[lastdata+1]=1;sender.switches=1; 〃如果超時(shí),設(shè)置超時(shí)狀態(tài)并顯示警告}//lastdata=data; 〃更新本地保存的數(shù)據(jù)包序號(hào)變量//respond(lastdata+1);//回送該正確接收的數(shù)據(jù)包對(duì)應(yīng)的ACK}else{System.out.println("接收方:該數(shù)據(jù)分組不是接收方所期待的,該分組將被丟棄,接收方準(zhǔn)備回送最后接受的數(shù)據(jù)分組對(duì)應(yīng)的ACK!");//respond(lastdata);〃若不是所期待的數(shù)據(jù)包則丟棄并且重發(fā)上一次的ACKif(sender.litime.limit<20){ //判斷是否超時(shí)(2秒)sender.getack(lastdata);}else{expectdata=lastdata+1;System.out.println("發(fā)送方:計(jì)時(shí)超時(shí)??!(未丟包但是時(shí)間超過(guò)2秒)發(fā)送方即將重發(fā)序號(hào)為"+expectdata+”的數(shù)據(jù)分組!”);sender.switches=1; 〃如果超時(shí),設(shè)置超時(shí)狀態(tài)并顯示警告}}}}Timers類importjava.util.TimerTask;publicclassTimersextendsTimerTask{publicintswitches;publicintlimit;publicvoidrun(){if(limit<20)limit++; 〃計(jì)時(shí)2秒else{switches=-1;}thiS.CanCel(); 〃開(kāi)關(guān)為-1表示超時(shí),并且停止計(jì)時(shí)器}publicTimers(){System.out.println("發(fā)送方:現(xiàn)在開(kāi)始計(jì)時(shí)");switches=0; 〃啟動(dòng)計(jì)時(shí)器時(shí)全部初始化limit=0;}}GBN類import.*;importjava.util.Random;importjava.io.*;publicclassGBNextendsThread{staticvoidsenddelay(intx,inty)throwsInterruptedException{if(x==1){sleep(300);System.out.println("發(fā)送數(shù)據(jù)分組"+y+"時(shí)發(fā)生延遲:300毫秒!");}elseif(x==2){sleep(750);System.out.println("發(fā)送數(shù)據(jù)分組"+y+"時(shí)發(fā)生延遲:750毫秒!");}elseif(x==3){sleep(1200);System.out.println("發(fā)送數(shù)據(jù)分組"+y+"時(shí)發(fā)生延遲:1200毫秒!");}elseif(x==4){sleep(2500);System.out.println("發(fā)送數(shù)據(jù)分組"+y+"時(shí)發(fā)生延遲:2500毫秒!");}elseif(x==5){sleep(3000);System.out.println("發(fā)送數(shù)據(jù)分組"+y+"時(shí)發(fā)生延遲:3000毫秒!");}
else;OutputWindow(Senders)(}staticvoidOutputWindow(Senders)(for(intk=0;k<s.for(int〃表示至少成功發(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<s.windowsize;p++){if(s.windowsign[p]<=6)if(s.sent[s.windowsign[p]]==0){//System.out.println("第"+p+"號(hào)窗口里面存放的是序號(hào)為"+s.windowsign[p]+”的待確認(rèn)的數(shù)據(jù)分組!”);}elseSystem.out.println("第"+p+"號(hào)窗口里面存放的是序號(hào)為"+s.windowsign[p]+”的待發(fā)送的數(shù)據(jù)分組!");elseSystem.out.println("第"+p+"號(hào)窗口已經(jīng)空了,并且后續(xù)窗口、發(fā)送方?jīng)]有要發(fā)送的數(shù)據(jù)分組了!");}System.out.println();}publicstaticvoidmain(String[]args)throwsIOException,InterruptedException{Senders=newSender();〃發(fā)送端啟動(dòng)〃接收端啟動(dòng)〃延遲處理Receiverre=〃發(fā)送端啟動(dòng)〃接收端啟動(dòng)〃延遲處理s.start();re.run(s);sLeep(1000);//int[]retimes=newint[7];〃計(jì)算每個(gè)分組被發(fā)送的次數(shù)〃數(shù)據(jù)包順次發(fā)送//for(inti=0;i<7;i++)retimes[i]=0;〃數(shù)據(jù)包順次發(fā)送for(inti=0;i<=s.sign.length;){while(i>s.localack+1){ 〃尚有未確認(rèn)的數(shù)據(jù)包,重發(fā)!System.out.println("發(fā)送方:現(xiàn)在發(fā)送序號(hào)為"+(s.localack+1)+"的數(shù)據(jù)分組");//retimes[s.localack+1]++;intran=newRandom().nextInt(4);
intrandelay=newRandom().nextInt(6);s.time();senddeLay(randelay,s.localack+1);//設(shè)置隨機(jī)值,模擬數(shù)據(jù)傳輸延遲if(ran!=1){re.receive(s.localack+1,s);〃設(shè)置隨機(jī)值,模擬數(shù)據(jù)丟包過(guò)程if(s.localack>=0)if(s.acksign[s.localack]==0){if(s.localack+3<=6)s.sent[s.localack+3]=0;Outputwindow(s);}}elseSystem.out.println("序號(hào)為"+(s.localack+1)+"的分組在傳給接收方途中發(fā)生了丟包!");}if(i!=s.sign.length){if(i==0){System.out.println();");System.out.println(”發(fā)送方:現(xiàn)在發(fā)送序號(hào)為0~2的數(shù)據(jù)分組s.sent[0]=0;s.sent[1]=0;s.sent[2]=0;System.out.println();intran1=newRandom().nextInt(4);intrandelay1=newRandom().nextInt(6);s.time(); 〃計(jì)時(shí)開(kāi)始(2秒時(shí)間)senddeLay(randelay1,0); //設(shè)置隨機(jī)值,模擬數(shù)據(jù)傳輸延遲if(ran1!=1){re.receive(s.sign[0],s);//設(shè)置隨機(jī)值,模擬數(shù)據(jù)丟包過(guò)程if(s.acksign[0]==0){s.sent[3]=0;s.acknowledged[0]=0;Outputwindow(s);}}elseSystem.out.println("序號(hào)為"+"0"+”的分組在傳給接收方途中發(fā)生了丟包!");i++;//retimes[0]++;intran2=newRandom().nextInt(4);intrandelay2=newRandom().nextInt(6);s.time(); 〃計(jì)時(shí)開(kāi)始(2秒時(shí)間)senddeLay(randelay2,1); //設(shè)置隨機(jī)值,模擬數(shù)據(jù)傳輸延遲if(ran2!=1){re.receive(s.sign[1],s);〃設(shè)置隨機(jī)值,模擬數(shù)據(jù)丟包過(guò)程if(s.acksign[1]==0){s.sent[4]=0;//retimes[4]++;s.acknowledged[1]=0;Outputwindow(s);}}elseSystem.out.println("序號(hào)為"+"1"+”的分組在傳給接收方途中發(fā)生了丟包!");i++;//retimes[1]++;intran3=newRandom().nextInt(4);intrandelay3=newRandom().nextInt(6);s.time(); 〃計(jì)時(shí)開(kāi)始(2秒時(shí)間)senddeLay(randelay3,2); //設(shè)置隨機(jī)值,模擬數(shù)據(jù)傳輸延遲if(ran3!=1){re.receive(s.sign[2],s);//設(shè)置隨機(jī)值,模擬數(shù)據(jù)丟包過(guò)程if(s.acksign[2]==0){s.sent[5]=0;//retimes[5]++;s.acknowledged[2]=0;Outputwindow(s);}}elseSystem.out.println("序號(hào)為"+"2"+”的分組在傳給接收方途中發(fā)生了丟包!");i++;//retimes[2]++;}else{System.out.println();if(s.sent[i]==0)(System.out.println(”發(fā)送方:現(xiàn)在發(fā)送序號(hào)為"+i+”的數(shù)據(jù)分組”);}elseSystem.out.println("發(fā)送方:現(xiàn)在發(fā)送序號(hào)為"+i+”的數(shù)據(jù)分組”);intran=newRandom().nextInt(4);intrandelay=newRandom().nextInt(6);s.time(); 〃計(jì)時(shí)開(kāi)始(2秒時(shí)間)senddetqy(randelay,i); 〃設(shè)置隨機(jī)值,模擬數(shù)據(jù)傳輸延遲if(ran!=1){re.receive(s.sign[i],s);//設(shè)置隨機(jī)值,模擬數(shù)據(jù)丟包過(guò)程if(s.acksign[i]==0){if(i+3<=6){s.sent[i+3]=0;//System.out.println("發(fā)送方現(xiàn)在發(fā)送序號(hào)為"+(i+3)+"的數(shù)據(jù)分組");}s.acknowledged[i]=0;Outputwindow(s);}}elseSystem.out.println("序號(hào)為"+i+”的分組在傳給接收方途中發(fā)生了丟包!”);//System.out.println("i=="+i);//System.out.println("s.localack"+s.localack);i++;}}elsebreak;}/*System.out.println();System.out.println("以下是每個(gè)數(shù)據(jù)分組被發(fā)送過(guò)的次數(shù)的統(tǒng)計(jì)結(jié)果");for(inti=0;i<7;i++) //顯示關(guān)于每個(gè)數(shù)據(jù)包發(fā)送次數(shù)的統(tǒng)計(jì)表System.out.println("序號(hào)為"+i+”的數(shù)據(jù)分組被發(fā)送過(guò)的次數(shù)為:"+retimes[i]);*/System.out.println("全部數(shù)據(jù)發(fā)送完畢!");System.exit(0);}程序運(yùn)行結(jié)果部分截圖圭也方=況在我&守三施:安五方=疑W攵*Ml安安方=漢在案云序號(hào)泌心建好發(fā)送方=鼬產(chǎn)洲■時(shí)早建會(huì)Mg25鮑亳伊手號(hào)澎的分m主核緯&方推三責(zé)生了蕓K!策明盼于益計(jì)時(shí)沒(méi)圣芯丹三1才象生/汕25瞬亳號(hào):圭&方=&到了字號(hào)為1扣冊(cè)三!笛氏方=學(xué)建旨泡不是境及方.眄麓陸的,淀分買霉蕓棄.埃丑方推備叵五身W裝受到建分m時(shí)應(yīng)的用:K沒(méi)送方=子?1■韌寸!!1末蕓巨叵是牙間霆吐跖)第史方即將Mi字號(hào)榮為S&Mir三!策明盼于益計(jì)時(shí)第iWir三£才象生/汕75?^!垸次方=次到了字號(hào)方2的扣■還!笛氏方=學(xué)建旨泡不是境及方.眄麓陸的,淀分買霉蕓棄.埃丑方推備叵五身W裝受到建分m時(shí)應(yīng)的用:K浸送方=ftSITACK,凈號(hào)方-L嶷H走認(rèn)!安五方=匝蹌志這不哄云方正簸峙明AC心即推里盅序號(hào)激明站會(huì)還!筮送方=31注笙無(wú)手號(hào)榮到建守三第M盼于洲■時(shí)安i建分■冀安快:750亳號(hào):圭也方=也到了手號(hào)榮為守三!垃次方=該建營(yíng)還正暗至晴如境斐古并雀?jìng)浠嘏e疙應(yīng)卻包匚心筮至方=ftSITACK,字號(hào)右0翌玄密破認(rèn)!當(dāng)就食=1內(nèi)到肝m腳為:第。號(hào)食二至面存放的是字號(hào)才1的待走又拘建分耳!第1號(hào)快二至旬存成的是字號(hào)片2的號(hào)走又的整分三!第W號(hào)夜二重旬存放的定序號(hào)為3到持走又拘建分三!第3號(hào)定二至瓦存我的屆字導(dǎo)片4的專第云明建計(jì)互:沒(méi)M方:魏在愁序號(hào)為1拘建守三*方=盼矛蛔■時(shí)字號(hào)方[為分W核站的K三案生了去包!能i方:現(xiàn)在*字號(hào)方1為建昔三策i方:現(xiàn)在密計(jì)時(shí)安i建昔ML沮i生茹^300^1最#方;牲矣了字號(hào)為1的肝耳:凝枚方:學(xué)建丹三正是策萊峙明.境斐H弁推備回寶立成那H2K:案圣方:&51TACK.字號(hào)為1.漢在片定認(rèn)!當(dāng)酋宸=1內(nèi)為分目胞為:第號(hào)快二至旬存恿的是字號(hào)為N的與走次拘建分三!第1號(hào)夜二重旬存^的是字號(hào)方3的峙謊隊(duì)到建分三!第2號(hào)夜二重旬存放的是字號(hào)立4的峙擊隊(duì)拘建分三I第3號(hào)夜二重旬存放的是字號(hào)方5的峙猝到建分三!*方=漢忘*字號(hào)為2拘建守三策i方:現(xiàn)在密計(jì)時(shí)策i蛙昔三N?t妄生航=12&0^1字號(hào)方2為分W核站的K三案生了去包!安長(zhǎng)方;魏在就字號(hào)方2為建昔還安i方:曲產(chǎn)粉i■時(shí)M建七也1■富生長(zhǎng)買750^1妥枚方:丑裝了字號(hào)為W的分耳!凝世方:浚建分三正是屈斐峙拍.境翌在林缶回受時(shí)應(yīng)那M:心站方:&51TACK.字號(hào)為A凱往片硬認(rèn)!當(dāng)就宸=1內(nèi)的分目腳為:第。號(hào)夜二重旬存放的是字號(hào)右3的峙擊隊(duì)拘建分三!第1"二重旬存放的是字號(hào)立4的峙擊隊(duì)拘建分三IS2W二至旬律放的是序號(hào)方5的峙走隊(duì)的建計(jì)耳!第3號(hào)俊二盂面再武為是字號(hào)才E為陸*拘整計(jì)耳:B方:沉在案堂字號(hào)右3的建昔三B方:盼不計(jì)時(shí)溢金建務(wù)還3#■富生轟云=1200?^:字號(hào)右3的%■羽凝緯快方更中覽生了丟巨!竇云方:漢在發(fā)M再號(hào)方3的建%■虹竇E鼬瑋&計(jì)時(shí)竇調(diào)£至昔還3也i生轟m75#耄片!妥快方:牲寬了字號(hào)有3的%■££!垸UC扎拳建―耳正抨瓣的.全址芝并喧備回受*應(yīng)的四眼*方=&51TACK.字號(hào)為3.理在片釜*J當(dāng)皮宜n內(nèi)的扣'退能為:弟&號(hào)食二主瓦存成拘定字號(hào)方4的聽(tīng)斐隊(duì)的建計(jì)還!弟】號(hào)食二重瓦存禎的定字號(hào)方5的聽(tīng)斐隊(duì)的建mm弟2號(hào)食二圭而存成拘定字號(hào)方6的聽(tīng)斐隊(duì)的建號(hào)'M弟3號(hào)食二已甌斐了.羥臣添童二、發(fā)洋方?jīng)]冉蕓妄M的數(shù)至守三了*方:覬在疝字號(hào)方4為建昔三*方=耕示飼■時(shí)垸UC5■:快垣了字號(hào)方4的分虹!垸UC扎率靠查外泛正樣斡的.學(xué)4耕備回受*應(yīng)的心一:*方=&51TACK.字號(hào)占4.理在片釜*J當(dāng)皮宜n內(nèi)的扣'退能為:弟&號(hào)食二主瓦存成拘定字號(hào)方5的聽(tīng)斐隊(duì)的建好!弟[號(hào)食二重而存禎的定字號(hào)方6的聽(tīng)斐隊(duì)的建號(hào)'耳!弟2號(hào)食二已甌斐了.并三希建窗二'發(fā)洋方?jīng)]冉蕓*的建牙三了弟3號(hào)食二已甌斐了.羥臣添童二、發(fā)洋方?jīng)]冉蕓妄M的數(shù)至守三了芯方:汛在跆L手號(hào)為5拍建牙M笑林盼養(yǎng)&計(jì)時(shí)沒(méi)圣建此5灑生菇M1200亳#:妥位方:#5!了序號(hào)為5的分三!最位方;學(xué)建金虹正是芳亳哨的.境址古弁推備回寶*應(yīng)的ACK:瘀方:ft5;TACK,字號(hào)有5.現(xiàn)在開(kāi)始逐認(rèn)!當(dāng)就食=1內(nèi)的昔三能方:第。號(hào)S二主司存成明定字號(hào)占6明陸釜從明蛙01第1號(hào)食二已匝空了.并三芳瀆宙二'案登涵蕓散瞄建好了:第2號(hào)食二已匝斐了,養(yǎng)三至殞宙二'甕圣方涵蕓期逆敏M駝了:第3號(hào)宣二已匝斐了.并,三生宸直二:第*涵蕓室玷1敏至好了:芯方:戲垣送字號(hào)肯6的索君牙M案E盼不計(jì)時(shí)第i建德6推股買300^1學(xué)改方:次垣了序號(hào)方6的分三!學(xué)改方:學(xué)建分虹正抨解的.境受M游備回寶*成的AC心瘀方:ft5;TACK,字號(hào)有6.旋往開(kāi)始逐認(rèn)!當(dāng)就宙=1內(nèi)為守耳能方:第0號(hào)食二已匝斐了.并.三至W直二'*方海蕓*站建好了第1號(hào)定二已匝斐了.養(yǎng)三若建宙二、妄圣方?jīng)]角要站拍索君分三了第2號(hào)定二已匝斐了.養(yǎng)三若建宙二、妄圣方?jīng)]角要站拍索君分三了第3號(hào)定二已匝斐了.養(yǎng)三若建宙二、妄圣方?jīng)]角要站拍索君分三了全垛建宴法亮豐:路由算法實(shí)驗(yàn)實(shí)驗(yàn)?zāi)康纳钊肜斫夥植际铰酚蛇x擇算法,以最簡(jiǎn)單的DV算法來(lái)增強(qiáng)對(duì)路由算法的認(rèn)識(shí)理解、掌握和利用距離向量算法所實(shí)現(xiàn)的路由器模擬Internet上的IP路由器。它能確定網(wǎng)絡(luò)的最短路由,并在這些利用上傳輸分組。實(shí)驗(yàn)意義通過(guò)本實(shí)驗(yàn),使學(xué)生能夠?qū)β酚稍砗吐酚伤惴ㄓ羞M(jìn)一步的理解和掌握。實(shí)驗(yàn)背景距離矢量算法,也稱為Bellman-Fordshortestpathalgorithm,每個(gè)路由器都定期或拓?fù)浣Y(jié)構(gòu)突發(fā)變化時(shí)與其相鄰的所有路由器交換路由表,據(jù)此更新它們自己的路由表。DV算法工作方式:每個(gè)路由器維護(hù)一張路由表,表中分為三個(gè)表項(xiàng):目的地址,列出了當(dāng)前可達(dá)的目的網(wǎng)絡(luò)地址;到達(dá)目的地址下一跳,列出了下一跳的IP地址;到達(dá)目的地址的代價(jià),以距離或跳數(shù)為表征。路由表更新規(guī)則:1.發(fā)現(xiàn)了一條到達(dá)某目的的新路由,而該路由在原來(lái)的路由表中不存在(即發(fā)現(xiàn)了一條新路由),則在路由表中增加該路由。2.發(fā)現(xiàn)了一條到達(dá)某目的的、距離更短的新路由,則用該路由替換原有的路由。3.到達(dá)某目的的一條路由,其后繼結(jié)點(diǎn)到達(dá)該目的地的距離發(fā)生了變化,則需要更新該路由的距離。4.實(shí)驗(yàn)步驟選擇C編程語(yǔ)言編程實(shí)現(xiàn)DV(距離矢量)路由算法5.實(shí)驗(yàn)環(huán)境5.實(shí)驗(yàn)環(huán)境(1)實(shí)驗(yàn)語(yǔ)言:(1)實(shí)驗(yàn)語(yǔ)言:C(2)實(shí)驗(yàn)平臺(tái):VC++6.0(3)引用頭文件:stdio.h、stdlib.h、conio.h6.函數(shù)概覽與描述6.函數(shù)概覽與描述((1) voidInitData(FILE*pfile)主要功能:從文件中讀取路由表的初始信息(2) voidOutputRoutData()主要功能:打印路由表(3) voidCommunication(intrecv,intsend)主要功能:向鄰近節(jié)點(diǎn)發(fā)送自己的路由表信息(4) voidExchange()主要功能:根據(jù)新路由表信息更新自己的路由表(5) voidmain()主要功能:調(diào)用以上函數(shù),完成程序7.代碼展示與描述7.代碼展示與描述(一)數(shù)據(jù)結(jié)構(gòu)定義typedefstruct(一)數(shù)據(jù)結(jié)構(gòu)定義typedefstruct(intdis;〃記錄距離intfrom;//記錄中間節(jié)點(diǎn)}RoutNode;voidInitData(FILE*pfile)函數(shù)voidInitData(FILE*pfile)(charnum[10];inti=0;charc;intm,n;fseek(pfile,0,0); 〃定位到文件頭for(m=0;!feof(pfile)&&m<ROUTNUM;m++)(for(n=0;!feof(pfile)&&n<ROUTNUM;n++)(while(!feof(pfile))(c=fgetc(pfile);if(c==',')(num[i]='\0'; 〃添加字符串結(jié)束標(biāo)志data[m][n].dis=atoi(num); //字符串轉(zhuǎn)換成整型data[m][n].from=-1;〃沒(méi)有中間節(jié)點(diǎn)i=0; 〃準(zhǔn)備讀取下一個(gè)數(shù)break;}elseif((c>='0'&&c<='9')||c=='-')(num[i++]=c;}}}}}voidOutputRoutData()函數(shù)voidOutputRoutData() 〃打印路由表(inti,j;printf("");for(i=0;i<ROUTNUM;i++)(printf("%c",i+65);}printf("\n");for(i=0;i<ROUTNUM;i++)(printf("%c",i+65);for(j=0;j<ROUTNUM;j++)(if(data[i][j].dis<0)printf("-");elseif(data[i][j].dis>10||data[i][j].dis==10)printf("%d",data[i][j].dis);elseprintf("%d",data[i][j].dis);if(data[i][j].from<0)printf("-");elseprintf("%c",data[i][j].from+65);}printf("\n");}}voidCommunication(intrecv,intsend)函數(shù)voidCommunication(intrecv,intsend)//信息交換,recv信息接收方,send信息發(fā)送方(inti;for(i=0;i<ROUTNUM;i++)(if(data[send][i].dis>0) 〃發(fā)送方到i節(jié)點(diǎn)有路徑(if(data[recv][i].dis<0) //接收方到i節(jié)點(diǎn)沒(méi)路徑(data[recv][i].dis=data[send][i].dis+data[recv][send].dis;〃更改接收方到i節(jié)點(diǎn)的路徑信息data[recv][i].from=send;〃記錄中間節(jié)點(diǎn)}elseif(data[recv][i].dis>data[send][i].dis+data[recv][send].dis)//接收方到i節(jié)點(diǎn)有路徑,但較大,一下兩步是更新操作(data[recv][i].dis=data[send][i].dis+data[recv][send].dis;data[recv][i].from=send;}voidExchange()函數(shù)voidExchange() 〃更新路由表(inti,j;for(i=0;i<ROUTNUM;i++)(for(j
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024藥品購(gòu)銷合同協(xié)議書(shū)范本
- 2024委托培訓(xùn)合同模板樣本
- 電工崗前安全專項(xiàng)培訓(xùn)專項(xiàng)試卷
- 2024拉贊助合同范本
- 車輛檢修工必知必會(huì)練習(xí)試題附答案
- 2024年農(nóng)業(yè)科學(xué)研究與試驗(yàn)發(fā)展服務(wù)項(xiàng)目發(fā)展計(jì)劃
- 員工工資福利合同
- 濮陽(yáng)縣三中初中部信息技術(shù)考前測(cè)試1
- 2023年重慶兩江新區(qū)遴選公務(wù)員筆試真題
- IT創(chuàng)新貸款協(xié)議
- 月光(羽泉)原版五線譜鋼琴譜正譜樂(lè)譜.docx
- 660MW機(jī)組空預(yù)器聲波吹灰器可行性研究報(bào)告最新(精華版)
- 控制柜安裝施工方案
- 七年級(jí)歷史教案:林則徐的教學(xué)設(shè)計(jì)
- 動(dòng)車組火災(zāi)檢測(cè)(報(bào)警)系統(tǒng)
- 水面垃圾自動(dòng)打撈船的設(shè)計(jì) (全套圖紙)
- 煙草企業(yè)安全生產(chǎn)標(biāo)準(zhǔn)化 規(guī)范
- 裝飾施工技術(shù)標(biāo)準(zhǔn)及要求
- 2018秋七年級(jí)虎外考試卷英語(yǔ)試卷
- 河洛擇日法[技巧]
- P91材質(zhì)焊接及熱處理工程作業(yè)指導(dǎo)書(shū)(完整版)
評(píng)論
0/150
提交評(píng)論