停止等待協(xié)議的編程模擬_第1頁
停止等待協(xié)議的編程模擬_第2頁
停止等待協(xié)議的編程模擬_第3頁
免費預(yù)覽已結(jié)束,剩余4頁可下載查看

下載本文檔

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

文檔簡介

1、青島農(nóng)業(yè)大學理學與信息科學學院計算機網(wǎng)絡(luò)與通信課程設(shè)計報告設(shè)計題目停止等待協(xié)議的編程模擬學生專業(yè)班級計本05學生姓名(學號)指導(dǎo)教師完成時間2007年10月17日實習(設(shè)計)地點機房2007年10月17日停止等待協(xié)議的編程模擬一、課程設(shè)計目的和任務(wù)計算機網(wǎng)絡(luò)與通信課程講述計算機網(wǎng)絡(luò)的原理,尤其是TCP/IP協(xié)議棧的原理和應(yīng)用,是一門理論性、應(yīng)用性、實踐性都比較強的課程。計算機網(wǎng)絡(luò)與通信實習是學習完計算機網(wǎng)絡(luò)與通信課程后進行的一次全面的綜合實習,是本專業(yè)實踐性重要環(huán)節(jié)之一。計算機網(wǎng)絡(luò)與通信實習是從原理和實踐的角度,在計算機上編程模擬實現(xiàn)計算機網(wǎng)絡(luò)的基本協(xié)議。通過本實習,使我們對計算機網(wǎng)絡(luò)的原理能

2、有更加深刻的認識和理解,同時進一步鍛煉自己的動手能力。在這次課程設(shè)計中,我設(shè)計的的是通過編譯語言,編程模擬實現(xiàn)數(shù)據(jù)鏈路層協(xié)議中的停止等協(xié)議。二、分析與設(shè)計1. 設(shè)計任務(wù)分析:停止等待協(xié)議是數(shù)據(jù)鏈路層的幾個協(xié)議中最簡單的協(xié)議,是具有最簡單流量控制的數(shù)據(jù)鏈路層協(xié)議,是數(shù)據(jù)鏈路層各種協(xié)議的基礎(chǔ)。此課程設(shè)計是基于winsock編程,是在VC+6.0的MFC界面下和控制臺下實現(xiàn)的。它采用客戶機/服務(wù)器(C/S)模型,即發(fā)送數(shù)據(jù)的一端為客戶端,接收數(shù)據(jù)的一端為服務(wù)器端。停止等待協(xié)議就是通過雙方的收發(fā)數(shù)據(jù)而達到相互通信的目的。本課程設(shè)計通過編程模擬實現(xiàn)停止等待協(xié)議,隨機的發(fā)送數(shù)據(jù),通過服務(wù)器的的接受結(jié)果和客

3、戶端的接受結(jié)果顯示理解停止等待協(xié)議的原理,掌握其應(yīng)用。2. 設(shè)計方案論證當收方收到一個正確的數(shù)據(jù)幀后,便會向發(fā)方發(fā)送一個確認幀ACK表示發(fā)送的數(shù)據(jù)正確接收。當發(fā)方收到確認幀后才能發(fā)送一個新的數(shù)據(jù)幀,這樣就實現(xiàn)了接收方對發(fā)送方的流量控制。由于通信線路質(zhì)量各方面的影響,數(shù)據(jù)幀從發(fā)送方到接收方傳輸?shù)倪^程中可能會出現(xiàn)差錯。為了保證數(shù)據(jù)的正確性和完整性,接收方在收到數(shù)據(jù)后,會用一定的方法對接收到的數(shù)據(jù)進行差錯檢驗,所以接收方很容易檢測出收到的數(shù)據(jù)幀是否出現(xiàn)差錯。當接收方發(fā)現(xiàn)收到的數(shù)據(jù)出現(xiàn)差錯時,就會向發(fā)送方發(fā)送一個否認幀NAK表示對方發(fā)送的數(shù)據(jù)錯誤。發(fā)送方會根據(jù)接收方發(fā)來的信息做出相應(yīng)的操作。采用這樣的

4、有效的檢錯機制,數(shù)據(jù)鏈路層可以對上面的網(wǎng)絡(luò)層提供了可靠的傳輸?shù)姆?wù)。3詳細設(shè)計停止等待協(xié)議的算法如下:為了對停止等待算法有一個完整而準確的理解,下面給出此協(xié)議的算法。具有最簡單流量控制的數(shù)據(jù)鏈路層協(xié)議假定1:鏈路是理想的傳輸信道,所傳送的任何數(shù)據(jù)既不會出差錯也不會丟失。假定2:不管發(fā)方以多快的速率發(fā)送數(shù)據(jù),收方總是來得及收下,并及時上交主機。這個假定就相當于認為:接收端向主機交付數(shù)據(jù)的速率永遠不會低于發(fā)送端發(fā)送數(shù)據(jù)的速率。現(xiàn)在去掉上述的第二個假定。但是,仍然保留第一個假定,即主機A向主機B傳輸數(shù)據(jù)的信道仍然是無差錯的理想信道。然而現(xiàn)在不能保證接收端向主機交付數(shù)據(jù)的速率永遠不低于發(fā)送端發(fā)送數(shù)據(jù)的

5、速率。由收方控制發(fā)方的數(shù)據(jù)流,乃是計算機網(wǎng)絡(luò)中流量控制的一個基本方法。簡單解釋:收方每接受到發(fā)方一幀后,回復(fù)確認幀,讓發(fā)方繼續(xù)發(fā)送下一幀,并且收方將數(shù)據(jù)幀交給上層軟件識別,出現(xiàn)錯誤就將幀丟掉.在接收結(jié)點:(1) 等待。(2) 若收到由發(fā)送結(jié)點發(fā)過來的數(shù)據(jù)幀,則將其放入數(shù)據(jù)鏈路層的接收緩存。(3) 將接收緩存中的數(shù)據(jù)幀上交主機。(4) 向發(fā)送結(jié)點發(fā)一信息,表示數(shù)據(jù)幀已經(jīng)上交給主機。(5) 轉(zhuǎn)到(1)在發(fā)送結(jié)點:(1) 從主機取一個數(shù)據(jù)幀。(2) 將數(shù)據(jù)幀送到數(shù)據(jù)鏈路層的發(fā)送緩存。(3) 將發(fā)送緩存中的數(shù)據(jù)幀發(fā)送出去。(4) 等待。(5) 若收到由接收結(jié)點發(fā)過來的信息(此信息的格式與內(nèi)容可由雙方事

6、先商定好),則從主機取一個新的數(shù)據(jù)幀,然后轉(zhuǎn)到(2)。因此,在設(shè)計編程模擬實現(xiàn)停止等待協(xié)議時,因具體考慮有關(guān)幀的一些知識。幀的結(jié)構(gòu):幀的類型幀的序號幀的確認號數(shù)據(jù)信息(可變)校驗位幀的結(jié)構(gòu)幀的類型(frame_kind)分為數(shù)據(jù)幀(data_frame),確認幀(ack_frame)和否認幀(nak_frame)三種。發(fā)送方向接收方發(fā)送數(shù)據(jù),是以幀為單位的,就稱為數(shù)據(jù)幀。它的數(shù)據(jù)信息是可變的,但最佳的幀長為1500個字節(jié)。接收方接收數(shù)據(jù)后,會對收到的數(shù)據(jù)幀進行差錯校驗,當數(shù)據(jù)正確時,就會向發(fā)送方發(fā)送一個確認幀,以表示發(fā)送方發(fā)送的數(shù)據(jù)正確接收了,反之,就會向發(fā)送方發(fā)送一個否認幀,并把這個出錯的數(shù)

7、據(jù)幀丟棄。幀的序號(seq):由于采用的是單工通信,幀的結(jié)構(gòu)中用的控制域也很少,這個域會隨著幀類型的不同而不同:對數(shù)據(jù)幀來說:序號(seq)表示的是發(fā)送端發(fā)送的幀的序號。對確認幀來說:序號(seq)表示的是接收方希望接收到的幀的序號,它表示seq以前的各幀都已經(jīng)正確接收,希望收到序號為seq的幀。對否認幀來說:序號(seq)也是表示接收方希望收到的數(shù)據(jù)幀的序號,表示接收方已經(jīng)收到序號為seq的幀,但是這個幀出現(xiàn)錯誤,希望發(fā)送方重新發(fā)送該數(shù)據(jù)幀。停止等待協(xié)議采用的是單工通信,接收端向發(fā)送端發(fā)送的確認幀和否認幀中沒有數(shù)據(jù)信息,它們的數(shù)據(jù)域為空。由于是單工通信,發(fā)送方只發(fā)送數(shù)據(jù),所以發(fā)送方幀的“幀的

8、確認號”中并沒有包含任何的確認信息。4源代碼:發(fā)送端:(client.cpp)#include<stdio.h>#include<winsock2.h>#include<time.h>#pragmacomment(lib,"Ws2_32.lib")#defineSERVER_PORT7300structBAGcharpacket;voidmain(intargc,char*argv)WORDwVersionRequested;WSADATAwsaData;intret,i,ra,data=0;SOCKETsClient,sListen;s

9、tructsockaddr_insaServer;structBAGbag;char*ptr=(char*)&bag;BOOLfSuccess=TRUE;WinSock初始化:wVersionRequested=MAKEWORD(2,2);ret=WSAStartup(wVersionRequested,&wsaData);if(ret!=0)printf("WSAStartup()failed!n");return;if(LOBYTE(wsaData.wVersion)!=2|HIBYTE(wsaData.wVersion)!=2)WSACleanup()

10、;printf("InvalidWinsockversion!n");return;sClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);sListen=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(sClient=INVALID_SOCKET)WSACleanup();printf("socket()failed!n");return;saServer.sin_family=AF_INET;saServer.sin_port=htons(SERVER_PORT);ret=

11、connect(sClient,(structsockaddr*)&saServer,sizeof(saServer);if(ret=SOCKET_ERROR)printf("connect()successed!n");closesocket(sClient);WSACleanup();return;for(i=97;i<=104;i+)ra=rand()%11;if(ra%5=1)data+=i;elsedata=i;bag.packet=data;ret=send(sClient,(char*)&bag,sizeof(bag),0);ret=re

12、cv(sListen,ptr,sizeof(bag),0);if(bag.packet!=i)i-;printf("send()failed!n");continue;elseif(bag.packet=i)printf("packet%dhasbeensent!n",i+1);closesocket(sClient);WSACleanup();接受端(server.cpp):#include<stdio.h>#include<winsock2.h>#include<windows.h>#include<time

13、.h>#pragmacomment(lib,"Ws2_32.lib")#defineSERVER_PORT7300structBAGcharpacket;voidmain()WORDwVersionRequested;WSADATAwsaData;intret,nLeft,length;SOCKETsListen,sServer;structsockaddr_insaServer,saClient;structBAGbag;char*ptr,*pp;wVersionRequested=MAKEWORD(2,2);ret=WSAStartup(wVersionReque

14、sted,&wsaData);if(ret!=0)printf("WSAStartup()failed!n");return;!=2)!=2)if(LOBYTE(wsaData.wVersion)!=2|HIBYTE(wsaData.wVersion)WSACleanup();printf("InvalidWinsockversion!n");return;sListen=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(sListen=INVALID_SOCKET)WSACleanup();printf(&q

15、uot;socket()failed!n");return;saServer.sin_family=AF_INET;saServer.sin_port=htons(SERVER_PORT);=htonl(INADDR_ANY);ret=bind(sListen,(structsockaddr*)&saServer,sizeof(saServer);if(ret=SOCKET_ERROR)printf("bind()failed!code:%dn",WSAGetLastError();closesocket(sListen);WSACleanup();ret

16、urn;ret=listen(sListen,5);if(ret=SOCKET_ERROR)printf("listen()failed!code:%dn",WSAGetLastError();closesocket(sListen);WSACleanup();return;printf("Waitingforclientconnecting!n");printf("tips:Ctrl+ctoquit!n");length=sizeof(saClient);sServer=accept(sListen,(structsockaddr*

17、)&saClient,&length);if(sServer=INVALID_SOCKET)printf("accept()failed!code:%dn",WSAGetLastError();closesocket(sListen);WSACleanup();return;printf("Acceptedclient:%s:%dn",inet_ntoa(saClient.sin_addr),ntohs(saClient.sin_port);nLeft=sizeof(bag);ptr=(char*)&bag;for(inti=97

18、;i<=104;i+)pp=ptr;ret=recv(sServer,ptr,nLeft,0);if(ret=SOCKET_ERROR)printf("recv()failed!n");break;elseif(bag.packet!=i)printf("wrongpacket!n");i-;ret=send(sServer,pp,nLeft,0);continue;elseif(bag.packet=i)printf("recv()%csuccessd!n",i);ret=send(sServer,ptr,nLeft,0);i

19、f(ret=0)printf("clienthasclosedtheconnection!n");break;closesocket(sListen);closesocket(sServer);WSACleanup();三、系統(tǒng)實施此次課程設(shè)計通過C+編程基本上模擬實現(xiàn)了數(shù)據(jù)鏈路層中的停止等待協(xié)議,但是程序中存在一定的不足,沒有能夠完全的體現(xiàn)停止等待協(xié)議的的工作原理。在此課程設(shè)計中,數(shù)據(jù)的發(fā)送是隨機生成的。運行結(jié)果截圖如下所示:服務(wù)器端的運行截圖:圖1客戶端的運行截圖:圖2結(jié)果如下所示:客戶端:圖3服務(wù)器端:圖4四、總結(jié)與體會“停止等待”就是每發(fā)送完一個分組就停止發(fā)送,等待對方的確認。是一種簡單的可靠通信協(xié)議。可靠傳輸協(xié)議是這樣設(shè)計的:發(fā)送方只要超過了一段時間仍然沒有收到確認,就認為剛才發(fā)送的分組丟失了,因而重傳前面發(fā)送過的分組。這里應(yīng)注意三點:第一,發(fā)送方在發(fā)送完一個分組后,必須暫時保留已發(fā)送的分組副本(以發(fā)生超時重

溫馨提示

  • 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

提交評論