实验二数据链路层实验实验项目性质:设计性计划学时:4实验环境:实验日期:2015年10月14日一、实验目的1、理解并掌握数据链路层协议的功能。2、进一步理解停止等待协议和滑动窗口协议的基本工作原理。3、掌握计算机网络协议的基本实现技术。4、利用RS232C通信接口实现两台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)滑动窗口协议(SlidingWindowProtocol)在使用连续重传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滑动窗口协议工作原理示意图。AB图3-6滑动窗口协议工作原理示意图可以证明,当用n个比特进行编号时,若发送窗口的大小为WT,接收窗口的大小为WR,则只有WT≤2n-1和WT+WR≤2n成立时,滑动窗口协议才能正常工作。(4)选择重传ARQ协议为了进一步提高信道的利用率,可设法只重传出现差错的数据帧或者是定时器超时的数据帧。但这时必须加大接收窗口,以便先收下发送序号不连续但仍处在接收窗口中的那些数据帧,等到所缺序号的数据帧收到后再一并送交主机。这就是选择重传ARQ协议。使用选择重传ARQ协议可以避免重复传送那些本来已经正确到达接收端的数据帧。但付出的代价是在接收端要设置具有相当容量的缓存空间,这在许多情况下是不够经济的。因此选择重传ARQ协议在目前就远没有连续重传ARQ协议使用得那么广泛。5面向比特的链路控制规程HDLC高级数据链路控制HDLC(High-levelDataLinkControl)是在IBM公司著名的体系结构SNA上的数据链路层的面向比特的规程SDLC(SynchronousDataLinkControl)基础上发展起来的,由ISO把SDLC修改后称为国际标准ISO3309。从网络层交下来的分组,变成为数据链路层的数据。数据链路层的数据传送是以帧为单位的。也就是说,数据链路层的PDU是帧。帧是一个具有固定的格式数据块。一个HDLC帧由标志、地址、控制、信息及帧校验等5个字段组成。如图3-7所示。HDLC有三种帧类型,由控制字段加以区分。HDLC帧中各字段的作用及含义如下:图3-7HDLC帧结构标志F地址A控制C信息Infor帧校验序列FCS标志F帧校验区间透明传输区间(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帧。图3-8控制字段(4)信息字段I(Information)信息字段可以任意长,只有信息帧才有该字段。(5)帧校验序列FCS(FrameCheckSequence)字段本字段共占16bit,校验的范围是从地址字段的第1个比特起,到信息字段的最末1个比特为止。它采用的生成多项式是x16十x12+x5十1,即CRC—CCITT。HDLC的通信过程要经过建立数据链路、数据传输、数据链路拆除三个阶段。标志F地址A控制C信息Infor帧校验序列FCS标志F比特序号信息帧I监控帧S无编号帧U123456780N(S)P/FN(R)10SP/FN(R)11MP/FM五、结果分析(可根据需要附加页)六、主要源代码usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Threading;usingSystem.Runtime.InteropServices;usingNetProject;namespaceDataLink_Exp{publicpartialclassMainForm:Form{staticMainFormmHANDLE=null;//主窗体名柄,在线程中访问staticThreadMon_Thread=null;//监视线程privateChildFormsendForm=null;//发送子窗口对象privateChildFormrcvForm=null;//接收子窗口对象staticPhysicalPHL=null;//物理层实体staticDataLinkDLL=null;//数据链路层实体delegatevoidSetTextCallback(byte[]buffer);publicMainForm(){InitializeComponent();mHANDLE=this;}privatevoidMainForm_Load(objectsender,EventArgse){//初始化,创建子窗体,启动监视线程sendForm=newChildForm();sendForm.MdiParent=this;sendForm.Text=发送窗口;//this.MdiChildren.Length.ToString();sendForm.Name=SendWindow;sendForm.Show();rcvForm=newChildForm();rcvForm.MdiParent=this;rcvForm.Text=接收窗口;rcvForm.Name=ReceiveWindow;rcvForm.rtxBox.ReadOnly=true;rcvForm.Show();this.LayoutMdi(System.Windows.Forms.MdiLayout.TileVertical);//其他排列方法:Cascade、TileHorizontal