本节讲无噪声通道的第二个协议:停止等待协议
本协议解决的问题是 到达接收方的数据帧的速度大于他们被处理的速度,帧在使用前必须被存储,
当接收到的帧超出接收方的服务能力之外时那么就要用本节这个协议控制,也就是 停止等待协议 stop-and-wait protocol,
当发送方发送出一个帧后必须停下来直到收到来自接收方的确认,这里,数据帧仍然是单向通信的,除了辅助的ACK帧从
另一端传过来。
设计
在任何时刻,不是在向前通道有个数组帧,就是在反向通道中有个ACK帧,所有我们需要一个半双工的链路,
此协议和前面的最简单协议的区别就是这个协议要考虑接收方的处理能力,但他们都不用考虑帧的差错问题
算法
下面是停止等待协议中发送方算法实现:
while(true)
cansend=true{ //判断网络层是否能给数据链路层发送数据
WaitForEvent(); //当一个时事件出现时唤醒它,这个事件指的什么?
if(Event(RequestToSend) AND canSend){
GetData();
MakeFrame();
SendFrame();
canSend=false;
}
WaitForEvent(); //这里这个唤醒它的事件指的是什么?
if(Event(ArrivalNotification)){
ReceiveFrame();
canSend=true;
}
}
现在看看上面这个算法怎么实现的,这个算法里有两个事件,一个是判断来自网络层的请求,还有个就是判断来自物理层的通知,网络层请求是否再继续向数据链路层发送数据,物理层是否接收来自接收方传来的确认通知ACK,这两件事必须是交替的
我们想想,数据链路层肯定是先接收来自网络层的数据然后转化成帧再传递到物理层,之后发送发再确认是否收到了ACK确认,也就是收到一个ACK就接接收一次来自网络层的数据,就这样不停地反复下去,不可能一次接收两个帧大小数据,所有说是交替的就是这个原因,
如果一次接收两个帧然后发送两个帧,那么链路层通道就要出现差错、出现复制帧,但我们现在讨论的是无噪声通道。
网络层的请求是一个紧接着一个的,所有要阻止网络层帧的即时发送,那么用什么方法呢?我们用canSend()判断语句来控制
以下是停止等待协议中接收方站点算法实现:
while(true){
WaitForEvent(); // when the event happen, carry out the step
if(Event(ArrivalNotification)){ //if the data frame arrive destination
ReceiveFrame();
ExtractData();
Deliver(data); // deliver the data to Networking Layer
SendFrame(); // send a ACK frame
}
}
//It is impossible for the receiver send a NAK to the sender because the process is ideal
and no noise, so there will not be error happen during the process.
Reference:《Encryptography and Networking Security》6th William Stalling