实验二数据链路层实验 下载本文

实验二 数据链路层实验

实验项目性质:设计性 实 验 环 境:

计划学时:4 实验日期:2015年10月14日

一、实验目的

1、理解并掌握数据链路层协议的功能。

2、进一步理解停止等待协议和滑动窗口协议的基本工作原理。 3、掌握计算机网络协议的基本实现技术。

4、利用RS 232C通信接口实现两台PC间传输文件。

二、实验内容与要求

1、设计完成数据链路层相关类;

2、开发一个使用RS232C接口在两台计算机之间采用停止等待协议传输信息(文件)的程序;

3、开发一个使用RS232C接口在两台计算机之间采用滑动窗口协议传输文件的程序。 完成实验内容中的第1、2部分,有能力的同学完成全部内容。

三、实验(设计)仪器设备和材料清单

计算机两台,串行电缆一根。

四.相关知识

1 数据路层概述

数据链路层协议应提供的基本功能有:

(1) 数据在数据链路上的正常传输(建立、维护和释放)。 (2) 帧定界与同步,以实现透明传输。 (3) 差错控制和流量控制。 (4) 透明传输。

2 数据成帧方法

在数据链路层,为实现透明传输及进行差错控制和流量控制,在把数据送到物理层之前,需将若干个数据组成一帧,并在其中加上其他必要的控制信息。控制信息形成(数据成帧)的方法有以下几种:字符计数法、带字符填充的首尾界符法、带填充位的首尾标志法、物理层编码违例法。

3 差错控制与流量控制

为确保帧可靠地交付接收方,接收方在收到帧后,应向发送方应答,告知是否正确收到帧,因此在数据链路层要建立差错控制机制: 差错控制方法、CRC循环冗余校验、流量控制。

4 数据链路层协议 (1) 停止等待协议

停止等待协议的基本原理是:发送方在数据帧中加入校验码(CRC),由接收方检查;若出错,返回NAK帧(否认帧),否则发送ACK帧(确认帧);发送方收到NAK帧后重发数据帧,若收到ACK帧可发送下一帧。当超时计时事件发生时,重发丢失的帧,这样可通过等待发送来实现流量控制,如图3-2所示。

停止等待协议发送方的算法如下: (1) 从主机取一个数据帧。

(2) V(s) <--0,发送方状态变量初始化。

(3) N(s)<-- V(s)(置发送序号),将数据帧送发送缓冲区。 (4) 将发送缓冲的数据发送。 (5) 置超时定时器。

(6) 等待(下列三种情况)。

(7) 收到回答ACK ,从主机取一个新数据帧, V(s) <--[1-V(s)],转(3)。

图3-2 停止等待协议工作原理示意图

(8) 收到回答NAK ,转(4)。 (9) 超时,转(4)。 接收方的算法如下:

(1) V(r) <--0, 接收方状态变量初始化。 (2) 等待。

(3) 收到一个数据帧后,测试正确继续;否则传输出错,转(8)。

(4) 如果接收到的帧序号等于期待的帧序号( N(s) = V(r)) ,继续;否则丢弃该数据,转(7)。

(5) 将接收帧的数据部分上交主机。 (6) V(r) <--[1- V(r)]。

(7) 向发方发ACK ,转(2)。 (8) 向发方发NAK ,转(2)。

停止等待协议的算法流程如图3-3所示,其中V(s) 和V(r)分别是发送方和接收方维护的状态变量,N(s)是发送序号。

图3-3 停止等待协议的算法

停止等待协议算法简单,只适合传送少量的大的帧的情况。但大的数据块要分成许多帧传送,此时停止等待协议不适用,原因是本协议只允许同时只有一帧在链路上传送,链路利用率低。

(2) 连续重传ARQ协议

为了提高信道利用率,发送方发完一帧后,不必停下来等待对方的应答,可以连续发送若干帧;如果在发送过程中收到接收方的肯定应答,可以继续发送;若收到对其中某一帧的否认帧,则从该帧开始的后续帧全部重发,如图3-4。由于减少了等待时间,整个通信的吞吐量就提高了,提高了信道利用率。但回退重传(Go-back-N)会导致某些已正确接收的帧的重传,因此降低了发送效率。当误码率较低时,连续重传ARQ优于停止等待协议;反之则不一定。

图3-4 连续重传ARQ协议工作原理示意图

(3) 滑动窗口协议(Sliding Window Protocol)

在使用连续重传ARQ协议时,如果发送端一直没有收到对方的确认信息,那么实际上发送端并不能无限制地发送其数据帧。这是因为:

(1) 当未被确认的数据帧的数目太多时,只要有一帧出了差错,就可能要有很多的数

据帧需要重传,这必然要白白花费较多的时间,因而增大开销。

(2) 为了对所发送出去的大量数据帧进行编号,每个数据帧的发送序号也要占用较多的比特数,这样又增加了一些不必要开销。

连续ARQ协议中,每一个要发出的帧都包含一个序列号,范围从0到最大(0 ~ 2n – 1,一般用n个二进制位表示),使得序列号能恰好放入n位的字段中,n同时表示缓存器的大小。滑动窗口协议的工作原理如下:

(1) 任何时刻,发送端始终保持一个已发送但尚未确认的帧的序号表,称为发送窗口。发送窗口的上界表示要发送的下一个帧的序号,下界表示未得到确认的帧的最小编号。发送窗口 = 上界-下界,大小可变;窗口内的序列号代表已发送了的但尚未确认的帧。

(2) 发送端每发送一个帧,序号取上界值,上界加1;每接收到一个正确响应帧,下界加1;

(3) 接收端有一个接收窗口,大小固定,但不一定与发送窗口相同。接收窗口的上界表示允许接收的序号最大的帧,下界表示希望接收的帧;

(4) 接收窗口表示允许接收的信息帧,落在窗口外的帧均被丢弃。序号等于下界的帧被正确接收,并产生一个响应帧,下界加1。接收窗口大小不变。

正因为收发两端的窗口按照以上的规律不断地向前滑动,因此这种协议又称为滑动窗口协议。当发送窗口和接收窗口的大小都等于1时,就是最初讨论的停止等待协议。

下图3-5为滑动窗口的原理,它采用三位编码,顺序号为0-7,图中方框内表示发送方可以发送7帧,序号从6开始,每发送一帧,窗口左边界向里收缩,每收到一个确认,窗口向右滑动。接收方每一帧,窗口左边向右收缩,每发送相应后窗口向右扩展。

图3-5 滑动窗口协议中的发送窗口和接收窗口

假设窗口为7帧,最上面的A发送7帧,但发送后3帧未收到确认,于是A把窗口收缩到4帧F3-F7。但此时B发送确认RR3表明已经收到0-2帧,并准备接收3-7帧。A收到确认RR3,窗口向外滑动3帧,表示A可以从F3开始发送7帧。接着发送F3-F6。 若B返回确认RR4,表示已经接收这些帧,并允许A发送F7开始的7帧。图3-6 滑动窗口协议工作原理示意图。

B

A

图3-6 滑动窗口协议工作原理示意图

可以证明,当用 n个比特进行编号时,若发送窗口的大小为WT,接收窗口的大小为WR,则只有WT≤2n-1 和WT+WR≤2n成立时,滑动窗口协议才能正常工作。

(4) 选择重传ARQ协议

为了进一步提高信道的利用率,可设法只重传出现差错的数据帧或者是定时器超时的数据帧。但这时必须加大接收窗口,以便先收下发送序号不连续但仍处在接收窗口中的那些数据帧,等到所缺序号的数据帧收到后再一并送交主机。这就是选择重传ARQ协议。

使用选择重传ARQ协议可以避免重复传送那些本来已经正确到达接收端的数据帧。但付出的代价是在接收端要设置具有相当容量的缓存空间,这在许多情况下是不够经济的。因此选择重传ARQ协议在目前就远没有连续重传ARQ协议使用得那么广泛。

5 面向比特的链路控制规程HDLC

高级数据链路控制HDLC(High-level Data Link Control)是在IBM公司著名的体系结构SNA上的数据链路层的面向比特的规程SDLC(Synchronous Data Link Control)基础上发展起来的,由ISO把SDLC修改后称为国际标准ISO 3309。

从网络层交下来的分组,变成为数据链路层的数据。数据链路层的数据传送是以帧为单位的。也就是说,数据链路层的PDU是帧。帧是一个具有固定的格式数据块。一个HDLC帧由标志、地址、控制、信息及帧校验等5个字段组成。如图3-7所示。HDLC有三种帧类型,由控制字段加以区分。HDLC帧中各字段的作用及含义如下:

标志F 地址A 控制C 信息Infor 帧校验序列FCS 标志F 帧校验区间 透明传输区间 图3-7 HDLC帧结构

(1) 标志字段F(Flag)

帧的边界,标识一个帧的开始与结束;当连续传输两个帧时,前一个帧的结束标志字段F可以兼作后一帧的起始标志字段。其内容为:01111110。

在两个标志字段之间的比特串中,如果碰巧出现了和标志字段F一样的比特组合,那么就会误认为是帧的边界。为了避免出现这种错误,HDLC采用零比特填充法使一帧中两个F字段之间不会出现6个连续1。

(2) 地址字段A(Address)

基本单位为8比特,需要时可以8比特为单位扩展。这时用地址字段的第1位表示扩展位,其余7位为地址位。当某个地址字段的第1位为0时,则表示下一个地址字段的后7位也是地址位。当这个地址字段的第1位为1时,即表示这已是最后一个地址字段了。

(3) 控制字段C(Control) 控制字段占8比特,其定义如图3-8所示。HDLC用其将帧划分为信息帧(Information)、监督帧(Supervisory)和无编号帧(Unnumbered)等三大类。它们的简称分别是I帧,S帧和U帧。

标志F 地址A 控制C 信息Infor 帧校验序列FCS 标志F 比特序号 信息帧I 监控帧S 无编号帧U 1 0 1 1 2 3 4 5 PPP6 7 8 N(S) 0 S 1 M

N(R) N(R) M 图3-8 控制字段

(4) 信息字段I(Information)

信息字段可以任意长,只有信息帧才有该字段。 (5) 帧校验序列FCS(Frame Check Sequence)字段

本字段共占16bit,校验的范围是从地址字段的第1个比特起,到信息字段的最末1个比特为止。它采用的生成多项式是x16十x12+x5十1,即CRC—CCITT。

HDLC的通信过程要经过建立数据链路、数据传输、数据链路拆除三个阶段。

五、结果分析(可根据需要附加页)

六、主要源代码

using System;

using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text;

using System.Windows.Forms; using System.Threading;

using System.Runtime.InteropServices; using NetProject;

namespace DataLink_Exp{

public partial class MainForm : Form{

static MainForm mHANDLE=null; //主窗体名柄,在线程中访问

static Thread Mon_Thread=null; //监视线程

private ChildForm sendForm = null; //发送子窗口对象 private ChildForm rcvForm = null; //接收子窗口对象 static Physical PHL = null; //物理层实体 static DataLink DLL = null; //数据链路层实体 delegate void SetTextCallback(byte[] buffer); public MainForm(){

InitializeComponent(); mHANDLE = this; }

private void MainForm_Load(object sender, EventArgs e){ //初始化,创建子窗体,启动监视线程 sendForm = new ChildForm(); sendForm.MdiParent = this; sendForm.Text = \发送窗口\; //this.MdiChildren.Length.ToString(); sendForm.Name = \; sendForm.Show();

rcvForm = new ChildForm(); rcvForm.MdiParent = this; rcvForm.Text = \接收窗口\; rcvForm.Name = \; rcvForm.rtxBox.ReadOnly = true; rcvForm.Show();

this.LayoutMdi(System.Windows.Forms.MdiLayout.TileVertical);//其他排列方法:Cascade、TileHorizontal

PHL = new Physical(\); DLL = new DataLink(); //创建数据链路层对象

DLL.setPHL(PHL); //连接物理层

sendForm.Enabled = false; //发送窗口禁止编辑

//创建并启动监视线程 Mon_Thread = new Thread(new ThreadStart(this.MonitorThread)); Mon_Thread.Start(); }

private void disconnect_Click(object sender, EventArgs e){ //关闭串行口

PHL.Close();

connect.Enabled = true; sendForm.Enabled = false; }

private void connect_Click(object sender, EventArgs e){ //打开串行口

// port = new SerialPort(\StopBits.One);

PHL.Open();

sendForm.Enabled = true; connect.Enabled = false; disconnect.Enabled = true; }

private void Receive(byte [] buffer) //接收数据并显示 { //写实际接收代码

if (this.rcvForm.rtxBox.InvokeRequired) {

SetTextCallback d = new SetTextCallback(Receive);

this.Invoke(d, new object[] {buffer }); } else {

string Msg = Encoding.Unicode.GetString(buffer, 0, buffer.Length); //编码格式转换

this.rcvForm.rtxBox.Text += Msg; //收到的信息显示 } }

public static void Send(string Msg)

{ //发送子窗体高层向低层发送数据(使用+) byte[] buffer = Encoding.Unicode.GetBytes(Msg); //发送前进行编码格式转换

DLL.Send(buffer);

// PHL.Send(buf); //数据送物理层SAP下行队列,发送数据(物理层实验用) }

//监视线程函数,运行协议处理方法,接收传输给当前应用的数据。

private void MonitorThread() { byte []Msg; while (true){

DLL.Run(); //运行数据链路层协议处理方法

if ((Msg = DLL.Receive()) != null) //数据链路层有向高层递交的数{ //是,从数据链路层接收数据(数据存储在Msg中)

Receive(Msg); //送接收处理(本例为数据直接显示在子窗体中)

}} }

private void arrToolStripMenuItem_Click(object sender, EventArgs e) {

//排列子窗体

this.LayoutMdi(System.Windows.Forms.MdiLayout.TileVertical); //还有其他排列方法:Cascade、TileHorizontal }

private void exitToolStripMenuItem_Click(object sender, EventArgs e){

Close(); }

private void MainForm_FormClosed(object sender, FormClosedEventArgs e){

if (Mon_Thread != null) Mon_Thread.Abort(); }}}

using System;

using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text;

using System.Windows.Forms; using System.Threading;

using System.Runtime.InteropServices; using NetProject;

namespace DataLink_Exp{

public partial class MainForm : Form{

static MainForm mHANDLE=null; //主窗体名柄,在线程中访问

static Thread Mon_Thread=null; //监视线程

private ChildForm sendForm = null; //发送子窗口对象 private ChildForm rcvForm = null; //接收子窗口对象 static Physical PHL = null; //物理层实体 static DataLink DLL = null; //数据链路层实体 delegate void SetTextCallback(byte[] buffer); public MainForm(){

InitializeComponent(); mHANDLE = this; }

private void MainForm_Load(object sender, EventArgs e){ //初始化,创建子窗体,启动监视线程 sendForm = new ChildForm(); sendForm.MdiParent = this; sendForm.Text = \发送窗口\; //this.MdiChildren.Length.ToString(); sendForm.Name = \; sendForm.Show();

rcvForm = new ChildForm(); rcvForm.MdiParent = this; rcvForm.Text = \接收窗口\; rcvForm.Name = \; rcvForm.rtxBox.ReadOnly = true; rcvForm.Show();

this.LayoutMdi(System.Windows.Forms.MdiLayout.TileVertical);//其他排列方法:Cascade、TileHorizontal

PHL = new Physical(\); DLL = new DataLink(); //创建数据链路层对象

DLL.setPHL(PHL); //连接物理层

sendForm.Enabled = false; //发送窗口禁止编辑

//创建并启动监视线程 Mon_Thread = new Thread(new ThreadStart(this.MonitorThread)); Mon_Thread.Start(); }

private void disconnect_Click(object sender, EventArgs e){ //关闭串行口

PHL.Close();

connect.Enabled = true; sendForm.Enabled = false; }

private void connect_Click(object sender, EventArgs e){ //打开串行口

// port = new SerialPort(\StopBits.One);

PHL.Open();

sendForm.Enabled = true; connect.Enabled = false; disconnect.Enabled = true; }

private void Receive(byte [] buffer) //接收数据并显示 { //写实际接收代码

if (this.rcvForm.rtxBox.InvokeRequired) {

SetTextCallback d = new SetTextCallback(Receive);

this.Invoke(d, new object[] {buffer }); } else {

string Msg = Encoding.Unicode.GetString(buffer, 0, buffer.Length); //编码格式转换

this.rcvForm.rtxBox.Text += Msg; //收到的信息显示 } }

public static void Send(string Msg)

{ //发送子窗体高层向低层发送数据(使用+) byte[] buffer = Encoding.Unicode.GetBytes(Msg); //发送前进行编码格式转换

DLL.Send(buffer);

// PHL.Send(buf); //数据送物理层SAP下行队列,发送数据(物理层实验用) }

//监视线程函数,运行协议处理方法,接收传输给当前应用的数据。

private void MonitorThread() { byte []Msg; while (true){

DLL.Run(); //运行数据链路层协议处理方法

if ((Msg = DLL.Receive()) != null) //数据链路层有向高层递交的数{ //是,从数据链路层接收数据(数据存储在Msg中)

Receive(Msg); //送接收处理(本例为数据直接显示在子窗体中)

}} }

private void arrToolStripMenuItem_Click(object sender, EventArgs e) {

//排列子窗体

this.LayoutMdi(System.Windows.Forms.MdiLayout.TileVertical); //还有其他排列方法:Cascade、TileHorizontal }

private void exitToolStripMenuItem_Click(object sender, EventArgs e){

Close(); }

private void MainForm_FormClosed(object sender, FormClosedEventArgs e){

if (Mon_Thread != null) Mon_Thread.Abort(); }}}

七、分析与思考

1. 数据链路(即逻辑链路)与链路(即物理链路)有何区别?

(1)数据链路与链路的区别在于数据链路除链路外,还必须有一些必要的规程来控制数据的传输。因此,数据链路比链路多了实现通信规程所需要的硬件和软件。(2)“电路接通了”表示链路两端的结点交换机已经开机,物理连接已经能够传送比特流了。但是,数据传输并不可靠。在物理连接基础上,再建立数据链路连接,才是“数据链路接通了”。此后,由于数据链路连接具有检测、确认和重传等功能,才使不太可靠的物理链路变成可靠的数据链路,进行可靠的数据传输。当数据链路断开连接时,物理电路连接不一定跟着断开连接。

2. 数据链路层中的链路控制包括哪些功能?

数据链路层的主要功能是在物理层提供的比特服务基础上,在相邻结点之间提供简单的通信链路,传输以帧为单位的数据,同时它还负责数据链路的流量控制、差错控制。具体地:链路管理;帧同步;流量控制;差错控制;将数据和控制信息分开;透明传输;寻址等。

3. 考察停止等待协议算法。在接收结点,当执行步骤(4)时,若将“否则转到(7)”改为“否则转到(8)”,将产生什么结果? 重复帧会被当做错误的帧进行重传。

4. 试简述HDLC帧各字段的意义。HDLC用什么方法保证数据的透明传输? 标志字段F(Flag):帧的边界,标识一个帧的开始与结束;

地址字段A(Address):基本单位为8比特,需要时可以8比特为单位扩展。

控制字段C(Control):控制字段占8比特。HDLC用其将帧划分为信息帧(Information)、监督帧(Supervisory)和无编号帧(Unnumbered)等三大类。

信息字段I(Information):信息字段可以任意长,只有信息帧才有该字段。 帧校验序列FCS(Frame Check Sequence)字段:本字段共占16bit,校验的范围是从地址字段的第1个比特起,到信息字段的最末1个比特为止。

HDLC通过采用0比特填充技术来保证数据的透明传输。即:在发送端,只要发现有5个连续1,则立即填入一个0。在接收一个帧时,每当发现5个连续1时,就将这5个连续1后的一个0删除,以实现原来的比特流的还原。

5. 修改相关函数,实现停止等待协议。

6. 修改相关函数,分别使用奇偶校验和CRC冗余校验替代现有的校验方法。

7. 在设置超时计时器,超时时间间隔与那些因素有关?在利用串行口实现的过程中,该数据值如何确定?

超时时间间隔与信道、带宽等因素有关。在利用串行口实现的过程中,该数据值一般选择重传实践略大于“在正常情况下从发完数据帧到收到确认帧所需要的平均时间”。