osi/rm中停止等待协议
篇一:停止等待协议-Linux版本
停止等待协议
cs_stu@ 南京大学计算机系 笪庆 061221015
一、实验目标
弄清停止等待协议的工作机理,并实现给出的协议算法。
二、实验内容
本实验可以基于实验七的数据帧传输实验,根据给出的停止等待协议的算法描述,选择自己熟悉的语言工具给予实现。
按照数据帧传输实验初级层次,一个站点充当发送方,一个站点充当接收方。 也可以采用模拟方式,用两个例程分别实现发送和接收。使用一个公共区代替传输链路,发送例程从发送缓存取出一数据帧送公共区,并等待来自接收例程的确认帧;接收例程从公共区取出数据,再根据是否正确发送确认帧或否认帧到公共区。如果通过创建fork进程独立运行发送和接收两个子进程,效果更佳。
数据帧和确认帧基于不考虑捎带确认的简单格式。
三、实验前提
学生需要具有相关的数学背景知识,熟悉基本的程序设计方法和技巧,以及对串行端口编程或者网络编程有所了解。已经学习了网络数据链路层及相关数据通信知识,尤其是停止等待流量与差错控制的协议。
四、实验装备
进行单机模拟,在linux下编译和运行。
五、实验原理
数据帧格式如下:
PRE,N(S),
其中,PRE是前导定界符而EOT是结尾定界符,PRE字符是一个全0八比特组,EOT字符标记数据帧的结束,EOT的二进制代码就是ASCII对EOT的编码,即04H。
由于明确了发送方和接收方角色,发送方只支持数据帧格式,接收方只支持
确认帧或否定帧格式。
PRE,N(R),
其中
该简单停止等待协议的算法如下:
———————————————————————————————(转 载 于:wWW.xlTkWJ.Com 小 龙文 档 网:osi/rm中停止等待协议)——— 发送方:
(1)取一个待发送的数据帧。
(2)V(S)←0。 /* 发送状态变量(帧序号)初始化 */
(3)N(S)←V(S); /* 将发送状态变量的数值写入发送序号 */
将数据帧送交发送缓存。
(4) 将发送缓存中的数据帧发送出去。
(5) 设置超时计时器。 /* 选择适当的超时重传时间tout */
(6) 等待。 /* 等待以下3个事件中最现出现的一个 */
(7) 若收到确认帧(ACK),则:
取一个新的待发送数据帧;
V(S)←[1- V(S)]; /* 更新发送状态变量,序号交替为0和1 */ 转到(3)。 /* 准备发送下一数据帧 */
(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)N(R)←V(R); /* 将发送状态变量的数值写入接收序号 */
发送确认帧(ACK),并转到(2)。 /* 请求发送下一数据帧 */
(8)发送否认帧(NCK),并转到(2)。 /* 请求重传该数据帧 */ ——————————————————————————————————
六、实验过程
我这次选择的方法是在linux环境下进行单机模拟停止等待协议。在老师给我们的实验题目中曾提示我们,如果进行单机软件模拟,可用两个例程分别实现发送和接收。使用一个公共区代替传输链路,还需建立两个标志,一个标志既是就绪标志,一个是方向标志。发送例程从发送缓存取出一数据帧送公共区,并置位就绪与方向标志并设置超时计时器计数值,然后不断检测该两标志的状态,等待来自接收例程的确认帧。
但是我和一个同学讨论后,认为这种方法虽然实现简单,但是“不断检测该
两标志的状态”这种基于轮询的同步机制并不科学,首先,增加了系统资源的开销,这是不言而喻