下面是一段流量控制程序片断,请分析后回答问题
#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)上面程序如果某帧出错,则该帧后面的所有已发送帧都需要重传,如何改造才能实现有选择的重传(只重传出错帧)?
(1)发送窗口和接收窗口的最大尺寸是多少?
(2)发送窗口的两个边沿(上限和下限)用哪个两个变量表示?接收窗口呢?
(3)发送窗口的当前大小用哪个变量表示?接收窗口呢?
(4)上面程序如果某帧出错,则该帧后面的所有已发送帧都需要重传,如何改造才能实现有选择的重传(只重传出错帧)?
