数据通信与网络六——数据链路层控制

来源:互联网 发布:神之浩劫激活码淘宝 编辑:程序博客网 时间:2024/05/22 14:17

             数据链路层的主要功能是实现数据链路控制和介质传输控制。数据链路控制的主要作用是成帧、流量控制和差错控制,以及提供节点之间流畅且可靠传输的软件实现协议。

关键词:数路链路控制、软件实现协议

          数据链路控制Data Link Control

          1、成帧

                 参考邮局系统,成帧就是把源端的报文,添加发送方和接受方地址进行分离。 头部通常携带源端和目的端地址,尾部携带检错和纠错信息。

                 1)可变长度成帧:主要解决如何判断帧的结束和下一个帧的开始.有 两种方法实现,分别是面向字符协议、面向位协议。

                  面向字符协议,面向的数据主要是来自8位字符编码,例如ASCII。为使帧分离开来,在帧的开始和末尾增加了一个8位(1Byte)的标记

                 但问题是如果帧中间的某些信息和标记一样,会误认为帧结束。解决办法是如果存在与标记相同的字符,便在帧的数据部分添加一个特殊的字节——换义字符(Escape character,ESC)。当接受方遇到ESC,便将它从数据段移走,继续将下一个字符作为数据处理。

                      面向位协议,面向的数据是16位或者32位编码系统编码的,例如Unicode。同样的问题:如何区分标记和数据信息相同情况下帧是否结束。多数协议规定标记为01111110,表明帧的结束和开始。策略是当遇到数据信息中遇到1个0、5个连续1,便增加一个0,这个额外增加的0称为位填充

          2、流量控制和差错传输

          3、协议

                 问题:数据链路层如何将成帧、流量控制、差错检测结合到一起呢?

                 数据帧从一个节点,称为发送法,传输到另一个节点,称为接收方。本篇文章讨论单向数据传递,因为数据链路协议是双向的,但是着与单向协议的基础上。协议部分讲5个:两个无噪声协议——理想,三个有噪声协议。

               无噪声协议,不会存在帧丢失、损坏帧等需要差错控制,但是可以考虑流量控制。

                  1)最简单协议——simplest protocol,不存在差错控制和流量控制。假定接收方可以及时处理好接受来的帧,并且可以即时去除帧的头部并将数据分层传递到网络层。问题是如何在数据链路层设计一套程序,可以实现功能?首先,算法是描述处理的步骤。具体是发送方节点等待网络层有数据包要发送才成帧,接收方直到帧到达才会将数据分组传给网络层。这个发生的过程称为——事件

              具体算法分别如下:

               在SP中发送方的算法是:

while(true)  //不断重复

{

   WaitForEvent();   //等待事件发生

    if(Event(RequestToSend));   //有一个要发送的分组

       {

           GetData();

           MakeFrame();        //成帧

           SendFrame();         //发送帧

       }

}         

               在SP中接收方的算法是:

while(true)

{

   WaitForEvent();

    if(Event(ArrivalNotification));         //数据帧到达提醒

       {

           ReceiveFrame();

           ExtractData();               //提取数据

           DeliverData();              //发送数据到网络层

       }

}

                2)停止等待协议(stop-wait protocol)

            接收方在接收到帧之后,需要存取、提取数据,一般接受速度会比发送方传输帧的速度慢。为了避免此种问题,当发送方发出一个帧后必须停下来等待接收方接收帧的确认,然后在发送下一幅帧。这里,除了数据帧是单向通信,ACK(acknowledgement)、NCK(negative acknowledgement)是辅助帧需要反向通道,所以链路是半双工。

   在停止等待协议中发送方的算法是:

while(true)  //不断重复

canSend=true

{

   WaitForEvent();   //等待事件发生

    if(Event(RequestToSend) AND canSend);   //有一个要发送的分组

       {

           GetData();

           MakeFrame();        //成帧

           SendFrame();         //发送帧

           canSend =false;    //不能发送直到ACK到达

       }

    WaitForEvent();

    if(Event(ArrivalNotification))    //ACK数据帧到达提醒

       {

            ReceiveFrame();     //接受ACK数据帧

            canSend=true;

       }

}         

               在停止等待协议中接收方的算法是:

while(true)

{

   WaitForEvent();

    if(Event(ArrivalNotification));         //数据帧到达提醒

       {

           ReceiveFrame();

           ExtractData();               //提取数据

           DeliverData();              //发送数据到网络层

           sendFrame();         //发送ACK帧

       }

}







0 0