数据链路层协议的设计与实现.docx

上传人:11****ws 文档编号:2204325 上传时间:2019-05-01 格式:DOCX 页数:12 大小:252.96KB
下载 相关 举报
数据链路层协议的设计与实现.docx_第1页
第1页 / 共12页
数据链路层协议的设计与实现.docx_第2页
第2页 / 共12页
数据链路层协议的设计与实现.docx_第3页
第3页 / 共12页
数据链路层协议的设计与实现.docx_第4页
第4页 / 共12页
数据链路层协议的设计与实现.docx_第5页
第5页 / 共12页
点击查看更多>>
资源描述

1、计算机通信网络实验数据链路层协议的设计与实现学院: 班级: 学号: 姓名: 2012 年 11 月 11 日一、 实验目的计算机网络的数据链路层协议保证通信双方在有差错的通信线路上进行无差错的数据传输,是计算机网络各层协议中通信控制功能最典型的一种协议。本实验实现一个数据链路层协议的数据传送部分,目的在于更好地理解基本数据链路层协议的基本工作原理,掌握计算机网络协议的基本实现技术。二、 实验内容使用 C 语言实现下面数据链路层协议:1. 分析和实现一个理想的链路层协议2. 对于前面实现的协议进行扩充,实现它的第一次改进,如何防止发方过快淹没收方。3. 对上一步再假设在不可靠的的链路上进行通信。

2、三、 实验步骤1. 熟悉数据链路层协议的功能;2. 编写数据链路层协议的实现程序;3. 调试并运行自己编写的协议实现程序;4. 了解协议的工作轨迹,如出现异常情况,在实验报告中写出原因分析;5. 保留你实现的数据链路层协议,以备教师检查。四、 实验过程1、程序功能及设计思路功能概述:用客户端/服务器模式代表 A 站、B 站。先由客户端输入服务器 IP 地址,发送SYN 同步帧,告诉服务器准备接受。客户端输入数据后,会进行 CRC 编码,再发送数据帧;服务器收到后,先进行校验,数据正确则发送 ACK 帧,客户端则发送下一帧数据;否则服务器发送 NAK 帧,客户端重新发送该数据。CRC 校验:1)

3、 将收到的字符转为 int 型(32 位) ,并将其二进制码左移 16 位,存于data;2) 进行 C(D)=Remainder(S(D)DL)/g(D) ,即 CRC 校验,得到校验位。3) 将校验位加在信息元后,组成 24 位的码字,存于要发送的数据帧 dframe。停等式 ARQ 协议:Client: 1) 置 SN=0;2) 收到数据,将 SN 分配给该数据,如果没有收到,则等待;3) 存于要发送的数据帧中,发送给 server;4) 如果从 server 收到确认帧,且 RNSN,则 SN 加 1(模 2) ,返回 2;如果收到 NAK 或 RN=SN,则返回 3,重传数据。Ser

4、ver:1) 置 RN=0;2) 从 client 收到一个 SN=RN 的帧,进行 CRC 校验检查,无错后输出,并置 RN加 1、发送 ACK 帧;否则发送 NAK 帧,请求重发。 2、C 语言程序代码:客户端 Client:/* client.c *#include /WINSOCK API 的头文件,需要包含在项目中#pragma comment(lib,“ws2_32.lib“) /WINSOCK API 连接库文件#include#includeint err;SOCKET sock; /用于服务器监听的 SocketSOCKADDR_IN addrSrv; /服务端地址unsig

5、ned char sendBuf100; /发送缓存char serverIp20; /客户端 ip 地址int socklen=sizeof(SOCKADDR_IN); /Socket 的地址值的长度int cf_len=sizeof(struct sockaddr);struct dataFrame /数据帧int seq; /分段消息的序号int SN; /发送序号unsigned int data100;int msglen; /字符长度,采用长度计数的组帧技术;struct conFrame /控制帧int RN; /接收序号char type3; /表明帧的类型 :SYN 同步、E

6、OT 送毕、ACK 确认应答、 NCK 否定应答;struct dataFrame dframe;struct conFrame cframe;/* 初始化*void initialization() WORD wVersionRequested;WSADATA wsaData;wVersionRequested = MAKEWORD( 1, 1 ); /WinSocket1.1 版本err = WSAStartup( wVersionRequested, /wsaData 用来存储系统传回的关于 WinSocket 的资料if ( LOBYTE( wsaData.wVersion ) !=

7、1 | HIBYTE( wsaData.wVersion ) != 1 )WSACleanup( ); return;/* 计算 CRC-16*/基于 32 位系统,int 型长度为 4 字节,CRC-16 的生成多项式为 g(D)=D16+D15+D2+1void caculate_crc16(unsigned char*msg,int lenth,unsigned int *crc)unsigned int data=0;int i,j;/ char s32; /用于测试时显示二进制码for(i=0;i /WINSOCK API 的头文件,需要包含在项目中#pragma comment(l

8、ib,“ws2_32.lib“) /WINSOCK API 连接库文件#include#includeint err;SOCKET sock; /用于服务器监听的 SocketSOCKADDR_IN addrSrv; /服务端地址SOCKADDR_IN addrClient; /客户端地址unsigned char recvBuf100; /接受缓存int cf_len=sizeof(struct sockaddr); /实际存储在 recvBuf 的地址的长度int socklen=sizeof(SOCKADDR_IN); /Socket 的地址值的长度struct dataFrame /数

9、据帧int seq; /分段消息的序号int SN; /发送序号unsigned int data100;int msglen; /字符长度,采用长度计数的组帧技术;struct conFrame /控制帧int RN; /接收序号char type3; /表明帧的类型 :SYN 同步、EOT 送毕、ACK 确认应答、 NCK 否定应答;struct dataFrame dframe;struct conFrame cframe; /* 初始化*void initialization() WORD wVersionRequested;WSADATA wsaData;int err;wVersi

10、onRequested = MAKEWORD( 1, 1 ); /WinSocket1.1 版本err = WSAStartup( wVersionRequested, /wsaData 用来存储系统传回的关于 WinSocket 的资料if ( LOBYTE( wsaData.wVersion ) != 1 | HIBYTE( wsaData.wVersion ) != 1 )WSACleanup( ); return;/* 绑定端口 *void bindport()addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); /设置服务器地址,INADDR

11、_ANY 表示使用自己的 IP 地址addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000); /设定端口为 6000err=bind(sock,(LPSOCKADDR)return;/* CRC 校验 *void checkout(unsigned int *pdata,int lenth)int i,j;unsigned int temp;unsigned int data;unsigned char *msg=recvBuf; /*msg 指向 recvBuf 的首地址/ unsigned char s32; /用于测试时显示二进制码

12、for(i=0;i16; /将校验位清零,使信息位移到低 8 位*msg=temp;/ itoa(data,s,2); /把整数转为二进制码 /test/ printf(“收到的二进制码:%sn“,s); /testfor(j=0;j16;j+) /有 16 位校验元,故循环操作 16 次,使得到RemainderR(x)/g(x) if(datadata=data0x800500;else data=(data1)if(data=0)strcpy(cframe.type,“ACK“); /若 RemainderR(x)/g(x)=0,表示接收序列无误else strcpy(cframe.ty

13、pe,“NAK“); /若 RemainderR(x)/g(x)!=0,表示接收序列有误return;pdata+;return ;/* 发送及接受消息 *void RecvFrame()printf(“-server waitting.-n“);while(1)recvfrom(sock,(char*) /接受来自客户端的同步帧if(strcmp(cframe.type,“SYN“)=0)printf(“-connect with %s.-n“,inet_ntoa(addrClient.sin_addr);break;while(1)cf_len=sizeof(struct sockaddr

14、);memset(recvBuf,0,sizeof(recvBuf); /清空接收缓冲区err=recvfrom(sock,(char*) /接受来自客户端的数据帧if(err=9) /当客户端关闭 socket 时,发送过来的数据会使 err=9,则服务器也关闭 socketprintf(“-client close the socket!-n“);break;checkout(dframe.data,dframe.msglen); /调用 checkout()函数,CRC 检验接收消息是否正确if(strcmp(cframe.type,“ACK“)=0)printf(“client:%sn

15、“,recvBuf);printf(“-message is correct!-n“);cframe.RN=(dframe.SN+1)%2;else if(strcmp(cframe.type,“NAK“)=0)cframe.RN=dframe.SN;printf(“-message is wrong!-n“);sendto(sock,(char*) /发送 ACK 帧或 NAK 帧printf(“-The end!-n“);return;void main()initialization(); /初始化阶段,若返回值 err=0,则表示初始化成功if(err!=0)printf(“Intia

16、lization failed.n“);return;sock=socket(AF_INET,SOCK_DGRAM,0); /建立 socket,SOCK_DGRAM 为使用不连续不可靠的数据包连接if(sock=-1)printf(“Building a socket failed.n“);return; bindport(); /绑定端口if(err!=0)printf(“Binding a socket failed.n“);return; RecvFrame(); /接受客户端发送数据closesocket(sock); /关闭连接WSACleanup();/* end of program *3、实验结果测试 1:在没有传输错误情况下,在 dos 界面显示的传递内容的二进制码和 CRC 校验码Client: 222.25.162.196,发送数据“yl” ,显示“message is delivered successfully”后关闭连接。Server: 222.25.162.196,收到数据“yl ”,与上图对比,码字正确,则正确输出数据。测试 2:在传输出错情况下,在 dos 界面显示传递内容的二进制码和 CRC 校验码Client:222.25.162.196 ,发送数据 “yl”,传输出错收到 NAK 后重传数据。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。