




已閱讀5頁,還剩6頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
數據鏈路層協議的設計和實現樣本 數據鏈路層協議的設計和實現本文檔所提供的信息僅供參考之用,不能作為科學依據,請勿模仿。 文檔如有不當之處,請聯系本人或網站刪除。 計算機通信網絡實驗數據鏈路層協議的設計與實現學院:班級:學號:姓名:111月月111日本文檔所提供的信息僅供參考之用,不能作為科學依據,請勿模仿。 文檔如有不當之處,請聯系本人或網站刪除。 一、實驗目的計算機網絡的數據鏈路層協議保證通信雙方在有差錯的通信線路上進行無差錯的數據傳輸,是計算機網絡各層協議中通信控制功能最典型的一種協議。 本實驗實現一個數據鏈路層協議的數據傳送部分,目的在于更好地理解基本數據鏈路層協議的基本工作原理,掌握計算機網絡協議的基本實現技術。 二、實驗內容使用C語言實現下面數據鏈路層協議:1.分析和實現一個理想的鏈路層協議2.對于前面實現的協議進行擴充,實現它的第一次改進,如何防止發方過快淹沒收方。 3.對上一步再假設在不可靠的的鏈路上進行通信。 三、實驗步驟1.熟悉數據鏈路層協議的功能;2.編寫數據鏈路層協議的實現程序;3.調試并運行自己編寫的協議實現程序;4.了解協議的工作軌跡,如出現異常情況,在實驗報告中寫出原因分析;5.保留你實現的數據鏈路層協議,以備教師檢查。 四、實驗過程 11、程序功能及設計思路功能概述:用客戶端/服務器模式代表A A站、B B站。 先由客戶端輸入服務器P IP地址,發送SYN同步幀,告訴服務器準備接受。 客戶端輸入數據后,會進行C CRC編碼,再發送數據幀;服務器收到后,先進行校驗,數據正確則發送K ACK幀,客戶端則發送下一幀數據;否則服務器發送K NAK幀,客戶端重新發送該數據。 C CRC校驗:1)將收到的字符轉為t int型(232位),并將其二進制碼左移616位,存于data;2)進行C(D)=Remainder(S(D)?DL)/g(D),即C CRC校驗,得到校驗位。 3)將校驗位加在信息元后,組成424位的碼字,存于要發送的數據幀dframe。 停等式Q ARQ協議:Client:1)置置SN=0;2)收到數據,將N SN分配給該數據,如果沒有收到,則等待;3)存于要發送的數據幀中,發送給server;4)如果從r server收到確認幀,且RNSN,則N SN加加11(模22),返回22;如果收到NAK或或RN=SN,則返回33,重傳數據。 本文檔所提供的信息僅供參考之用,不能作為科學依據,請勿模仿。 文檔如有不當之處,請聯系本人或網站刪除。 Server:1)置置RN=0;2)從從t client收到一個N SN=RN的幀,進行C CRC校驗檢查,無錯后輸出,并置N RN加加 11、發送K ACK幀;否則發送K NAK幀,請求重發。 22、C C語言程序代碼:客戶端Client:/*I#include/WINSOCK API的頭文件,需要包含在項目中I#pragma ment(lib,)/WINSOCK API連接庫文件#include#includeint err;SOCKET sock;/用于服務器監聽的Socket SOCKADDR_IN addrSrv;/服務端地址unsigned char sendBuf100;/發送緩存char serverIp20;/客戶端p ip地址t int socklen=sizeof(SOCKADDR_IN);/Socket的地址值的長度int cf_len=sizeof(struct sockaddr);struct dataFrame/數據幀int seq;/分段消息的序號int SN;/發送序號unsigned intdata100;int msglen;/字符長度,采用長度計數的組幀技術;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);/本文檔所提供的信息僅供參考之用,不能作為科學依據,請勿模仿。 文檔如有不當之處,請聯系本人或網站刪除。 err=WSAStartup(wVersionRequested,&ws aData);a/wsaData用來存儲系統傳回的關于t WinSocket的資料if(LOBYTE()!=1|HIBYTE()!=1)WSACleanup();return;/*計算CRC-16*/基于232位系統,t int型長度為44字節,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 文檔如有不當之處,請聯系本人或網站刪除。 printf(input servers IP:);scanf(%s,serverIp);/輸入服務器ip=i_addr(serverIp);/設置服務器地址=AF_INET;=htons (6000);/設置服務器端口號strcpy(,SYN);=0;/發送同步消息sendto(sock,(char*)&cfra me,sizeof(cframe)+1,0,(SOCKADDR*)&addrSrv,socklen);printf(-n);=0;while (1)memset(sendBuf,0,sizeof(sendBuf);/清空緩沖區printf(Input themessage:);/輸入message,若輸入t exit則停止發送scanf(%s,sendBuf);if(strcmp(sendBuf,exit)=0)/當客戶端要斷開連接時,給服務器發送T EOT送畢控制幀strcpy(,EOT);/發送T EOT消息sendto(sock,(char*)&cframe,sizeof(cframe)+1,0,(SOCKADDR*)&addrSrv,socklen);printf(-close socket!-n);break;+;=%2;=strlen(sendBuf);caculate_crc16(sendBuf,);/發送消息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應答指令,則發送下一個messageif(!=)printf(-message isdeliveredn);本文檔所提供的信息僅供參考之用,不能作為科學依據,請勿模仿。 文檔如有不當之處,請聯系本人或網站刪除。 break;else if(strcmp(,NAK)=0)|(=)printf(-messagen);sendto(sock,(char*)&dframe,sizeof(struct dataFrame),0,(SOCKADDR*)&addrSrv,socklen);/重發該消息closesocket(sock);/關閉連接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;/用于服務器監聽的Socket SOCKADDR_IN addrSrv;/服務端地址SOCKADDR_IN addrClient;/客戶端地址unsigned charrecvBuf100;/接受緩存int cf_len=sizeof(struct sockaddr);/實際存儲在f recvBuf的地址的長度intsocklen=sizeoft(SOCKADDR_IN);/Socket的地址值的長度struct dataFrame/數據幀int seq;/分段消息的序號int SN;/發送序號本文檔所提供的信息僅供參考之用,不能作為科學依據,請勿模仿。 文檔如有不當之處,請聯系本人或網站刪除。 unsigned intdata100;int msglen;/字符長度,采用長度計數的組幀技術;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 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 文檔如有不當之處,請聯系本人或網站刪除。 data=*pdata;temp=(data&0xff0000)16;/將校驗位清零,使信息位移到低88位*msg=temp;/itoa(data,s,2);/把整數轉為二進制碼/test/printf(收到的二進制碼:%sn,s);/test for(j=0;j16;j+)/有有616作位校驗元,故循環操作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;/*發送及接受消息*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)本文檔所提供的信息僅供參考之用,不能作為科學依據,請勿模仿。 文檔如有不當之處,請聯系本人或網站刪除。 cf_len=sizeof(struct sockaddr);memset(recvBuf,0,sizeof(recvBuf);/清空接收緩沖區err=recvfrom(sock,(char*)&dframe,sizeof(struct dataFrame),0,(SOCKADDR*)&addrClient,&cf_len);/接受客戶端的數據幀if(err=9)/當客戶端關閉t socket時,發送過來的數據會使err=9,則服務器也關閉socket printf(-client closethe socket!-n);break;checkout(,);/調用checkout()函數,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);/發送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為使用不連續不可靠的數據包連接if(sock=-1)printf(Building asocket failed.n);return;bindport();/綁定端口本文檔所提供的信息僅供參考之用,不能作為科學依據,請勿模仿。 文檔如有不當之處,請聯系本人或網站刪除。 if(err!=0)printf(Binding asoc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教版歷史與社會七年級上冊第三單元第四節課《草原人家》教學設計1
- 人教版七年級音樂下冊(簡譜)第4單元《斑鳩調》教學設計
- 人教部編版七年級上冊荷葉·母親教案設計
- 高企研發費用培訓
- 2024北京通達資產管理集團公司社會化招聘4人筆試參考題庫附帶答案詳解
- 習作例文與習作 教案-部編版語文四年級上冊
- 人教部編版八年級上冊人民英雄永垂不朽獲獎教學設計及反思
- 2024兵器裝備集團春季校園招聘筆試參考題庫附帶答案詳解
- 七年級生物下冊 4.13.2《預防傳染病》教學設計 (新版)北師大版
- 2024中鐵工程設計咨詢集團有限公司社會招聘4人筆試參考題庫附帶答案詳解
- 2024年河南高職單招職測模擬題庫及答案解析(共100道試題)
- 義務教育《道德與法治》課程標準(2022年版)
- 雙減作業分層設計-四年級語文下冊分層作業設計案例13《貓》含答案
- 機動車登記翻譯(適用于出國資料)
- 感染性休克指導課件
- 監控系統維護合同正式版
- 行政管理工作流程優化方案
- 外研社小學一年級下冊英語期中試卷
- 鼓式制動器畢業設計
- 神華準能“一步酸溶法”粉煤灰生產氧化鋁焙燒爐的選型研究
- 學生成績管理系統數據流圖
評論
0/150
提交評論