数据链路层的任务是将物理层提高的原始位流转换成可供网络层使用的帧流(反之亦然)。其中包括成帧、错误控制和流控等功能。
协议1:一个无限制的单工协议
前提条件:
(1)数据只能单向传输;
(2)收发双方的网络层总是处于准备就绪的状态;
(3)处理的时间可以被忽略;
(4)假设缓存空间无穷大;
(5)数据链路层之间的通信信道永远不会损坏或者丢失帧。
关键代码及注释:
// 发送过程在源机器的数据链路层上运行。
void send()
{
...
while(true)
{
from_network_layer(&buffer); // 从网络层获取帧
... // 构造数据帧
to_physical_layer(...); // 向物理层发送帧
}
}
// 接收过程在目标机器的数据链路层上运行。
void rec()
{
...
while(true)
{
wait_for_event(&event); // 等待未损坏帧的到来。你来我就收。
from_physical_layer(...); // 从物理层获取帧,并删除其中的缓存
to_network_layer(...); // 将数据帧传递给网络层
}
}
协议2:一个单工的停-等协议
前提条件:去掉协议1中接收方能够无限快速的处理帧这个不切实际的条件。
说明:比协议1多一个确认帧。
关键代码及注释:
// 发送过程在源机器的数据链路层上运行。
void send()
{
...
while(true)
{
from_network_layer(&buffer); // 从网络层获取帧
... // 构造数据帧
to_physical_layer(...); // 向物理层发送帧
wait_for_event(...); // 等待一个哑帧(即确认帧)的到达。你来了我再发。
}
}
// 接收过程在目标机器的数据链路层上运行。
void rec()
{
...
while(true)
{
wait_for_event(&event); // 等待未损坏帧的到来。你来我就收!
from_physical_layer(...); // 从物理层获取帧,并删除其中的缓存
to_network_layer(...); // 将数据帧传递给网络层
to_physical_layer(...); // 向发送方发送确认帧
}
}
协议3:有噪声信道的单工协议(即数据有出错的信道)(ARQ:Automatic Repeat reQuest,自动重传请求协议)
前提条件:接近实际情况,数据传输有出错。
说明:比协议2多一个超时定时器和帧序列号。
关键代码及注释:
// 发送过程在源机器的数据链路层上运行。
void send()
{
...
from_network_layer(...); // 从网络层获取第一组数据
while(true)
{
。。。
s.seq=next_frame_to_send; // 下一个待传输的帧号
to_physical_layer(...);
start_timer(...); // 启动超时定时器
wait_for_event(&event); // 确认帧到达、超时等均不再等待。
if(event == frame_arrival) // 因此这里需要判断是否因确认帧到来而不是因超时
{
from_physical_layer(...);
if(s.ack == next_frame_to_send) // 接收方要求发送下一个帧
{
stop_timer(...); // 停止定时器
from_network_layer(...); // 从网络层获取下一个帧
inc(next_frame_to_send); // 更新帧序列号
}
}
}
}
// 接收过程在目标机器的数据链路层上运行。
void rec()
{
...
while(true)
{
wait_for_event(&event); // 等待帧事件
if(event == frame_arrival) // 一个有效帧到来
{
from_physical_layer(...);
if(r.seq == frame_expected) // 该帧是正在等待的,因此向网络层传输。若不是期望等待的,则直接跳过,不向网络层上传。
{
to_network_layer(...);
inc(frame_expected); // 更新期望帧序列号
}
s.ack = 1 - frame_expected;
to_physical_layer(...); // 向发送方发送确认帧
}
}
}
其他协议:
上述协议只在一个方向上传输,比较简单。实际中基本都为双向传输的,采用捎带确认的滑动窗口协议(sliding window protocol)。而滑动窗口又根据窗口的尺寸分为:
(1)1位滑动窗口协议。
(2)使用回退n帧技术的协议。只要有坏帧或丢帧,则该帧之后的所有后续帧均不发确认帧,即使已经正确的被接收。
(3)使用选择性重传的协议。如果线路质量较差,则回退n帧会浪费很多的带宽,因此对于那些坏帧或丢失帧后面的帧就不必重传了。
现在已经被广泛采用的协议有:
HDLC:High-level Data Link Control,面向位填充的高级数据链路控制协议。
PPP:Point-to-Point Protocol,Internet中面向字符的点到点协议。包含成帧方法、链路控制协议LCP、网络控制协议NCP(每个NCP协议都针对某个特定的网络层协议)等。PPP是Internet中点到点线路上的基本的数据链路协议。