您好,欢迎来到欧得旅游网。
搜索
您的当前位置:首页计算机网络关于数据链路层协议的实验报告

计算机网络关于数据链路层协议的实验报告

来源:欧得旅游网


实 验 报 告

实验名称 课程名称

数据链路层协议的理解与实现

计算机网络

姓名 王颖 日期 成绩

学号

地点

教师

王磊

电 气 工 程 学 院 东 南 大 学

第0页 共7页

.

实验一 数据链路层协议的理解与实现

一.实验目的:

1.加深对流量控制、差错处理方法的理解;

2.熟悉TCP/IP编程, 将书本知识运用到实验中;

3.开拓学生的创新意识,培养学生的动手操作的能力;

二.实验内容:

1. 利用已有的模拟信道程序,编制发送、接收程序的部分模块,使系统具有可靠的收发功能。具体要求 1) 采用无连接Socket编程 2) 地址与端口

发送端: 地址:127.0.0.1 端口:8001 接收端: 地址:127.0.0.1 端口:6001 3) 数据帧格式: 序号 应答 数据 校验位 长度 应答帧格式: 4) 需考虑的异常情况:出错、丢失、延时 5) 采用停等协议 6) 单工方式

7) ACK/NAK的表示:ACK:0x06 NAK:0x15 2. 待完成模块要求

1)发送程序:偶校验;编码;发送、接收;差错处理、流量控制。 2)接收程序:检查偶校验;应答;发送、接收

三.实验环境(软件、硬件及条件):

Microsoft visual C++ 6.0

四.实验原理

1、 程序实现的原理

Windows Sockets(套接字) 是在Windows下一套开放的、支持多种协议的网络编程接口规范。为Windows下网络异步通信提供了一种方便的开发和运行环境。

Windows Sockets规范建立在BSD UNIX 中实现的Berkeley 套接字模型上,现已是TCP/IP网络的标准。它于底层的协议。

1 / 7'.

.

其原理示意图如下

1) 数据链路层

数据链路层目的是建立在物理层基础上,通过一些数据链路层协议,在不太可靠的物理链路上实现可靠的数据传输。即数据链路层提供网络中相邻节点之间可靠的数据通信。

数据链路层的主要功能是为网络层提供连接服务,并在数据链路连接上传送帧。依据功能可以分为有连接和无连接两种。本实验采用的是有应答,无连接服务。

无连接服务时,发送方的数据链路层要发送数据时,就直接发送数据帧。接收方的数据链路层能够接受数据帧,或者收到的帧校验正确,就像源主机数据链路层发送应答帧;不能接受或接受到的帧校验不正确时,就返回否定应答,发送端要么重发原帧,要么进入等待状态。

面向无连接的socket使用方法如下:

3) 停等协议

停止-等待 ARQ协议是指发送端发送一个帧后,不继续发送而是等待对该

2 / 7'.

.

帧的确认。在发送端,每次只能处理数据链路层的发送缓冲区中的一个数据帧,将缓冲区中的该帧发送出去,同时启动定时器(本实验采用1.5秒),等待接收端会送的确认帧。当发送端收到ACK确认后,认为该帧已成功到达,再取一个新的数据帧进行发送。若收到由接收端发过来的否定确认NAK,则必须暂时保存已发送给的数据帧的备份,进行重传。本实验中,ACK:0x06 NAK:0x15。

本实验的数据在数据链路上传输的情况有四种,即正常、丢失、延时、出错。采用停等协议时如下:

2、 程序功能说明,各个模块的详细说明; 3、 核心模块程序流程图;

五.实验方法:

1、 主要源代码说明;

1.发送方(Sender)程序模块

1) 发送信息

int SendMsg(char *msg, int len){ bSending=1; int n;

n = sizeof(channelsender_addr);

sendto(sender_sockfd, msg, len, 0, (struct sockaddr *) &channelsender_addr, n); return 0;} 2) 接收信息

int ReceiverMsg(char *msg){ int n;

n = sizeof(channelsender_addr);

recvfrom(sender_sockfd,msg,MAX_MSG_SIZE,0,(structsockaddr*)&channelsender_addr, &n);

bSending=0;return 0; }

通过设置bSending变量,使用SenderView中的CSenderView::OnTimer (UINT nIDEvent),从而使得数据帧在超时1.5秒后可以重发,如此可以实现延时和出错情况下的自动重发功能。使用库函数sendto ( SOCKET s, const char FAR * buf, int len, int flags,const struct sockaddr FAR * to, int tolen )和recvfrom ( SOCKETs, char FAR* buf, int len, int flags,struct sockaddr FAR* from, int FAR* fromlen );可以实现 3) 构成数据帧

产生发送的信息:头、序号、数据、校验位、长度、尾 void Encode(char msg, int no, int len, char *newmsg){ int FLAG; int count=0; char temp=msg; while(temp!=0){ if((temp%2)!=0) count++;

3 / 7'.

.

temp=temp/2; }

if(count%2==1) FLAG=1; else FLAG=0;

*newmsg=HEADER; *(newmsg+1)=no; *(newmsg+2)=msg; *(newmsg+3)=FLAG; *(newmsg+4)=len;

*(newmsg+5)=HEADER;}

将newmsg数组按数据帧格式赋值,其中头尾均为HEADER(00111100),通过按位取余计算出1的个数,采取奇校验,如果个数为基数,则校验位为1,否则为0. 4) 检查应答帧

如果返回的应答帧数据位为ACK,则说明正确发送信息 ,否则发送出现错误。 BOOL check_data(char *msg){

if(*(msg+1)==ACK) return TRUE; else return FALSE;} 5) 接收从信道发来的信息

LONG CMainFrame::MyChannelSend(UINT wParam,UINT lParam){

char msg[MAX_FRAME_LEN];/* 缓冲区*/ char str_show[100]; //接收信息,写入msg

ReceiverMsg(msg);//接受信息使用库函数ReceiverMsg //处理信息

if(check_data(msg)==1) //收到正确的应答帧{ if (iSendnoEncode(str_send[iSendno], iSendno, msglen, now_send);//产生要发送的信息 SendMsg(now_send, DATA_FRAME_LEN); Show_msg_ListBox(\"已发送数据:\");}} else{

SendMsg(now_send, DATA_FRAME_LEN);//重新发送 Show_msg_ListBox(\"错误数据:\");} 在发送方处理接受的信息时,即处理接受的应答帧时,如果收到正确的应答帧则继续发送,如果应答帧显示发送信息错误,则重新发送。程序根据已经正确接收的帧数(iSendno)和待发送的报文总长度(msglen)的比较,来判断信息是否已经全部正确发送。其中,继续发送时调用Encode函数将要发送的数据构成帧,给信息的序号即是它在字符串中的序号,如此即可保证信息的按序发送,不会出现顺序错误的情况。

2.接收方(Receiver)程序模块

1) 接收信息

int ReceiverMsg(char *msg){

int n;

n=sizeof(channelreceiver_addr);

recvfrom(receiver_sockfd,msg,1000,0,(structsockaddr*)&channelreceiver_addr, &n);return 0; } 2) 发送信息

int SendMsg(char *msg,int len){

int n;n=sizeof(channelreceiver_addr);

sendto(receiver_sockfd,msg,len,0,(structsockaddr*&channelreceiver_addr, n);return 0; }

接收方的发送与接受信息模块与发送方的该模块类似,不同的只有库函数中的套接

字,而且不需要使用bsending变量。

4 / 7'.

.

3) 检查校验位

BOOL check_data(char *msg){ int flag; int count=0; char temp=*(msg+2); while(temp!=0){if((temp%2)!=0) count++;temp=temp/2;} if(count%2==1) flag=1; else flag=0; if(*(msg+3)==flag) return 1; else return 0;}

检查校验位即检查数据的正误,用和前面计算校验位相同的办法,计算接收到的数据的校验位,如果相同,则说明数据正确,不同则说明错误。 4) 接受从信道发来的信息

LONG CMainFrame::MyChannelSend(UINT wParam,UINT lParam){ char str_send[MAX_FRAME_LEN]; char check_ans[ANS_FRAME_LEN]; char show_str[100];

//接收信息,写入str_send int i;

for(i=iRevno;i<100;i++) rev_data[i]='\\0';

ReceiverMsg(str_send); //接受信息时注意要给str_send[]数组清零,而且不能只清一位,否则显示数据时,如果之前发送的一个数据长于后来发送的数据的话,会导致显示出之前的信息。

//处理

if(iRevnocheck_ans[0]=HEADER; check_ans[1]=ACK; check_ans[2]=HEADER;

SendMsg(check_ans,ANS_FRAME_LEN); //发送正确的应答帧 if(str_send[1]==iRevno){ //如果是正常情况,该数据有效,需要存储 rev_data[iRevno]=str_send[2];//存储接收的数据 iRevno++;}

else Show_msg_ListBox(\"(延时数据)\");}

else { //信息接收出错 check_ans[0]=HEADER; check_ans[1]=NAK; check_ans[2]=HEADER;

SendMsg(check_ans,ANS_FRAME_LEN); //发送错误的应答帧}} if(iRevno==str_send[4]){ //信息接收完成 Show_msg_ListBox(\"已接收数据:\"); Show_msg_ListBox(rev_data); iRevno=0;}

在处理接受的信息时,根据流程图,程序根据已经正确接收的帧数(iRevno)和报文总长度(str_send[4])的比较,来判断信息是否已经全部正确接受。如果

六.实验结果和分析(程序调试测试结果说明及分析):

5 / 7'.

.

七.实验结论:

八. 体会与建议:

九.参考文献:

实验成果附件(包括程序源代码和结果列表):

1. 2. 3. 4.

6 / 7'.

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- ovod.cn 版权所有 湘ICP备2023023988号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务