下面是一段流量控制程序片断,请分析后回答问题
#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)上面程序如果某帧出错,则该帧后面的所有已发送帧都需要重传,如何改造才能实现有选择的重传(只重传出错帧)?