资源描述
课程名称:
计算机网络
数据链路层协议
系 别:
计算机科学系
年级专业:
学 号:
姓 名:
任课教师:
成绩:
2015
年
11
月
11
日
前言
数据链路层是OSI参考模型中的第二层,介乎于物理层和网络层之间。数据链路层在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。
为达到这一目的,数据链路必须具备一系列相应的功能,主要有:如何将数据组合成数据块,在数据链路层中称这种数据块为帧(frame),帧是数据链路层的传送单位;如何控制帧在物理信道上的传输,包括如何处理传输差错,如何调节发送速率以使与接收方相匹配;以及在两个网络实体之间提供数据链路通路的建立、维持和释放的管理。
数据链路层的最基本的功能是向该层用户提供透明的和可靠的数据传送基本服务。透明性是指该层上传输的数据的内容、格式及编码没有限制,也没有必要解释信息结构的意义;可靠的传输使用户免去对丢失信息、干扰信息及顺序不正确等的担心。在物理层中这些情况都可能发生,在数据链路层中必须用纠错码来检错与纠错。数据链路层是对物理层传输原始比特流的功能的加强,将物理层提供的可能出错的物理连接改造成为逻辑上无差错的数据链路,使之对网络层表现为一无差错的线路。如果您想用尽量少的词来记住数据链路层,那就是:“帧和介质访问控制”。
数据链路层
一、实习目的
计算机网络的数据链路层协议保证通信双方在有差错的通信线路上进行无差错的数据传输,是计算机网络各层协议中通信控制功能最典型的一种协议。
本实验实现一个数据链路层协议的数据传送部分,目的在于更好地理解基本数据链路层协议的基本工作原理,掌握计算机网络协议的基本实现技术。
二、实习时间
(第 12 周到 13周)
三、 实习地点
福建农林大学东方学院网络实验室
四、实习单位和部门
福建农林大学东方学院
五、 实习内容
5.1实验内容
使用C 语言实现下面数据链路层协议:
1. 分析和实现一个理想的链路层协议
2. 对于前面实现的协议进行扩充,实现它的第一次改进,如何防止发方过快淹没收方。
3. 对上一步再假设在不可靠的的链路上进行通信。
5.2实验步骤
1. 熟悉数据链路层协议的功能;
2. 编写数据链路层协议的实现程序;
3. 调试并运行自己编写的协议实现程序;
4. 了解协议的工作轨迹,如出现异常情况,在实验报告中写出原因分析;
5. 保留你实现的数据链路层协议,以备教师检查。
5.3实验过程
5.3.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帧,请求重发。
5.4 C语言程序代码:
其客户端主要部分代码:
Client:
//*********************** client.c *****************************
#include<winsock.h> //WINSOCK API的头文件,需要包含在项目中
#pragma comment(lib,"ws2_32.lib") //WINSOCK API连接库文件
#include<stdio.h>
#include<string.h>
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;
// char s[32]; //用于测试时显示二进制码
for(i=0;i<lenth;i++,crc++,msg++){
data=(int)*msg;
// itoa(data,s,2); //把整数转为二进制码//
printf("第%d字的二进制码:%s\n",i+1,s); //test
*crc=data<<16;
for(j=0;j<16;j++)
{
if((data&0x8000))
{
data=(data<<1)&0xffff;
data=data^0x8005;
}
else
data=(data<<1)&0xffff;
}
*crc=*crc|data; //把校验位放在信息元后面,存在一个int变量中
// itoa(*crc,s,2);
// printf("加上CRC校验位后的二进制码%s\n",s);//test
}
}
六、 代码功能的相关结果
6.1测试1:
在没有传输错误情况下,在dos界面显示的传递内容的二进制码和CRC校验码
Client: 222.25.162.196,发送数据“yl”,显示“message is delivered successfully”后关闭连接。
Server: 222.25.162.196,收到数据“yl”,与上图对比,码字正确,则正确输出数据。
6.2测试2:
在传输出错情况下,在dos界面显示传递内容的二进制码和CRC校验码Client:222.25.162.196,发送数据“yl”,传输出错收到NAK后重传数据。
Server: 222.25.162.196,与上图的二进制码对比发现,第2个码字最后1一位出错,程序显示“message is wrong”,然后等待客户端重传。
6.3通信测试:
在dos界面进行通信,但隐藏了二进制码、校验码,实现的是数据的透明传输。Client:222.25.162.5
Server:222.25.162.196
分析:从上面两图可以看出,服务端和客户端可以实现通畅且准确无误的通信,基本能够实现预期功能。
七、 实习总结
通过本次实习,对数据链路层中数据帧的传输和CRC校验有了更深的了解,不仅仅是停留在书本的理论上了,而且自己对网络编程也有了更大的兴趣,通过自己动手收集资料,一步步的设计,对于以后逻辑分析能力有很大的帮助。
然后让我知道了链路管理的功能主要用于面向连接的服务。当链路两端的节点要进行通信前,必须首先确认对方已处于就绪状态,并交换一些必要的信息以对帧序号初始化,然后才能建立连接,在传输过程中则要能维持该连接。如果出现差错,需要重新初始化,重新自动建立连接。传输完毕后则要释放连接。数据连路层连接的建立维持和释放就称作链路管理。在多个站点共享同一物理信道的情况下(例如在LAN中)如何在要求通信的站点间分配和管理信道也属于数据链路层管理的范畴。
9
展开阅读全文