停止等待協(xié)議的實(shí)現(xiàn)_第1頁
停止等待協(xié)議的實(shí)現(xiàn)_第2頁
停止等待協(xié)議的實(shí)現(xiàn)_第3頁
停止等待協(xié)議的實(shí)現(xiàn)_第4頁
停止等待協(xié)議的實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、福建農(nóng)林大學(xué)計(jì)算機(jī)與信息學(xué)院 課程設(shè)計(jì)報(bào)告 課程名稱:計(jì)算機(jī)網(wǎng)絡(luò) 課程設(shè)計(jì)題目:停止等待協(xié)議的實(shí)現(xiàn) 姓 名: 系:計(jì)算機(jī) 專 業(yè):計(jì)算機(jī)科學(xué)與技術(shù) 年 級: 學(xué) 號: 指導(dǎo)教師: 職 稱: 2011 年 6 月 10 日 福建農(nóng)林大學(xué)計(jì)算機(jī)與信息學(xué)院 課程設(shè)計(jì)報(bào)告結(jié)果評定 評語: 成績: 指導(dǎo)教師簽字: 評定日期: 目錄 1、課程設(shè)計(jì)的目的和任務(wù) 4 2、課程設(shè)計(jì)的要求 4 3、課程設(shè)計(jì)的分析與設(shè)計(jì) 4 設(shè)計(jì)任務(wù)分析 4 設(shè)計(jì)方案論證 5 詳細(xì)設(shè)計(jì) 5 3、系統(tǒng)實(shí)施 7 4、總結(jié)與體會 9 5、參考文獻(xiàn) 9 附錄:源代碼 11 停止等待協(xié)議的實(shí)現(xiàn) 1、課程設(shè)計(jì)的目的和任務(wù) 計(jì)算機(jī)網(wǎng)絡(luò)課程講述計(jì)

2、算機(jī)網(wǎng)絡(luò)的原理,尤其是TCP/IP協(xié)議棧的原理和應(yīng) 用,是一門理論性、應(yīng)用性、實(shí)踐性都比較強(qiáng)的課程。而此次的課程設(shè)計(jì)是在學(xué)習(xí)完 計(jì)算機(jī)網(wǎng)絡(luò)課程后進(jìn)行的一次全面的綜合能力的檢驗(yàn)。 計(jì)算機(jī)網(wǎng)絡(luò)的課程設(shè)計(jì)是從原理和實(shí)踐的角度,在計(jì)算機(jī)上編程模擬實(shí)現(xiàn)計(jì)算機(jī) 網(wǎng)絡(luò)的基本協(xié)議。通過本次課程設(shè)計(jì),使我們對計(jì)算機(jī)網(wǎng)絡(luò)的原理能有更加深刻的認(rèn) 識和理解,同時(shí)進(jìn)一步鍛煉自己的動手能力。 在這次課程設(shè)計(jì)中,我設(shè)計(jì)的的是通過編譯語言,編程模擬實(shí)現(xiàn)數(shù)據(jù)鏈路層協(xié)議 中的停止等協(xié)議。 2、課程設(shè)計(jì)的要求 通過雙方的收發(fā)數(shù)據(jù)而達(dá)到相互通信的目的。 3、課程設(shè)計(jì)的分析與設(shè)計(jì) 設(shè)計(jì)任務(wù)分析 停止等待協(xié)議是數(shù)據(jù)鏈路層的幾個(gè)協(xié)議中最簡

3、單的協(xié)議,是具有最簡單流量控 制的數(shù)據(jù)鏈路層協(xié)議,是數(shù)據(jù)鏈路層各種協(xié)議的基礎(chǔ)。此課程設(shè)計(jì)是基于win sock 編程,是在VC+勺MFC界面下和控制臺下實(shí)現(xiàn)的。它采用客戶機(jī)/服務(wù)器(C/S)模 型,即發(fā)送數(shù)據(jù)的一端為客戶端,接收數(shù)據(jù)的一端為服務(wù)器端。停止等待協(xié)議就是通 過雙方的收發(fā)數(shù)據(jù)而達(dá)到相互通信的目的。 本課程設(shè)計(jì)通過編程模擬實(shí)現(xiàn)停止等待協(xié)議,隨機(jī)的發(fā)送數(shù)據(jù),通過服務(wù)器的的 接受結(jié)果和客戶端的接受結(jié)果顯示理解停止等待協(xié)議的原理,掌握其應(yīng)用。 設(shè)計(jì)方案論證 當(dāng)收方收到一個(gè)正確的數(shù)據(jù)幀后,便會向發(fā)方發(fā)送一個(gè)確認(rèn)幀 ACK表示發(fā)送的 數(shù)據(jù)正確接收。當(dāng)發(fā)方收到確認(rèn)幀后才能發(fā)送一個(gè)新的數(shù)據(jù)幀,這樣就

4、實(shí)現(xiàn)了接收方 對發(fā)送方的流量控制。 由于通信線路質(zhì)量各方面的影響,數(shù)據(jù)幀從發(fā)送方到接收方傳輸?shù)倪^程中可能會 出現(xiàn)差錯(cuò)。為了保證數(shù)據(jù)的正確性和完整性, 接收方在收到數(shù)據(jù)后,會用一定的方法 對接收到的數(shù)據(jù)進(jìn)行差錯(cuò)檢驗(yàn),所以接收方很容易檢測出收到的數(shù)據(jù)幀是否出現(xiàn)差 錯(cuò)。當(dāng)接收方發(fā)現(xiàn)收到的數(shù)據(jù)出現(xiàn)差錯(cuò)時(shí),就會向發(fā)送方發(fā)送一個(gè)否認(rèn)幀NAK表示 對方發(fā)送的數(shù)據(jù)錯(cuò)誤。發(fā)送方會根據(jù)接收方發(fā)來的信息做出相應(yīng)的操作。采用這樣的 有效的檢錯(cuò)機(jī)制,數(shù)據(jù)鏈路層可以對上面的網(wǎng)絡(luò)層提供了可靠的傳輸?shù)姆?wù)。 詳細(xì)設(shè)計(jì) 停止等待協(xié)議的算法如下:為了對停止等待算法有一個(gè)完整而準(zhǔn)確的理解, 下面 給出此協(xié)議的算法。 具有最簡單流量

5、控制的數(shù)據(jù)鏈路層協(xié)議 假定1 :鏈路是理想的傳輸信道,所傳送的任何數(shù)據(jù)既不會出差錯(cuò)也不會丟失。 假定2 :不管發(fā)方以多快的速率發(fā)送數(shù)據(jù),收方總是來得及收下,并及時(shí)上交 主機(jī)。 這個(gè)假定就相當(dāng)于認(rèn)為:接收端向主機(jī)交付數(shù)據(jù)的速率永遠(yuǎn)不會低于發(fā)送端發(fā)送 數(shù)據(jù)的速率。 現(xiàn)在去掉上述的第二個(gè)假定。但是,仍然保留第一個(gè)假定,即主機(jī)A向主機(jī)B 傳輸數(shù)據(jù)的信道仍然是無差錯(cuò)的理想信道。 然而現(xiàn)在不能保證接收端向主機(jī)交付數(shù)據(jù) 的速率永遠(yuǎn)不低于發(fā)送端發(fā)送數(shù)據(jù)的速率。 由收方控制發(fā)方的數(shù)據(jù)流,乃是計(jì)算機(jī)網(wǎng)絡(luò)中流量控制的一個(gè)基本方法。 簡單解釋:收方每接受到發(fā)方一幀后,回復(fù)確認(rèn)幀,讓發(fā)方繼續(xù)發(fā)送下一幀,并且 收方將數(shù)據(jù)

6、幀交給上層軟件識別,出現(xiàn)錯(cuò)誤就將幀丟掉 在接收結(jié)點(diǎn): 等待。 (2) 若收到由發(fā)送結(jié)點(diǎn)發(fā)過來的數(shù)據(jù)幀, 則將其放入數(shù)據(jù)鏈路層的接收緩存。 (3) 將接收緩存中的數(shù)據(jù)幀上交主機(jī)。 (4) 向發(fā)送結(jié)點(diǎn)發(fā)一信息,表示數(shù)據(jù)幀已 經(jīng)上交給主機(jī)。 (5) 轉(zhuǎn)到(1) 在發(fā)送結(jié)點(diǎn): (1) 從主機(jī)取一個(gè)數(shù)據(jù)幀。 (2) 將數(shù)據(jù)幀送到數(shù)據(jù)鏈路層的發(fā)送緩存。 (3) 將發(fā)送緩存中的數(shù)據(jù)幀發(fā)送出去。 (4) 等待。 (5) 若收到由接收結(jié)點(diǎn)發(fā)過來的信息(此信息的格式與內(nèi)容可由雙方事先商定 好),則從主機(jī)取一個(gè)新的數(shù)據(jù)幀,然后轉(zhuǎn)到(2) 0 因此,在設(shè)計(jì)編程模擬實(shí)現(xiàn)停止等待協(xié)議時(shí),因具體考慮有關(guān)幀的一些知識。 幀的

7、結(jié)構(gòu): 幀的類型幀的序號幀的確認(rèn)號數(shù)據(jù)信息(可變)校驗(yàn)位 幀的結(jié)構(gòu) 幀的類型(frame_kind )分為數(shù)據(jù)幀(data_frame ),確認(rèn)幀(ack_frame )和 否認(rèn)幀(nak_frame)三種。 發(fā)送方向接收方發(fā)送數(shù)據(jù),是以幀為單位的,就稱為數(shù)據(jù)幀。它的數(shù)據(jù)信息是可 變的,但最佳的幀長為1500個(gè)字節(jié)。 接收方接收數(shù)據(jù)后,會對收到的數(shù)據(jù)幀進(jìn)行差錯(cuò)校驗(yàn),當(dāng)數(shù)據(jù)正確時(shí),就會向發(fā) 送方發(fā)送一個(gè)確認(rèn)幀,以表示發(fā)送方發(fā)送的數(shù)據(jù)正確接收了,反之,就會向發(fā)送方發(fā) 送一個(gè)否認(rèn)幀,并把這個(gè)出錯(cuò)的數(shù)據(jù)幀丟棄。 幀的序號(seq): 由于采用的是單工通信,幀的結(jié)構(gòu)中用的控制域也很少,這個(gè)域會隨著幀類型

8、的 不同而不同: 對數(shù)據(jù)幀來說:序號(seq)表示的是發(fā)送端發(fā)送的幀的序號。 對確認(rèn)幀來說:序號(seq)表示的是接收方希望接收到的幀的序號,它表示seq 以前的各幀都已經(jīng)正確接收,希望收到序號為 seq的幀。 對否認(rèn)幀來說:序號(seq)也是表示接收方希望收到的數(shù)據(jù)幀的序號,表示接 收方已經(jīng)收到序號為seq的幀,但是這個(gè)幀出現(xiàn)錯(cuò)誤,希望發(fā)送方重新發(fā)送該數(shù)據(jù)幀。 停止等待協(xié)議采用的是單工通信, 接收端向發(fā)送端發(fā)送的確認(rèn)幀和否認(rèn)幀中沒有 數(shù)據(jù)信息,它們的數(shù)據(jù)域?yàn)榭?。由于是單工通信,發(fā)送方只發(fā)送數(shù)據(jù),所以發(fā)送方幀 的“幀的確認(rèn)號”中并沒有包含任何的確認(rèn)信息。 3、系統(tǒng)實(shí)施 此次課程設(shè)計(jì)通過C+編程

9、基本上模擬實(shí)現(xiàn)了數(shù)據(jù)鏈路層中的停止等待協(xié)議, 但 是程序中存在一定的不足,沒有能夠完全的體現(xiàn)停止等待協(xié)議的的工作原理。 在此課 程設(shè)計(jì)中,數(shù)據(jù)的發(fā)送是隨機(jī)生成的。運(yùn)行結(jié)果截圖如下所示: 服務(wù)器端的運(yùn)行截圖: 客戶端的運(yùn)行截圖: D匚umerits arid Settings Administrator桌面智(建文件夾| -口兇 connect sticcessed Press an_9to continue 二 Jd 41 結(jié)果如下所示: 客戶端: 服務(wù)器端: 4、總結(jié)與體會 經(jīng)過這幾天的課程設(shè)計(jì),通過查閱相關(guān)的資料和以前的學(xué)習(xí)以及和同學(xué)之間的交 流最終能夠較成功的實(shí)現(xiàn)該課程設(shè)計(jì)。停止等待協(xié)議

10、是數(shù)據(jù)鏈路層的一個(gè)重要協(xié)議, 也是計(jì)算機(jī)網(wǎng)絡(luò)中的一個(gè)重要協(xié)議。 在進(jìn)行課程設(shè)計(jì)時(shí)我遇到了不少的困難, 通過同 學(xué)的幫助和查閱相關(guān)的資料,最終解決了問題,模擬實(shí)現(xiàn)了停止等待協(xié)議。 在設(shè)計(jì)過程中,剛開始時(shí),沒有能夠?qū)崿F(xiàn)客戶端和服務(wù)器的連接, 最終導(dǎo)致客戶 端發(fā)送數(shù)據(jù)的失敗,從而導(dǎo)致服務(wù)器端的接收失敗。經(jīng)過查閱相關(guān)的資料,找到了錯(cuò) 誤的所在,并實(shí)現(xiàn)了停止等待協(xié)議的功能。 此外,此次課程設(shè)計(jì)中的一個(gè)難點(diǎn)就是客 戶端發(fā)送數(shù)據(jù)采用的是隨機(jī)函數(shù)rand()產(chǎn)生隨機(jī)發(fā)送的數(shù)據(jù)。 5、參考文獻(xiàn) 謝希仁計(jì)算機(jī)網(wǎng)絡(luò)電子工業(yè)出版社 附錄:源代碼 發(fā)送端:() #in elude #in elude #in elude

11、 #pragma eomme nt(lib,) #define SERVER_PORT 7300 / 偵聽端口 客戶端向服務(wù)器傳送的結(jié)構(gòu): struct BAG char packet; void main (i nt argc, char *argv) WORD wVersio nRequested; WSADATA wsaData; int ret,i,ra,data=0; SOCKET sClie nt,sListe n; struct sockaddr_i n saServer;/地址信息 struct BAG bag; char *ptr = (char *) BOOL fSucce

12、ss = TRUE; Win Sock初始化: wVersio nRequested = MAKEWORD(2, 2);/ 希望使用的 Win Sock DLL 的版本 ret = WSAStartup( wVersio nRequested, if (ret != 0) prin tf(WSAStartup() failed!n); return; 確認(rèn) Win Sock DLL支持版本: if (LOBYTE != 2 | HIBYTE( ) != 2 ) WSAClea nup(); prin tf(I nvalid Win sock vers ion!n); return; 創(chuàng)建soc

13、ket,使用TCP協(xié)議: sClie nt = socket(AFNET, SOCK_STREAM, IPPROTO_TCP); sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(sClie nt = INVALID_SOCKET) WSAClea nup(); prin tf(socket() failed!n); return; 構(gòu)建服務(wù)器地址信息: =AF_INET; 地址家族 =htons(SERVER_PORT);轉(zhuǎn)化為網(wǎng)絡(luò)字節(jié)序 連接服務(wù)器: ret = conn ect(sClie nt, (struct sockad

14、dr *) if (ret = SOCKET_ERROR) prin tf(c onn ect() successed!n); closesocket(sClie nt);關(guān)閉套接字 WSACIea nup(); return; 按照預(yù)定協(xié)議,客戶端將發(fā)送一個(gè)數(shù)字: for(i=97;i=104;i+) ra = ran d()%11; if(ra%5 = 1) data+=i; else data=i; =data; ret = sen d(sClie nt, (char *) ret = recv(sListen, ptr, sizeof(bag), 0); if!=i) i-; prin

15、 tf(se nd()successed!n); con ti nue; else if=i) printf(packet %d has been sent!n,i+1); closesocket(sClie nt);WSAClea nup(); 接受端(): #in clude #in clude #in elude #in elude #pragma eomme nt(lib,) #define SERVER_PORT 7300 / 偵聽端口 客戶端向服務(wù)器傳送的結(jié)構(gòu): struct BAG char packet; ; void mai n() WORD wVersio nRequest

16、ed; WSADATA wsaData; int ret, nLeft,le ngth; SOCKET sListe n, sServer; /偵聽套接字,連接套接字 struct sockaddr_i n saServer, saClie nt;地址信息 struct BAG bag; char *ptr,*pp; Win Sock初始化: wVersio nRequested = MAKEWORD(2, 2);/ 希望使用的 Win Sock DLL 的版本 ret = WSAStartup(wVersio nRequested, if (ret != 0) prin tf(WSAStar

17、tup() failed!n); return; 確認(rèn) Win Sock DLL支持版本: if (LOBYTE != 2 | HIBYTE( ) != 2 ) WSACIea nup(); prin tf(l nvalid Win sock vers ion!n ”); return; 創(chuàng)建Socket,使用TCP協(xié)議: sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(sListe n = INVALID_SOCKET) WSAClea nup(); prin tf(socket() failed!n); return; 構(gòu)建本

18、地地址信息: =AF_INET; 地址家族 =htons(SERVER_PORT);轉(zhuǎn)化為網(wǎng)絡(luò)字節(jié)序 =htonl(INADDR_ANY); 使用 INADDR_AN指示任意地址 綁定: ret = bind(sListen,(struct sockaddr *) if (ret = SOCKET_ERROR) printf(bind() failed! code:%dn, WSAGetLastError(); closesocket(sListe n);關(guān)閉套接字 WSAClea nup(); return; 偵聽連接請求: ret = liste n( sListe n, 5); if (

19、ret = SOCKET_ERROR) printf(listen() failed! code:%dn, WSAGetLastError(); closesocket(sListe n);關(guān)閉套接字 WSAClea nup(); return; prin tf(Wait ing for clie nt conn ect in g!n); prin tf(tips : Ctrl+c to quit!n); 阻塞等待接受客戶端連接: len gth = sizeof(saClie nt); sServer = accept(sListe n, (struct sockaddr *) if(sServer = INVALID_SOCKET) prin tf(accept() fai

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論