乌托邦,最理想的情况下,数据只能 ______ ,发送方和接收方网络层总是 _______ ,时间 _______ ,缓冲空间 ________ ,最强的条件是 _______ 。
该协议只有两个单独的过程,即发送和接收。因为不会出错,所以唯一的可能事件的类型是 _______ 。发送过程是一个无限的 _______ 。而这个 _______ (和前一个空一样)由三个动作组成:
- 得到包
- 封装成帧
- 发送帧
因为理想情况,所以帧的数据结构中只用了 _______ 字段。因为其他控制字段都与 _______ 和 ________ 有关。这种协议的处理过程接近于 _______ 的服务,必须依赖更高层来解决流量控制和纠错工作。但只是近似,因为 _______ 的服务也要做一些错误检测工作。
发送方发送一帧,等待确认以后继续发送,这种协议叫做 _______ 。
这个协议在前面的理想协议的基础上进行迭代完善,来解决 _______ 的问题。一般化的解决方案就是让接收方对发送方提出反馈。接收方将数据包传递给网络层以后给发送方发送一个小小的 _______ ,实际上这一帧的作用就是给发送方一个许可,允许它发送下一帧。发送方在发出一帧以后,根据协议要求等待一段时间,直到 _______ 达到。这一延迟就是流量控制协议的一个简单例子。
Utopia与停等协议中的receiver函数对比(分别是receive1和receive2):
// in Utopia
void receive1(void){
frame r;
event_type event;
while(true){
wait_for_event(&event);
from_physical_layer(&r);
to_network_layer(&r.info);
}
}
// in stop-and-wait
void receive2(void){
frame r,m;
event_type event;
while(true){
wait_for_event(&event);
from_physical_layer(&r);
to_network_layer(&r.info);
to_physical_layer(&m);
}
}Question:
- 在 Utopia 的情形下,
event_type event,event_type声明的event有几种,它们分别是? - 在 stop-and-wait 的情形下,
event_type event,event_type声明的event有几种,它们分别是? - 在 stop-and-wait 的情形下,
frame m,frame声明的m的作用是什么?它的内部成员变量取值是?
Utopia与停等协议中的sender函数对比(分别是sender1和sender2):
// in Utopia
void sender1(void){
frame s;
packet buffer;
while(true){
from_network_layer(&buffer)
s.info = buffer;
to_physical_layer(&s);
}
}
// in stop-and-wait
void sender2(void){
frame s;
packet buffer;
event_type event;
while(true){
from_network_layer(&buffer)
s.info = buffer;
to_physical_layer(&s);
wait_for_event(&event);
}
}Question:
- 在 Utopia 的情形下,
packet buffer,buffer指的是? - 在 Utopia 的情形下,为什么不需要声明 event_type event ; 而在 stop-and-wait 的情形下需要呢?
- 在 stop-and-wait 的情形下,
wait_for_event(&event)的作用是什么?
有趣的是,作者在Utopia的代码中写了下面的注释:
Tomorrow, and tomorrow, and tomorrow,
Creeps in this petty pace from day to day,
To the last syllable of recorded time;
这是莎翁的Macbeth(麦克白),我想作者将这段诗放在此处的原因,就是来形容,理想情况下的协议,数据日复一日地传送,不用考虑任何制约,数据流川流不息,直到最后一秒。或许Macbeth的故事与Utopia这个概念也有异曲同工之妙,读者有兴趣亦可联想一番。
现在开始讨论更加现实的例子啦。帧可能被破坏,也可能会丢失。因此通过前面几节内容的叙述,我们很容易想出,可以在停-等协议的基础上,加入一个 _______ ,如果接收方收到帧之后,_____________ ,于是直接扔掉这个帧,不返回确认帧,此时发送方因为迟迟收不到确认帧,即计时器超时,就默认发出的帧出现错误,随即_______。这个过程将不断重复,直到帧最终完好无损地到达。
但是这个问题在于,网络层会无条件的信任传递过来的校验正确的帧,因此无法对重复帧进行识别。
所以,对于接收方来说,需要有一种方法来区分它看到的帧是第一次发送来的帧还是一次 _______ 。因此,很显然的做法就是让 _______ 在发送的每个帧的头部上,进行 _______ 。如果接收到的帧编号不同于上一帧,则说明不是重复帧,就可以大胆接收,所以又可以很明显的发现,其实只需要两个数字来进行标记。如果当前发送方发送的帧编号是0,在这个过程中,如果接受方已经接受了这个帧,但是返回确认帧时确认帧丢失,则发送方 _______ ,发送方再次重传这个帧,编号为 _______ ,而在接收方那一端,编号为0的帧已经被接受了,所以此时,接收方也心知肚明了,即自己之前发送的确认帧丢失了,于是它先拒绝此次重传,然后将 _______ 再一次发送给发送方。如果发送方 _______ ,则发送方进行下一次发送时,将 _______ ,而此时,这个帧对于接收方就是新的一帧啦。
下面是该协议的一个代码示例(带有重传机制的肯定确认协议):
typedef enum{frame_arrival, cksum_err, timeout} event_type;
void sender3(void){
seq_nr next_frame_to_send;
frame s;
packet buffer;
event_type event;
next_frame_to_send = 0;
from_network_layer(&buffer);
while(true){
s.info = buffer;
s.seq = next_frame_to_send;
to_physical_layer(&s);
start_timer(?);
wait_for_event(&event);
if(event == frame_arrival){
from_physical_layer(&s);
if( s.ack == next_frame_to_send ){
stop_timer(?);
from_network_layer(&buffer);
inc(next_frame_to_send);
}
}
}
}Question:
- event_type 类型有几种取值,它们的含义分别是?
- next_frame_to_send 的含义是什么?它的最大值是?
frame s,s 是一个结构体,它由哪些部分组成?wait_for_event(&event),它的作用是什么?start_timer(?)括号里的参数是 _______ ?stop_timer(?)括号里的参数是 ________ ?
void receive3(void){
seq_nr frame_expected;
frame r,s;
event_type event;
frame_expected = 0;
while(true){
wait_for_event(&event);
if( event == frame_arrival ){
from_physical_layer(&r);
if( ? ){
to_network_layer(&r.info);
inc(frame_expected);
}
s.ack = 1 - frame_expected;
_________
}
}
}如果在一个协议中,发送方在前移到下一个数据包以前要等待一个 _______ ,这样的协议称为_______ 。
该协议和停等式协议的区别在于,当发送方和接收方的数据链链路层处于一个等待状态时,两方都用一个 变量 记录有关的值。发送方在 _______ 中记录下一个要发送的帧序号,接收方在_______ 记录期望的下一帧的序号。发送方在发出一帧后启动 _______ ,这个计时器的时间间隔应该 _______ ,只有时间间隔过去,才能够说明 _______ ,于是发送一个_______ 。
Question:
if( ? )括号中应该填写什么?s.ack = 1 - frame_expected,s.ack 的含义是 _______ ,s 指代的是 _______ 。这行代码的作用是?该行代码的下一行出现了空缺,请读者进行填充~- 请读者发散思考,在什么情况下会出现重复帧?