【正文】
olean arrived[NR_BUFS]。 /* scratch variable */ packet out_buf[NR_BUFS]。s window + 1 */ int i。s window */ seq_nr too_far。s window + 1 */ seq_nr frame_expected。s window */ seq_nr next_frame_to_send。 /* no need for separate ack frame */}void protocol6(void){ seq_nr ack_expected。 /* transmit the frame */ if (fk == data) start_timer(frame_nr % NR_BUFS)。 /* one nak per frame, please */ to_physical_layer(amp。 /* only meaningful for data frames */ = (frame_expected + MAX_SEQ) % (MAX_SEQ + 1)。 /* kind == data, ack, or nak */ if (fk == data) = buffer[frame_nr % NR_BUFS]。}static void send_frame(frame_kind fk, seq_nr frame_nr, seq_nr frame_expected, packet buffer[]){/* Construct and send a data, ack, or nak frame. */ frame s。amp。amp。amp。 /* no nak has been sent yet */seq_nr oldest_frame = MAX_SEQ+1。 }}三、選擇拒絕ARQ(selectivereject ARQ)/* Protocol 6 (nonsequential receive) accepts frames out of order, but passes packets to the network layer in order. Associated with each outstanding frame is a timer. When the timer goes off, only that frame is retransmitted, not all the outstanding frames, as in protocol 5. */define MAX_SEQ 7 /* should be 2^n 1 */define NR_BUFS ((MAX_SEQ + 1)/2)typedef enum {frame_arrival, cksum_err, timeout, network_layer_ready, ack_timeout} event_type。 /* prepare to send the next one */ } } if (nbuffered MAX_SEQ) enable_network_layer()。 i++) { send_data(next_frame_to_send, frame_expected, buffer)。 /* start retransmitting here */ for (i = 1。 case timeout: /* trouble。 case cksum_err: 。 /* contract sender39。 /* frame arrived intact。s window */ } /* Ack n implies n 1, n 2, etc. Check for this. */ while (between(ack_expected, , next_frame_to_send)) { /* Handle piggybacked ack. */ nbuffered = nbuffered 1。 /* pass packet to network layer */ inc(frame_expected)。 /* get ining frame from physical layer */ if ( == frame_expected) { /* Frames are accepted only in order. */ to_network_layer(amp。 case frame_arrival: /* a data or control frame has arrived */ from_physical_layer(amp。 /* advance sender39。s window */ send_data(next_frame_to_send, frame_expected, buffer)。 /* fetch new packet */ nbuffered = nbuffered + 1。 /* four possibilities: see event_typ