当前位置:文档之家› 数据链路层协议的设计实现

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

计算机通信网络实验

数据链路层协议的设计与

实现

学院:

班级:

学号:

姓名:

2012年11月11日一、实验目的

计算机网络的数据链路层协议保证通信双方在有差错的通信线路上进行无差错的数据传输,是计算机网络各层协议中通信控制功能最典型的一种协议。

本实验实现一个数据链路层协议的数据传送部分,目的在于更好地理解基本数据链路层协议的基本工作原理,掌握计算机网络协议的基本实现技术。

二、实验内容

使用C 语言实现下面数据链路层协议:

1.分析和实现一个理想的链路层协议

2.对于前面实现的协议进行扩充,实现它的第一次改进,如何防止发方过快淹没

收方。

3.对上一步再假设在不可靠的的链路上进行通信。

三、实验步骤

1.熟悉数据链路层协议的功能;

2.编写数据链路层协议的实现程序;

3.调试并运行自己编写的协议实现程序;

4.了解协议的工作轨迹,如出现异常情况,在实验报告中写出原因分析;

5.保留你实现的数据链路层协议,以备教师检查。

四、实验过程

1、程序功能及设计思路

功能概述:

用客户端/服务器模式代表A站、B站。先由客户端输入服务器IP地址,发送SYN 同步帧,告诉服务器准备接受。客户端输入数据后,会进行CRC编码,再发送数据帧;服务器收到后,先进行校验,数据正确则发送ACK帧,客户端则发送下一帧数据;否则服务器发送NAK帧,客户端重新发送该数据。

CRC校验:

1)将收到的字符转为int型(32位),并将其二进制码左移16位,存于data;

2)进行C(D)=Remainder[(S(D)∙D^L)/g(D) ],即CRC校验,得到校验位。

3)将校验位加在信息元后,组成24位的码字,存于要发送的数据帧dframe。停等式ARQ协议:

Client:

1)置SN=0;

2)收到数据,将SN分配给该数据,如果没有收到,则等待;

3)存于要发送的数据帧中,发送给server;

4)如果从server收到确认帧,且RN>SN,则SN加1(模2),返回2;如果收

到NAK或RN=SN,则返回3,重传数据。

Server:

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

#include

int err;

SOCKET sock; //用于服务器监听的Socket

SOCKADDR_IN addrSrv; //服务端地址

unsigned char sendBuf[100]; //发送缓存

char serverIp[20]; //客户端ip地址

int socklen=sizeof(SOCKADDR_IN); //Socket的地址值的长度

int cf_len=sizeof(struct sockaddr);

struct dataFrame //数据帧

{

int seq; //分段消息的序号

int SN; //发送序号

unsigned int data[100];

int msglen; //字符长度,采用长度计数的组帧技术

};

struct conFrame //控制帧

{

int RN; //接收序号

char type[3];

//表明帧的类型:SYN同步、EOT送毕、ACK确认应答、NCK否定应答};

struct dataFrame dframe;

struct conFrame cframe;

//************************ 初始化******************************

void initialization()

{

WORD wVersionRequested;

WSADATA wsaData;

wVersionRequested = MAKEWORD( 1, 1 ); //WinSocket1.1版本

err = WSAStartup( wVersionRequested, &wsaData );

//wsaData用来存储系统传回的关于WinSocket的资料

if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ){

WSACleanup( );

}

return;

}

//************************ 计算CRC-16******************************

//基于32位系统,int型长度为4字节,CRC-16的生成多项式为

g(D)=D^16+D^15+D^2+1

void caculate_crc16(unsigned char*msg,int lenth,unsigned int *crc)

{

unsigned int data=0;

int i,j;

相关主题