Skip to content

Latest commit

 

History

History
254 lines (150 loc) · 8.02 KB

File metadata and controls

254 lines (150 loc) · 8.02 KB

3.3 简单的数据链路层协议

3.3.1 Utopia

乌托邦,最理想的情况下,数据只能 ______ ,发送方和接收方网络层总是 _______ ,时间 _______ ,缓冲空间 ________ ,最强的条件是 _______ 。

该协议只有两个单独的过程,即发送和接收。因为不会出错,所以唯一的可能事件的类型是 _______ 。发送过程是一个无限的 _______ 。而这个 _______ (和前一个空一样)由三个动作组成:

  1. 得到包
  2. 封装成帧
  3. 发送帧

因为理想情况,所以帧的数据结构中只用了 _______ 字段。因为其他控制字段都与 _______ 和 ________ 有关。这种协议的处理过程接近于 _______ 的服务,必须依赖更高层来解决流量控制和纠错工作。但只是近似,因为 _______ 的服务也要做一些错误检测工作。

 

3.3.2 增加流量控制:停-等式协议

发送方发送一帧,等待确认以后继续发送,这种协议叫做 _______ 。

这个协议在前面的理想协议的基础上进行迭代完善,来解决 _______ 的问题。一般化的解决方案就是让接收方对发送方提出反馈。接收方将数据包传递给网络层以后给发送方发送一个小小的 _______ ,实际上这一帧的作用就是给发送方一个许可,允许它发送下一帧。发送方在发出一帧以后,根据协议要求等待一段时间,直到 _______ 达到。这一延迟就是流量控制协议的一个简单例子。

receiver

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:

  1. Utopia 的情形下,event_type event,event_type声明的event有几种,它们分别是?
  2. stop-and-wait 的情形下,event_type event,event_type声明的event有几种,它们分别是?
  3. stop-and-wait 的情形下,frame m,frame声明的m的作用是什么?它的内部成员变量取值是?  

sender

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:

  1. Utopia 的情形下,packet buffer,buffer指的是?
  2. Utopia 的情形下,为什么不需要声明 event_type event ; 而在 stop-and-wait 的情形下需要呢?
  3. 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这个概念也有异曲同工之妙,读者有兴趣亦可联想一番。

 

3.3.3 增加错误纠正:序号和ARQ

现在开始讨论更加现实的例子啦。帧可能被破坏,也可能会丢失。因此通过前面几节内容的叙述,我们很容易想出,可以在停-等协议的基础上,加入一个 _______ ,如果接收方收到帧之后,_____________ ,于是直接扔掉这个帧,不返回确认帧,此时发送方因为迟迟收不到确认帧,即计时器超时,就默认发出的帧出现错误,随即_______。这个过程将不断重复,直到帧最终完好无损地到达。

但是这个问题在于,网络层会无条件的信任传递过来的校验正确的帧,因此无法对重复帧进行识别。

所以,对于接收方来说,需要有一种方法来区分它看到的帧是第一次发送来的帧还是一次 _______ 。因此,很显然的做法就是让 _______ 在发送的每个帧的头部上,进行 _______ 。如果接收到的帧编号不同于上一帧,则说明不是重复帧,就可以大胆接收,所以又可以很明显的发现,其实只需要两个数字来进行标记。如果当前发送方发送的帧编号是0,在这个过程中,如果接受方已经接受了这个帧,但是返回确认帧时确认帧丢失,则发送方 _______ ,发送方再次重传这个帧,编号为 _______ ,而在接收方那一端,编号为0的帧已经被接受了,所以此时,接收方也心知肚明了,即自己之前发送的确认帧丢失了,于是它先拒绝此次重传,然后将 _______ 再一次发送给发送方。如果发送方 _______ ,则发送方进行下一次发送时,将 _______ ,而此时,这个帧对于接收方就是新的一帧啦。

下面是该协议的一个代码示例(带有重传机制的肯定确认协议):

sender

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:

  1. event_type 类型有几种取值,它们的含义分别是?
  2. next_frame_to_send 的含义是什么?它的最大值是?
  3. frame s,s 是一个结构体,它由哪些部分组成?
  4. wait_for_event(&event),它的作用是什么?
  5. start_timer(?)括号里的参数是 _______ ?
  6. stop_timer(?)括号里的参数是 ________ ?

receiver

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:

  1. if( ? )括号中应该填写什么?
  2. s.ack = 1 - frame_expected,s.ack 的含义是 _______ ,s 指代的是 _______ 。这行代码的作用是?该行代码的下一行出现了空缺,请读者进行填充~
  3. 请读者发散思考,在什么情况下会出现重复帧?