数据链路层的主要功能是实现数据链路控制和介质传输控制。数据链路控制的主要作用是成帧、流量控制和差错控制,以及提供节点之间流畅且可靠传输的软件实现协议。
关键词:数路链路控制、软件实现协议
数据链路控制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帧
}
}