文章目录
计算机网络——数据链路层(二)
五、基本数据链路协议1~3
假设以下几点:
- 物理层、数据链路层和网络层各自是独立的处理进程
- 机器A希望向B发送的是一个可靠的、面向连接的长数据流
- 假设机器不会崩溃
- 从网络层拿到的是纯数据
协议1~6共同使用的数据类型,调用的函数声明如下
数据链路层、网路层、物理层的数据传送接口定义
- from_network_layer 从网络层得来的数据
- to_physical_layer 向物理层发送数据
- from_physical_layer 从物理层来的数据
- to_network_layer 向网络层发数据
Wait_for_event:等待某个事件发生
Timer计时器
- start_timer, stop_timer 重传定时器
- start_ack_timer, stop_ack_timer 捎带确认定时器
帧结构
typedef struct{
frame_kind kind; //帧的类型
seq_nr seq; //帧的序列号
seq_nr ack; //帧的确认号
packet info; //分组、包
}frame;
5.1 无限制的单工协议(协议1)
协议一做了这样的假设
- 数据单向传输
- 收发双方网络层都处于就绪状态
- 处理时间忽略不计
- 可用的缓存空间无限大
- 完美信道,不损坏、不丢帧
这其实是一个“乌托邦”的环境
发送方
发送方的循环里面一直等待网络层的数据,接收到后发送给物理层。
接收方
接收方循环里面等待事件的到来,然后从物理层获取数据,然后发送给网络层。
事实上,真正的工程里面是不会有这么完美的环境的。
5.2 无限制的单工协议(协议2)
对于协议1,接收方可能被大量的数据所淹没,所以协议2就要解决这个问题。
解决方案就是:收方发送一个哑帧,发送方收到哑帧,表明收方允许接收数据,此时再次发送下一帧数据。
这实际是一个半双工协议
发送方
我们可以看到加上了一个wait_for_event,此作用就是为了等待哑帧。
接收方
接收方在接收到后,向对方发送了一个哑帧。
5.3 有错误信道的单工协议(协议3)
协议三种,信道不再是不发生错误。
对于错误帧的情况,协议3的解决方法如下。
当发送方发送的时候,开启一个定时器,当接收一个正确帧然后向发送方发一个确认信号,定时器解除。
当定时器超期会使发送方重传此帧。
这样也会引来一个新问题:定时器不恰当,确认帧还没到,定时器超期
对于这个问题的解决方法是:给每一帧独一无二的序号
同时这个序号还可以用来对帧的重排重组。
5.3.1 肯定确认重传(PAR)
刚才说的解决错误信道的机制叫肯定确认重传。
发送方
发送方添加的部分就是启动定时器和拆除定时器。
接收方
接收方也添加了两句,其作用是在接受到数据后发送一个确认帧。
5.4 提高效率
上面的三个协议都是单工协议,工作效率都是比较低的。
以下列出几点提高效率的方法:
- 全双工:两方互相发数据,没有明显的界限。
- 捎带确认:将确认帧添加在自己发送给对方的数据里面。
- 批发数据:在等待时间发送数据帧。
六、滑动窗口协议
两个窗口
发送窗口:对应着已经发送但还未确认的帧的序号。
接收窗口对应着期望接收的帧的序号。
6.1 举例
例如 窗口大小为1
如上图 上面为发送方,下面是接收方。
第一次 接收方期望接收0号帧
然后发送方的窗口里面存储这还没确定的帧。
然后接收方发送一个确定帧,窗口滑动,期望得到1号帧
然后发送方收到确定帧,窗口滑动
6.2 滑动窗口的条件
- 接收方收到帧后,首先核对是否为预期帧号,如果是的则接收并frame_expected+1,即滑动窗口。
- 发送端收到确定帧,核对相应帧号next_frame_to_send,无误后从网络获取新的帧,并执行,next_frame_to_send+1移动窗口,如果不正确,则不移动。
如下图,为此时收发已经不分界限了。
下图为w=1的发送接收图解
6.3 滑动窗口的基本概念
6.4 协议4的滑动窗口基本工作原理
6.5 几种情况下发送窗口滑动机制
6.5.1 正常情况下
顺正顺序正常,按序接收发送。
6.5.2 异常情况一
对重复帧的差错控制,此异常主要表现在定时器设置断了,超期数据重传,收方发送收到的消息,然后发方定时器再次超时再次重传,由此往复。
6.5.3 异常情况二
同步开始发送过程的差错控制,此异常双方同时发送数据,这样也会导致重复帧。
6.6 协议4的信道利用率
例如
6.7 提高信道利用率
6.8 确定合适的W
6.9 面临的新问题
连续发送W个数据帧,其中有1帧出错,但其后续被成功发送。
处理策略:
- 丢弃错帧及其后续帧 ——协议5
- 丢弃错帧,缓存后续真确的帧 ——协议6