數(shù)據(jù)鏈路層協(xié)議的設(shè)計(jì)和實(shí)現(xiàn)樣本.doc_第1頁(yè)
數(shù)據(jù)鏈路層協(xié)議的設(shè)計(jì)和實(shí)現(xiàn)樣本.doc_第2頁(yè)
數(shù)據(jù)鏈路層協(xié)議的設(shè)計(jì)和實(shí)現(xiàn)樣本.doc_第3頁(yè)
數(shù)據(jù)鏈路層協(xié)議的設(shè)計(jì)和實(shí)現(xiàn)樣本.doc_第4頁(yè)
數(shù)據(jù)鏈路層協(xié)議的設(shè)計(jì)和實(shí)現(xiàn)樣本.doc_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

數(shù)據(jù)鏈路層協(xié)議的設(shè)計(jì)和實(shí)現(xiàn)樣本 數(shù)據(jù)鏈路層協(xié)議的設(shè)計(jì)和實(shí)現(xiàn)本文檔所提供的信息僅供參考之用,不能作為科學(xué)依據(jù),請(qǐng)勿模仿。 文檔如有不當(dāng)之處,請(qǐng)聯(lián)系本人或網(wǎng)站刪除。 計(jì)算機(jī)通信網(wǎng)絡(luò)實(shí)驗(yàn)數(shù)據(jù)鏈路層協(xié)議的設(shè)計(jì)與實(shí)現(xiàn)學(xué)院:班級(jí):學(xué)號(hào):姓名:111月月111日本文檔所提供的信息僅供參考之用,不能作為科學(xué)依據(jù),請(qǐng)勿模仿。 文檔如有不當(dāng)之處,請(qǐng)聯(lián)系本人或網(wǎng)站刪除。 一、實(shí)驗(yàn)?zāi)康挠?jì)算機(jī)網(wǎng)絡(luò)的數(shù)據(jù)鏈路層協(xié)議保證通信雙方在有差錯(cuò)的通信線路上進(jìn)行無(wú)差錯(cuò)的數(shù)據(jù)傳輸,是計(jì)算機(jī)網(wǎng)絡(luò)各層協(xié)議中通信控制功能最典型的一種協(xié)議。 本實(shí)驗(yàn)實(shí)現(xiàn)一個(gè)數(shù)據(jù)鏈路層協(xié)議的數(shù)據(jù)傳送部分,目的在于更好地理解基本數(shù)據(jù)鏈路層協(xié)議的基本工作原理,掌握計(jì)算機(jī)網(wǎng)絡(luò)協(xié)議的基本實(shí)現(xiàn)技術(shù)。 二、實(shí)驗(yàn)內(nèi)容使用C語(yǔ)言實(shí)現(xiàn)下面數(shù)據(jù)鏈路層協(xié)議:1.分析和實(shí)現(xiàn)一個(gè)理想的鏈路層協(xié)議2.對(duì)于前面實(shí)現(xiàn)的協(xié)議進(jìn)行擴(kuò)充,實(shí)現(xiàn)它的第一次改進(jìn),如何防止發(fā)方過(guò)快淹沒(méi)收方。 3.對(duì)上一步再假設(shè)在不可靠的的鏈路上進(jìn)行通信。 三、實(shí)驗(yàn)步驟1.熟悉數(shù)據(jù)鏈路層協(xié)議的功能;2.編寫數(shù)據(jù)鏈路層協(xié)議的實(shí)現(xiàn)程序;3.調(diào)試并運(yùn)行自己編寫的協(xié)議實(shí)現(xiàn)程序;4.了解協(xié)議的工作軌跡,如出現(xiàn)異常情況,在實(shí)驗(yàn)報(bào)告中寫出原因分析;5.保留你實(shí)現(xiàn)的數(shù)據(jù)鏈路層協(xié)議,以備教師檢查。 四、實(shí)驗(yàn)過(guò)程 11、程序功能及設(shè)計(jì)思路功能概述:用客戶端/服務(wù)器模式代表A A站、B B站。 先由客戶端輸入服務(wù)器P IP地址,發(fā)送SYN同步幀,告訴服務(wù)器準(zhǔn)備接受。 客戶端輸入數(shù)據(jù)后,會(huì)進(jìn)行C CRC編碼,再發(fā)送數(shù)據(jù)幀;服務(wù)器收到后,先進(jìn)行校驗(yàn),數(shù)據(jù)正確則發(fā)送K ACK幀,客戶端則發(fā)送下一幀數(shù)據(jù);否則服務(wù)器發(fā)送K NAK幀,客戶端重新發(fā)送該數(shù)據(jù)。 C CRC校驗(yàn):1)將收到的字符轉(zhuǎn)為t int型(232位),并將其二進(jìn)制碼左移616位,存于data;2)進(jìn)行C(D)=Remainder(S(D)?DL)/g(D),即C CRC校驗(yàn),得到校驗(yàn)位。 3)將校驗(yàn)位加在信息元后,組成424位的碼字,存于要發(fā)送的數(shù)據(jù)幀dframe。 停等式Q ARQ協(xié)議:Client:1)置置SN=0;2)收到數(shù)據(jù),將N SN分配給該數(shù)據(jù),如果沒(méi)有收到,則等待;3)存于要發(fā)送的數(shù)據(jù)幀中,發(fā)送給server;4)如果從r server收到確認(rèn)幀,且RNSN,則N SN加加11(模22),返回22;如果收到NAK或或RN=SN,則返回33,重傳數(shù)據(jù)。 本文檔所提供的信息僅供參考之用,不能作為科學(xué)依據(jù),請(qǐng)勿模仿。 文檔如有不當(dāng)之處,請(qǐng)聯(lián)系本人或網(wǎng)站刪除。 Server:1)置置RN=0;2)從從t client收到一個(gè)N SN=RN的幀,進(jìn)行C CRC校驗(yàn)檢查,無(wú)錯(cuò)后輸出,并置N RN加加 11、發(fā)送K ACK幀;否則發(fā)送K NAK幀,請(qǐng)求重發(fā)。 22、C C語(yǔ)言程序代碼:客戶端Client:/*I#include/WINSOCK API的頭文件,需要包含在項(xiàng)目中I#pragma ment(lib,)/WINSOCK API連接庫(kù)文件#include#includeint err;SOCKET sock;/用于服務(wù)器監(jiān)聽(tīng)的Socket SOCKADDR_IN addrSrv;/服務(wù)端地址unsigned char sendBuf100;/發(fā)送緩存char serverIp20;/客戶端p ip地址t int socklen=sizeof(SOCKADDR_IN);/Socket的地址值的長(zhǎng)度int cf_len=sizeof(struct sockaddr);struct dataFrame/數(shù)據(jù)幀int seq;/分段消息的序號(hào)int SN;/發(fā)送序號(hào)unsigned intdata100;int msglen;/字符長(zhǎng)度,采用長(zhǎng)度計(jì)數(shù)的組幀技術(shù);struct conFrame/控制幀int RN;/接收序號(hào)char type3;/表明幀的類型N:SYN同步、T EOT送畢、K ACK確認(rèn)應(yīng)答、K NCK否定應(yīng)答;struct dataFramedframe;struct conFramecframe;/*初始化*void initialization()WORD wVersionRequested;WSADATA wsaData;wVersionRequested=MAKEWORD(1,1);/本文檔所提供的信息僅供參考之用,不能作為科學(xué)依據(jù),請(qǐng)勿模仿。 文檔如有不當(dāng)之處,請(qǐng)聯(lián)系本人或網(wǎng)站刪除。 err=WSAStartup(wVersionRequested,&ws aData);a/wsaData用來(lái)存儲(chǔ)系統(tǒng)傳回的關(guān)于t WinSocket的資料if(LOBYTE()!=1|HIBYTE()!=1)WSACleanup();return;/*計(jì)算CRC-16*/基于232位系統(tǒng),t int型長(zhǎng)度為44字節(jié),CRC-616的生成多項(xiàng)式為g(D)=D16+D15+D2+1void caculate_crc16(unsigned char*msg,int lenth,unsigned int*crc)unsigned intdata=0;int i,j;/chars32;/用于測(cè)試時(shí)顯示二進(jìn)制碼for(i=0;i 文檔如有不當(dāng)之處,請(qǐng)聯(lián)系本人或網(wǎng)站刪除。 printf(input servers IP:);scanf(%s,serverIp);/輸入服務(wù)器ip=i_addr(serverIp);/設(shè)置服務(wù)器地址=AF_INET;=htons (6000);/設(shè)置服務(wù)器端口號(hào)strcpy(,SYN);=0;/發(fā)送同步消息sendto(sock,(char*)&cfra me,sizeof(cframe)+1,0,(SOCKADDR*)&addrSrv,socklen);printf(-n);=0;while (1)memset(sendBuf,0,sizeof(sendBuf);/清空緩沖區(qū)printf(Input themessage:);/輸入message,若輸入t exit則停止發(fā)送scanf(%s,sendBuf);if(strcmp(sendBuf,exit)=0)/當(dāng)客戶端要斷開(kāi)連接時(shí),給服務(wù)器發(fā)送T EOT送畢控制幀strcpy(,EOT);/發(fā)送T EOT消息sendto(sock,(char*)&cframe,sizeof(cframe)+1,0,(SOCKADDR*)&addrSrv,socklen);printf(-close socket!-n);break;+;=%2;=strlen(sendBuf);caculate_crc16(sendBuf,);/發(fā)送消息sendto(sock,(char*)&dframe,sizeof(struct tdataFrame),0,(SOCKADDR*)&addrSrv,socklen);while (1)recvfrom(sock,(char*)&cframe,sizeof(struct conFrame),0,(SOCKADDR*)&addrSrv,&cf_len);/接受服務(wù)器的應(yīng)答幀if(strcmp(,ACK)=0)/到如果收到K ACK應(yīng)答指令,則發(fā)送下一個(gè)messageif(!=)printf(-message isdeliveredn);本文檔所提供的信息僅供參考之用,不能作為科學(xué)依據(jù),請(qǐng)勿模仿。 文檔如有不當(dāng)之處,請(qǐng)聯(lián)系本人或網(wǎng)站刪除。 break;else if(strcmp(,NAK)=0)|(=)printf(-messagen);sendto(sock,(char*)&dframe,sizeof(struct dataFrame),0,(SOCKADDR*)&addrSrv,socklen);/重發(fā)該消息closesocket(sock);/關(guān)閉連接return;void main()initialization();/初始化階段,若返回值err=0,則表示初始化成功if(err)printf(Initialization falied.n);exit (0);SendFrame();WSACleanup();/*end ofprogram*服務(wù)器Server:/*I#include/WINSOCK API的頭文件,需要包含在項(xiàng)目中I#pragma ment(lib,)/WINSOCK API連接庫(kù)文件#incl ude#includeint err;SOCKET sock;/用于服務(wù)器監(jiān)聽(tīng)的Socket SOCKADDR_IN addrSrv;/服務(wù)端地址SOCKADDR_IN addrClient;/客戶端地址unsigned charrecvBuf100;/接受緩存int cf_len=sizeof(struct sockaddr);/實(shí)際存儲(chǔ)在f recvBuf的地址的長(zhǎng)度intsocklen=sizeoft(SOCKADDR_IN);/Socket的地址值的長(zhǎng)度struct dataFrame/數(shù)據(jù)幀int seq;/分段消息的序號(hào)int SN;/發(fā)送序號(hào)本文檔所提供的信息僅供參考之用,不能作為科學(xué)依據(jù),請(qǐng)勿模仿。 文檔如有不當(dāng)之處,請(qǐng)聯(lián)系本人或網(wǎng)站刪除。 unsigned intdata100;int msglen;/字符長(zhǎng)度,采用長(zhǎng)度計(jì)數(shù)的組幀技術(shù);struct conFrame/控制幀int RN;/接收序號(hào)char type3;/表明幀的類型N:SYN同步、T EOT送畢、K ACK確認(rèn)應(yīng)答、K NCK否定應(yīng)答;struct dataFramedframe;struct conFramecframe;/*初始化*void initialization()WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested=MAKEWORD(1,1);/e err=WSAStartup(wVersionRequested,&wsaData);a/wsaData用來(lái)存儲(chǔ)系統(tǒng)傳回的關(guān)于t WinSocket的資料if(LOBYTE()!=1|HIBYTE()!=1)WSACleanup();return;/*綁定端口*void bindport()=htonl(INADDR_ANY);/設(shè)置服務(wù)器地址,Y INADDR_ANY表示使用自己的P IP地址=AF_INET;=htons (6000);/設(shè)定端口為6000err=bind(sock,(LPSOCKADDR)&addrSrv,sizeof(SOCKADDR);return;C/*CRC校驗(yàn)*void checkout(unsigned int*p data,int lenth)int i,j;unsigned inttemp;unsigned intdata;g unsigned char*msg=recvBuf;/*msg指向f recvBuf的首地址/unsignedchars32;/用于測(cè)試時(shí)顯示二進(jìn)制碼for(i=0;i 文檔如有不當(dāng)之處,請(qǐng)聯(lián)系本人或網(wǎng)站刪除。 data=*pdata;temp=(data&0xff0000)16;/將校驗(yàn)位清零,使信息位移到低88位*msg=temp;/itoa(data,s,2);/把整數(shù)轉(zhuǎn)為二進(jìn)制碼/test/printf(收到的二進(jìn)制碼:%sn,s);/test for(j=0;j16;j+)/有有616作位校驗(yàn)元,故循環(huán)操作616次,使得到RemainderR(x)/g(x)if(data&0x800000)data=(data1)&0xffffff;data=data0x800500;else data=(data1)&0xffffff;if(data=0)strcpy(,ACK);/若若RemainderR(x)/g(x)=0,表示接收序列無(wú)誤elsestrcpy(,NAK);/若若RemainderR(x)/g(x)!=0,表示接收序列有誤return;pdata+;return;/*發(fā)送及接受消息*void RecvFrame()printf(-servern);while (1)recvfrom(sock,(char*)&cframe,sizeof(struct conFrame),0,(SOCKADDR*)&addrClient,&cf_len);/接受客戶端的同步幀if(strcmp(,SYN)=0)printf(-connect with%n,i_ntoa();break;while (1)本文檔所提供的信息僅供參考之用,不能作為科學(xué)依據(jù),請(qǐng)勿模仿。 文檔如有不當(dāng)之處,請(qǐng)聯(lián)系本人或網(wǎng)站刪除。 cf_len=sizeof(struct sockaddr);memset(recvBuf,0,sizeof(recvBuf);/清空接收緩沖區(qū)err=recvfrom(sock,(char*)&dframe,sizeof(struct dataFrame),0,(SOCKADDR*)&addrClient,&cf_len);/接受客戶端的數(shù)據(jù)幀if(err=9)/當(dāng)客戶端關(guān)閉t socket時(shí),發(fā)送過(guò)來(lái)的數(shù)據(jù)會(huì)使err=9,則服務(wù)器也關(guān)閉socket printf(-client closethe socket!-n);break;checkout(,);/調(diào)用checkout()函數(shù),C CRC檢驗(yàn)接收消息是否正確if(strcmp(,ACK)=0)printf(client:%sn,recvBuf);printf(-message iscorrect!-n);=(+1)%2;else if(strcmp(,NAK)=0)=;printf(-message iswrong!-n);sendto(sock,(char*)&cframe,sizeof(cframe),0,(SOCKADDR*)&addrClient,socklen);/發(fā)送K ACK幀或K NAK幀printf(-The end!-n);return;void main()initialization();/初始化階段,若返回值err=0,則表示初始化成功if(err!=0)printf(Intialization failed.n);return;sock=socket(AF_INET,SOCK_DGRAM,0);/建立socket,SOM CK_DGRAM為使用不連續(xù)不可靠的數(shù)據(jù)包連接if(sock=-1)printf(Building asocket failed.n);return;bindport();/綁定端口本文檔所提供的信息僅供參考之用,不能作為科學(xué)依據(jù),請(qǐng)勿模仿。 文檔如有不當(dāng)之處,請(qǐng)聯(lián)系本人或網(wǎng)站刪除。 if(err!=0)printf(Binding asoc

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論