資源描述:
《數(shù)據(jù)鏈路層協(xié)議的設(shè)計(jì)實(shí)現(xiàn)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、.計(jì)算機(jī)通信網(wǎng)絡(luò)實(shí)驗(yàn)數(shù)據(jù)鏈路層協(xié)議的設(shè)計(jì)與實(shí)現(xiàn)學(xué)院:班級(jí):學(xué)號(hào):姓名:2012年11月11日......一、實(shí)驗(yàn)?zāi)康挠?jì)算機(jī)網(wǎng)絡(luò)的數(shù)據(jù)鏈路層協(xié)議保證通信雙方在有差錯(cuò)的通信線路上進(jìn)行無差錯(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語言實(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ā)方過快淹沒收方。3
2、.對(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)過程1、程序功能及設(shè)計(jì)思路功能概述:用客戶端/服務(wù)器模式代表A站、B站。先由客戶端輸入服務(wù)器IP地址,發(fā)送SYN同步幀,告訴服務(wù)器準(zhǔn)備接受??蛻舳溯斎霐?shù)據(jù)后,會(huì)進(jìn)行CRC編碼,再發(fā)送數(shù)據(jù)幀;服務(wù)器收到后,先進(jìn)行校驗(yàn),數(shù)據(jù)正確則發(fā)送ACK幀,客戶端則發(fā)送下一幀數(shù)
3、據(jù);否則服務(wù)器發(fā)送NAK幀,客戶端重新發(fā)送該數(shù)據(jù)。CRC校驗(yàn):1)將收到的字符轉(zhuǎn)為int型(32位),并將其二進(jìn)制碼左移16位,存于data;2)進(jìn)行C(D)=Remainder[(S(D)?D^L)/g(D)],即CRC校驗(yàn),得到校驗(yàn)位。3)將校驗(yàn)位加在信息元后,組成24位的碼字,存于要發(fā)送的數(shù)據(jù)幀dframe。停等式ARQ協(xié)議:Client:1)置SN=0;2)收到數(shù)據(jù),將SN分配給該數(shù)據(jù),如果沒有收到,則等待;3)存于要發(fā)送的數(shù)據(jù)幀中,發(fā)送給server;4)如果從server收到確認(rèn)幀,且RN>SN,則SN加1(模2),返回
4、2;如果收到NAK或RN=SN,則返回3,重傳數(shù)據(jù)。......Server:1)置RN=0;2)從client收到一個(gè)SN=RN的幀,進(jìn)行CRC校驗(yàn)檢查,無錯(cuò)后輸出,并置RN加1、發(fā)送ACK幀;否則發(fā)送NAK幀,請(qǐng)求重發(fā)。2、C語言程序代碼:客戶端Client://***********************client.c*****************************#include//WINSOCKAPI的頭文件,需要包含在項(xiàng)目中#pragmacomment(lib,"ws2_32.lib"
5、)//WINSOCKAPI連接庫文件#include#includeinterr;SOCKETsock;//用于服務(wù)器監(jiān)聽的SocketSOCKADDR_INaddrSrv;//服務(wù)端地址unsignedcharsendBuf[100];//發(fā)送緩存charserverIp[20];//客戶端ip地址intsocklen=sizeof(SOCKADDR_IN);//Socket的地址值的長(zhǎng)度intcf_len=sizeof(structsockaddr);structdataFrame//數(shù)據(jù)幀
6、{intseq;//分段消息的序號(hào)intSN;//發(fā)送序號(hào)unsignedintdata[100];intmsglen;//字符長(zhǎng)度,采用長(zhǎng)度計(jì)數(shù)的組幀技術(shù)};structconFrame//控制幀{intRN;//接收序號(hào)chartype[3];//表明幀的類型:SYN同步、EOT送畢、ACK確認(rèn)應(yīng)答、NCK否定應(yīng)答};structdataFramedframe;structconFramecframe;//************************初始化******************************voidi
7、nitialization(){WORDwVersionRequested;WSADATAwsaData;wVersionRequested=MAKEWORD(1,1);//WinSocket1.1版本......err=WSAStartup(wVersionRequested,&wsaData);//wsaData用來存儲(chǔ)系統(tǒng)傳回的關(guān)于WinSocket的資料if(LOBYTE(wsaData.wVersion)!=1
8、
9、HIBYTE(wsaData.wVersion)!=1){WSACleanup();}return;}//**
10、**********************計(jì)算CRC-16******************************//基于32位系統(tǒng),int型長(zhǎng)度為4字節(jié),CRC-16的生成多項(xiàng)式為g(D)=D^16+D^15+D^2+1voi