計算機網絡課程設計實驗報告_第1頁
計算機網絡課程設計實驗報告_第2頁
計算機網絡課程設計實驗報告_第3頁
計算機網絡課程設計實驗報告_第4頁
計算機網絡課程設計實驗報告_第5頁
已閱讀5頁,還剩2頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

實驗報告課程名稱:計算機網絡實驗實驗名稱:ARQ協議模擬實現院系:計算機科學學院實驗日期:2010-11-10班級:07通信工程實驗報告日期:2010-11-10姓名:譚才盛學號:071101450037老師批閱簽字:_______

實驗內容:編寫兩個計算機程序p1,p2。p1模擬發送方:首先從界面讀取待發送字符(每接受一個字符的輸入),保存到文件exe1.txt中,并啟動計時器;p2模擬接收方,它從exe1.txt中查找是否有新字符到來,并提供模擬界面給用戶選擇:1.Ack-->接收該字符2.NAK--〉丟棄3.無反應--〉導致超時將用戶選擇的結果記錄到exe2.txt中;接收的字符保存到exe3.txt中。 由于可視化操作不精通,這次實驗過程在C++環境下模擬運行。 運行環境:VisualC++6.0 編程思路:新建三個文本文件,每次運行程序開始階段使系統隨機產生100個隨機數,并使其轉化為字符格式,讓P1從界面讀取字符,輸送到exe1,txt文件中。并啟動計時器記錄傳輸時間。讀入exe1.txt,若發現有新字符,則提供模擬界面給用戶選擇接收還是丟棄;若無反應,則輸出超時信息。將用戶選擇的結果記錄到exe2.txt中;接收的字符保存到exe3.txt中。文本文件讀寫一律采用追加模式。 實驗步驟: 1.分析ARQ協議模擬實現的一般流程,畫出流程圖:exe1.txtexe1.txtexe2.txt。1.Ack-->接收該字符2..NAK--〉丟棄.3.無反應--〉導致超時。選擇的結果記錄到exe2.txt中exe3.txt。接收的字符保存到exe3.txt中P11模擬發送方界面從界面讀取字符保存到exe1中,并啟動計時器接收新字符P2模擬接收方(ARQ協議流程圖)2.結合C++文件操作部分編寫源程序:源程序如下:#include"iostream.h"#include"fstream.h"#include"stdlib.h"#include"iomanip.h"#include"time.h"#include"string.h"voidmain(){longcurtime_front_Sender,curtime_rear_Sender, curtime_front_Receiver,curtime_rear_Receiver; curtime_front_Receiver=time(NULL);//定義時鐘 charch,choice,str[4],array[100]; inti,tag=0;//定義開關變量 fstreamfile1;fstreamfile2;fstreamfile3; cout<<"打開文件:exe1,exe2,exe3"<<endl; file1.open("exe1.txt",ios::in|ios::out|ios::app); if(file1.fail()) {cout<<"不能打開文件:"<<"exe1"<<endl; exit(0); } file2.open("exe2.txt",ios::in|ios::out|ios::app); if(file2.fail()) {cout<<"不能打開文件:"<<"exe2"<<endl; exit(0); } file3.open("exe3.txt",ios::in|ios::out|ios::app); if(file3.fail()) {cout<<"不能打開文件:"<<"exe3"<<endl; exit(0); } cout<<endl<<endl<<"\t\t\tARQ協議模擬實驗\n\n\n"; cout<<"\t\t\t1隨機產生字符\n\n\t\t\t2接收\n\n\t\t\t3退出"<<endl; do {cin>>choice; switch(choice) {case'1': for(i=0;i<100;i++)//隨機產生字符 {array[i]='a'+rand()%26; cout<<setw(2)<<array[i]; file1.put(array[i]);//字符讀入exe1.txt文件中 curtime_front_Sender=time(NULL);//時鐘運行 }tag=1; file1.close(); cout<<"字符已讀入exe1.txt文件中."<<endl; break; case'2': if(tag==1) {cout<<"文件exe1.txt中有新字符到來."<<endl; cout<<"輸入Ack:接收字符\n"; cout<<"輸入NAk:放棄字符\n"; do { cin.ignore(); cin.getline(str,4); if(strcmp(str,"Ack")==0) { file1.open("exe1.txt",ios::in|ios::out|ios::app); file1.get(ch); while(!file1.eof()) {file3.put(ch); curtime_rear_Receiver=time(NULL); if(curtime_rear_Receiver-curtime_front_Receiver>1)//超時是否判斷 {curtime_front_Receiver=time(NULL); continue; }file2<<"接收該字符."; file1.get(ch); }cout<<"文件讀寫完畢.\n"; } elseif(strcmp(str,"NAk")==0) cout<<"已經放棄這些字符.\n"; elseif(strcmp(str,"NAk")!=0&&strcmp(str,"Ack")!=0) cout<<"輸入錯誤,請從新輸入:"<<endl; }while(strcmp(str,"NAk")!=0&&strcmp(str,"Ack")!=0); }elseif(tag==0) cout<<"文件exe1.txt中沒有新字符到來."<<endl; break; default:cout<<"謝謝使用."<<endl; } }while(choice!='3'); file1.close();file2.close();file3.close(); } 3.模擬實驗,運行源程序. 實驗中的問題及心得:通過實驗發現在課程學習中對很多方面只是一知半解,并沒有深入的加以研究,致使在組織源程序過程中遇到了很多麻煩,例如對ARQ協議只是片面地了解,對其背景,發展過程,應用過程,作用范圍并不是很了解,今后一定會在這方面加強認識。通過學習實踐發現計算機網絡這門課程雖然大部分都是理論課程,很少有實踐類的,但其從當今最前沿的計算機科學理論成果出發,將整個網絡世界的總體框架呈現在面前,使得網絡協議描述表現的淋漓盡致,今后必將以百倍的熱情投入到這門課程的學習中。 總結通過實驗所掌握的內容: 1.連續ARQ協議的算法#defineMAX_SEQ7/*應該為2^n-1*/typedefenum{frame_arrival,cksum_error,timeout,network_layer_ready}event_type;#includeprotocal.hstaticbooleanbetween(seq_nra,seq_nrb,seq_nrc){/*如果b落在a和c之間(含a不含c)返回true,否則返回false.*/if(((a<=b)&&(b<c))||((c<a)&&(a<=b))||((b<c)&&(c<a)))return(true);elsereturn(false);}staticvoidsend_data(seq_nrframe_nr,seq_nrframe_expected,packetbuffer[]){/*構造和發送數據幀frames;/*起始變量*/=buffer[frame_nr];/*插入分組到幀中*/s.seq=frame_nr;/*插入序號到幀中*/s.ack=(frame_expected+MAX_SEQ)%(MAX_SEQ+1)/*捎帶應答*/to_physical_layer(&s);/*傳送該幀*/start_timer(frame_nr);}/*啟動定時器*/voidprotocal5(void){seq_nrnext_frame_to_send;/*MAX_SEQ>1;用于外出流*/seq_nrack_expected;/*還沒有得到應答的最早的幀*/seq_nrframe_expected;/*進入流期望的下一幀*/framer;/*初始變量*/packetbuffer[MAX_SEQ+1]/*外出流的緩存*/seq_nrnbuffered;/*當前正在使用的輸出緩存*/event_typeevent;enable_network_layer();/*允許network_layer_ready事件*/ack_expected=0;/*下一個期望進入的應答*/next_frame_to_send=0;/*下一個要送出的幀*/frame_expected=0;/*期望進入的幀的序號*/nbuffered=0;/*初始沒有分組被緩存*/while(true){wait_for_event(&event);/*四種可能的事件,見上面event_type定義*/switch(event){ casenetwork_layer_ready;/*網絡層有一個分組要發送*//*接收,保存,以及發送一個新的幀*/from_network_layer(&buffer[next_frame-to_send]);/*獲得一個新的分組*/nbuffered=nbuffered+1;/*增加發送方的窗口*/send_data(next_frame_to_send,frame_expected,buffer);/*發送幀*/inc(next_frame_to_send);/*發送方的窗口上界向前移動*/ break;caseframe_arrival:/*一個數據幀或控制幀到達*/from_physical_layer(&r);/*從物理層得到一個進入的幀*/if(r.seq==frame_expected){/*所有的幀只能按序接收.*/to_network_layer(&);/*傳遞分組到網絡層*/inc(frame_expected);/*接收方的窗口下界向前移動*/}/*Ackn意味著n-1,n-2,...等.*/while(between(ack_expected,r.ack,next_frame_to_send)){/*處理捎帶應答*/nbuffered=nbuffered+1;/*減少一個緩存的幀*/stop_timer(ack_expected);/*幀完好到達,停止定時器*/inc(ack_expected);/*壓縮發送窗口*/}break; casecksum_err:break;/*丟棄壞幀*/casetime_out:/*重傳所有超時的幀*/next_frame_to_send=ack_expected;/*開始重傳*/for(i=1;i<=nbuffered;i++){send_data(next_frame_to_send,fram_expected,buffer);/*重發1幀*/inc(next_frame_to_send);/*準備發送下一幀*/}}if(nbuffered<MAX_SEQ)enable_network_layer();elsedisable_network_layer();}}連續ARQ協議采用的重要原理:在簡單停止等待協議的基礎上,允許連續發送若干幀,在收到相應ACK后繼續發送若干幀,用以提高傳輸效率。這時ACK及NAK也必須有對應的幀序號,才能夠一一對應起來。在發生差錯時丟棄原已發送的所有后續幀,重發差錯發生以后的所有幀,相當于完全返回重傳。信道較差時傳輸效率不高。連續重發請求ARQ方案是指發送方可以連續發送一系列信息幀,即不用等前一幀被確認便可繼續發送下一幀,效率大大提高。但在這種重發請求方案中,需要在發送方設置一個較大的緩沖存儲空間(稱作重發表),用以存放若干待確認的信息幀。當發送方到對某信息幀的確認幀后,便可從重發表中將該信息幀刪除。所以,連續重發請求ARQ方案的鏈路傳輸效率大大提高,但相應地需要更大的緩沖存儲空間。在這一協議中,當發送站點發送完一個數據幀后,不是停下來等待應答幀,而是可以連續在發送若干個數據幀。如果在此過程中又收到了接收端發來的應答幀,那么還可以接著發送數據幀。由于減少了等待時間,整個通信的吞吐量就提高了。如結點A向結點B發送數據幀,當結點A發完0號幀時,并不等待,而是繼續發送后續的1號幀、2號幀等。由于連續發送了許多幀,所以應答幀不僅要說明是對哪一幀進行確認或否認,而且應答幀本身也必須編號。假設2號幀出了差錯,于是結點B發送否認幀NAK2。當否認幀NAK2到達結點A時,結點A正在發送5號數據幀。當5號幀發送完畢后,結點A才能進行2號幀的重發。這里要注意兩點:接受端只能按序接收數據幀。對于2號幀,結點B應答了NAK2,雖然接著又收到了三個正確的數據幀,但都必須將他們丟棄,因為這些幀的發送序號都不是順序號;結點A在重傳2號數據幀時,雖然已經發完了5號幀,但仍必須向回走,從2號幀起進行重傳。正因如此,連續ARQ又稱為Go-back-NARQ,意思是當出現差錯必須重傳時,要向回走N個幀,然后再開始重傳。GO-DACK-N策略的基本原理是,當接收方檢測出失序的信息幀后,要求發送方重發最后一個正確接收的信息幀之后的所有未被確認的幀;或者當發送方發送了N個幀后,若發現該N幀的前一個幀在計時器超時后仍未返回其確認信息,則該幀被判為出錯或丟失,此時發送方就不得不重新發送出錯幀及其后的N幀。這就是GO-DACK-N(退回N)法名稱的由來。因為對接收方來說,由于這一幀出錯,就不能以正常的序號向它的高層遞交數據,對其后發送來的N幀也可能都不能接收而丟棄。GO-DACK-N法操作過程如圖7

溫馨提示

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

評論

0/150

提交評論