計算機(jī)網(wǎng)絡(luò)關(guān)于數(shù)據(jù)鏈路層協(xié)議的實驗報告參考_第1頁
計算機(jī)網(wǎng)絡(luò)關(guān)于數(shù)據(jù)鏈路層協(xié)議的實驗報告參考_第2頁
計算機(jī)網(wǎng)絡(luò)關(guān)于數(shù)據(jù)鏈路層協(xié)議的實驗報告參考_第3頁
計算機(jī)網(wǎng)絡(luò)關(guān)于數(shù)據(jù)鏈路層協(xié)議的實驗報告參考_第4頁
計算機(jī)網(wǎng)絡(luò)關(guān)于數(shù)據(jù)鏈路層協(xié)議的實驗報告參考_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、計算機(jī)網(wǎng)絡(luò)關(guān)于數(shù)據(jù)鏈路層協(xié)議的實驗報告計算機(jī)網(wǎng)絡(luò)關(guān)于數(shù)據(jù)鏈路層協(xié)議的實驗報告6/7計算機(jī)網(wǎng)絡(luò)關(guān)于數(shù)據(jù)鏈路層協(xié)議的實驗報告實 驗 報 告實驗名稱數(shù)據(jù)鏈路層協(xié)議的理解與實現(xiàn) 課程名稱計算機(jī)網(wǎng)絡(luò)姓名王穎學(xué)號16008404日期地點成績教師王磊電 氣 工 程 學(xué) 院東 南 大 學(xué)實驗一 數(shù)據(jù)鏈路層協(xié)議的理解與實現(xiàn)一.實驗?zāi)康模?.加深對流量控制、差錯處理方法的理解;2.熟悉TCP/IP編程, 將書本知識運(yùn)用到實驗中;3.開拓學(xué)生的創(chuàng)新意識,培養(yǎng)學(xué)生的獨立動手操作的能力;二.實驗內(nèi)容:利用已有的模擬信道程序,編制發(fā)送、接收程序的部分模塊,使系統(tǒng)具有可靠的收發(fā)功能。具體要求采用無連接Socket編程地址與

2、端口發(fā)送端: 地址:127.0.0.1 端口:8001接收端: 地址:127.0.0.1 端口:6001數(shù)據(jù)幀格式:00111100序號數(shù)據(jù)校驗位長度00111100 應(yīng)答幀格式:00111100應(yīng)答00111100需考慮的異常情況:出錯、丟失、延時采用停等協(xié)議單工方式ACK/NAK的表示:ACK:0 x06 NAK:0 x15待完成模塊要求1)發(fā)送程序:偶校驗;編碼;發(fā)送、接收;差錯處理、流量控制。2)接收程序:檢查偶校驗;應(yīng)答;發(fā)送、接收三.實驗環(huán)境(軟件、硬件及條件):Microsoft visual C+ 6.0四.實驗原理程序?qū)崿F(xiàn)的原理Windows Sockets(套接字) 是在W

3、indows下一套開放的、支持多種協(xié)議的網(wǎng)絡(luò)編程接口規(guī)范。為Windows下網(wǎng)絡(luò)異步通信提供了一種方便的開發(fā)和運(yùn)行環(huán)境。Windows Sockets規(guī)范建立在BSD UNIX 中實現(xiàn)的Berkeley 套接字模型上,現(xiàn)已是TCP/IP網(wǎng)絡(luò)的標(biāo)準(zhǔn)。它獨立于底層的協(xié)議。其原理示意圖如下數(shù)據(jù)鏈路層數(shù)據(jù)鏈路層目的是建立在物理層基礎(chǔ)上,通過一些數(shù)據(jù)鏈路層協(xié)議,在不太可靠的物理鏈路上實現(xiàn)可靠的數(shù)據(jù)傳輸。即數(shù)據(jù)鏈路層提供網(wǎng)絡(luò)中相鄰節(jié)點之間可靠的數(shù)據(jù)通信。數(shù)據(jù)鏈路層的主要功能是為網(wǎng)絡(luò)層提供連接服務(wù),并在數(shù)據(jù)鏈路連接上傳送幀。依據(jù)功能可以分為有連接和無連接兩種。本實驗采用的是有應(yīng)答,無連接服務(wù)。無連接服務(wù)時,

4、發(fā)送方的數(shù)據(jù)鏈路層要發(fā)送數(shù)據(jù)時,就直接發(fā)送數(shù)據(jù)幀。接收方的數(shù)據(jù)鏈路層能夠接受數(shù)據(jù)幀,或者收到的幀校驗正確,就像源主機(jī)數(shù)據(jù)鏈路層發(fā)送應(yīng)答幀;不能接受或接受到的幀校驗不正確時,就返回否定應(yīng)答,發(fā)送端要么重發(fā)原幀,要么進(jìn)入等待狀態(tài)。面向無連接的socket使用方法如下:3) 停等協(xié)議停止-等待 ARQ協(xié)議是指發(fā)送端發(fā)送一個幀后,不繼續(xù)發(fā)送而是等待對該幀的確認(rèn)。在發(fā)送端,每次只能處理數(shù)據(jù)鏈路層的發(fā)送緩沖區(qū)中的一個數(shù)據(jù)幀,將緩沖區(qū)中的該幀發(fā)送出去,同時啟動定時器(本實驗采用1.5秒),等待接收端會送的確認(rèn)幀。當(dāng)發(fā)送端收到ACK確認(rèn)后,認(rèn)為該幀已成功到達(dá),再取一個新的數(shù)據(jù)幀進(jìn)行發(fā)送。若收到由接收端發(fā)過來的

5、否定確認(rèn)NAK,則必須暫時保存已發(fā)送給的數(shù)據(jù)幀的備份,進(jìn)行重傳。本實驗中,ACK:0 x06 NAK:0 x15。本實驗的數(shù)據(jù)在數(shù)據(jù)鏈路上傳輸?shù)那闆r有四種,即正常、丟失、延時、出錯。采用停等協(xié)議時如下:程序功能說明,各個模塊的詳細(xì)說明;核心模塊程序流程圖;五.實驗方法:主要源代碼說明;1.發(fā)送方(Sender)程序模塊發(fā)送信息int SendMsg(char *msg, int len) bSending=1; int n; n = sizeof(channelsender_addr); sendto(sender_sockfd, msg, len, 0, (struct sockaddr *

6、) &channelsender_addr, n); return 0;接收信息int ReceiverMsg(char *msg) int n;n = sizeof(channelsender_addr);recvfrom(sender_sockfd,msg,MAX_MSG_SIZE,0,(structsockaddr*)&channelsender_addr, &n); bSending=0;return 0;通過設(shè)置bSending變量,使用SenderView中的CSenderView:OnTimer (UINT nIDEvent),從而使得數(shù)據(jù)幀在超時1.5秒后可以重發(fā),如此可以實現(xiàn)

7、延時和出錯情況下的自動重發(fā)功能。使用庫函數(shù)sendto ( SOCKET s, const char FAR * buf, int len, int flags,const struct sockaddr FAR * to, int tolen )和recvfrom ( SOCKETs, char FAR* buf, int len, int flags,struct sockaddr FAR* from, int FAR* fromlen );可以實現(xiàn)構(gòu)成數(shù)據(jù)幀產(chǎn)生發(fā)送的信息:頭、序號、數(shù)據(jù)、校驗位、長度、尾void Encode(char msg, int no, int len, cha

8、r *newmsg) int FLAG; int count=0; char temp=msg; while(temp!=0) if(temp%2)!=0) count+; temp=temp/2;if(count%2=1) FLAG=1;else FLAG=0;*newmsg=HEADER;*(newmsg+1)=no;*(newmsg+2)=msg;*(newmsg+3)=FLAG;*(newmsg+4)=len;*(newmsg+5)=HEADER;將newmsg數(shù)組按數(shù)據(jù)幀格式賦值,其中頭尾均為HEADER(00111100),通過按位取余計算出1的個數(shù),采取奇校驗,如果個數(shù)為基數(shù),則

9、校驗位為1,否則為0.檢查應(yīng)答幀 如果返回的應(yīng)答幀數(shù)據(jù)位為ACK,則說明正確發(fā)送信息 ,否則發(fā)送出現(xiàn)錯誤。BOOL check_data(char *msg)if(*(msg+1)=ACK) return TRUE; else return FALSE;接收從信道發(fā)來的信息LONG CMainFrame:MyChannelSend(UINT wParam,UINT lParam)char msgMAX_FRAME_LEN;/* 緩沖區(qū)*/char str_show100;/接收信息,寫入msgReceiverMsg(msg);/接受信息使用庫函數(shù)ReceiverMsg/處理信息if(check

10、_data(msg)=1) /收到正確的應(yīng)答幀if (iSendnomsglen-1) /尚未發(fā)完iSendno+; /繼續(xù)發(fā)送Encode(str_sendiSendno, iSendno, msglen, now_send);/產(chǎn)生要發(fā)送的信息SendMsg(now_send, DATA_FRAME_LEN);Show_msg_ListBox(已發(fā)送數(shù)據(jù):);elseSendMsg(now_send, DATA_FRAME_LEN);/重新發(fā)送Show_msg_ListBox(錯誤數(shù)據(jù):);在發(fā)送方處理接受的信息時,即處理接受的應(yīng)答幀時,如果收到正確的應(yīng)答幀則繼續(xù)發(fā)送,如果應(yīng)答幀顯示發(fā)送信

11、息錯誤,則重新發(fā)送。程序根據(jù)已經(jīng)正確接收的幀數(shù)(iSendno)和待發(fā)送的報文總長度(msglen)的比較,來判斷信息是否已經(jīng)全部正確發(fā)送。其中,繼續(xù)發(fā)送時調(diào)用Encode函數(shù)將要發(fā)送的數(shù)據(jù)構(gòu)成幀,給信息的序號即是它在字符串中的序號,如此即可保證信息的按序發(fā)送,不會出現(xiàn)順序錯誤的情況。2.接收方(Receiver)程序模塊接收信息int ReceiverMsg(char *msg) int n;n=sizeof(channelreceiver_addr);recvfrom(receiver_sockfd,msg,1000,0,(structsockaddr*)&channelreceiver_

12、addr, &n);return 0;發(fā)送信息int SendMsg(char *msg,int len)int n;n=sizeof(channelreceiver_addr);sendto(receiver_sockfd,msg,len,0,(structsockaddr*&channelreceiver_addr, n);return 0; 接收方的發(fā)送與接受信息模塊與發(fā)送方的該模塊類似,不同的只有庫函數(shù)中的套接字,而且不需要使用bsending變量。檢查校驗位BOOL check_data(char *msg) int flag;int count=0;char temp=*(msg+

13、2);while(temp!=0)if(temp%2)!=0)count+;temp=temp/2;if(count%2=1) flag=1;else flag=0;if(*(msg+3)=flag) return 1;else return 0;檢查校驗位即檢查數(shù)據(jù)的正誤,用和前面計算校驗位相同的辦法,計算接收到的數(shù)據(jù)的校驗位,如果相同,則說明數(shù)據(jù)正確,不同則說明錯誤。接受從信道發(fā)來的信息LONG CMainFrame:MyChannelSend(UINT wParam,UINT lParam)char str_sendMAX_FRAME_LEN;char check_ansANS_FRAM

14、E_LEN;char show_str100;/接收信息,寫入str_sendint i;for(i=iRevno;i100;i+) rev_datai=0;ReceiverMsg(str_send); /接受信息時注意要給str_send數(shù)組清零,而且不能只清一位,否則顯示數(shù)據(jù)時,如果之前發(fā)送的一個數(shù)據(jù)長于后來發(fā)送的數(shù)據(jù)的話,會導(dǎo)致顯示出之前的信息。/處理if(iRevnostr_send4) /報文信息未發(fā)送完,小于待發(fā)送的長度 if(check_data(str_send)=1) /收到的信息正確(包括正常情況和收到延時的數(shù)據(jù)的情況) check_ans0=HEADER; check_a

15、ns1=ACK; check_ans2=HEADER; SendMsg(check_ans,ANS_FRAME_LEN); /發(fā)送正確的應(yīng)答幀 if(str_send1=iRevno) /如果是正常情況,該數(shù)據(jù)有效,需要存儲rev_dataiRevno=str_send2;/存儲接收的數(shù)據(jù) iRevno+; else Show_msg_ListBox(延時數(shù)據(jù)); else /信息接收出錯 check_ans0=HEADER; check_ans1=NAK; check_ans2=HEADER; SendMsg(check_ans,ANS_FRAME_LEN); /發(fā)送錯誤的應(yīng)答幀if(iRevno=str_send4) /信息接收完成 Show_msg_ListBox(已接收數(shù)據(jù):); Show_msg_L

溫馨提示

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

評論

0/150

提交評論