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

下載本文檔

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

文檔簡介

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論