首页 > 试题广场 >

下面是一段流量控制程序片断,请分析后回答问题

[问答题]
下面是一段流量控制程序片断,请分析后回答问题

#define MAX_SEQ  7
#define MAX_PKT  1024
typedef enum 
{frame_arrival,chksum_err,timeout,network_layer_ready} event_type;
typedef enum {data,ack,nak} frame_kind;
typedef struct {unsigned char data[MAX_PKT];} packet;
typedef struct {
frame_kind kind;
unsigned int seq;
unsigned int ack;
packet info;
}frame;
static boolean between(unsigned int a,unsigned int b,unsigned int c)
{
if (((a<=b)&&(b<c))||((c<a)&&(a<=b))||((b<c)&&(c<a)))
    return true;
else
    return false;
}
static void send_data(unsigned int frame_nr,unsigned int frame_expected, packet buffer[])
{
frame s;
s.info=buffer[frame_nr];
s.seq=frame_nr;
s.ack=(frame_expected + MAX_SEQ) % (MAX_SEQ + 1);
to_physical_layer(&s);
start_timer(frame_nr);
}
void protocol(void)
{
unsigned int  next_frame_to_send;
unsigned int  ack_expected;
unsigned int  frame_expected;
frame r;
packet buffer[MAX_SEQ];
unsigned int  nbuffered;
unsigned int  i;
event_type   event;
enable_network_layer();
ack_expected=0;
next_frame_to_send=0;
frame_expected=0;
nbuffered=0;
while (true) {
    wait_for_event(&event);
    switch (event) {
        case network_layer_ready:
            from_network_layer(&buffer[next_frame_to_send]);
            nbuffered+=1;
            send_data(next_frame_to_send,frame_expected,buffer);
            inc(next_frame_to_send);
        case frame_arrival:
            from_physical_layer(&r);
            if  (r.seq==frame_expected) {
               to_network_layer(&r.info);
               inc(frame_expected);
            }
            while (between(ack_expected,r.ack,next_frame_to_send)) {
                 nbuffered-=1;
                 stop_timer(ack_expected);
                 inc(ack_expected);
            }
        case chksum_err: ;
        case timeout:
            next_frame_to_send=ack_expected;
            for (i=1;i<=nbuffered;i++) {
               send_data(next_frame_to_send,frame_expected,buffer);
               inc(next_frame_to_send);
            }
    }
   if  (nbuffered<MAX_SEQ)
      enable_network_layer();
   else
      disable_network_layer();
}
}

回答问题:
(1)发送窗口和接收窗口的最大尺寸是多少?
(2)发送窗口的两个边沿(上限和下限)用哪个两个变量表示?接收窗口呢?
(3)发送窗口的当前大小用哪个变量表示?接收窗口呢?
(4)上面程序如果某帧出错,则该帧后面的所有已发送帧都需要重传,如何改造才能实现有选择的重传(只重传出错帧)?

这道题你会答吗?花几分钟告诉大家答案吧!