×Ô¼ºÊղصľõµÃºÜÓÐÓùÊÉÏ´«µ½°Ù¶ÈÓë´ó¼ÒÒ»Æð·ÖÏí£¡ÈýÖÖARQÐÒéµÄCÓïÑÔËã·¨Ò»¡¢Í£Ö¹µÈ´ýARQ(stop-and-waitARQ)ÎļþÃûp2.c/*Protocol2(stop-and-wait)alsoprovidesforaone-directionalflowofdatafromsendertoreceiver.Thecommunicationchannelisonceagainassumedtobeerrorfree,asinprotocol1.However,thistime,thereceiverhasonlyafinitebuffercapacityandafiniteprocesingspeed,sotheprotocolmustexplicitlypreventthesenderfromfloodingthereceiverwithdatafasterthanitcanbehandled.*/typedefenum{frame_arrival}event_type;#includeprotocol.hvoidsender2(void){frames;/*bufferforanoutboundframe*/packetbuffer;/*bufferforanoutboundpacket*/event_typeevent;/*frame_arrivalistheonlypossibility*/while(true){from_network_layer(&buffer);/*gogetsomethingtosend*/s.info=buffer;/*copyitintosfortransmission*/to_physical_layer(&s);/*byebyelittleframe*/wait_for_event(&event);/*donotproceeduntilgiventhegoahead*/}}voidreceiver2(void){framer,s;/*buffersforframes*/event_typeevent;/*frame_arrivalistheonlypossibility*/while(true){wait_for_event(&event);/*onlypossibilityisframe_arrival*/from_physical_layer(&r);/*gogettheinboundframe*/to_network_layer(&r.info);/*passthedatatothenetworklayer*/to_physical_layer(&s);/*sendadummyframetoawakensender*/}}¶þ¡¢»ØÍËNÖ¡ARQ£¨go-back-nARQ£©ÎļþÃûp5.c/*Protocol5(pipelining)allowsmultipleoutstandingframes.ThesendermaytransmituptoMAX_SEQframeswithoutwaitingforanack.Inaddition,unlikethepreviousprotocols,thenetworklayerisnotassumedtohaveanewpacketallthetime.Instead,thenetworklayercausesanetwork_layer_readyeventwhenthereisapackettosend.*/#defineMAX_SEQ7/*shouldbe2^n-1*/typedefenum{frame_arrival,cksum_err,timeout,network_layer_ready}event_type;#includeprotocol.hstaticbooleanbetween(seq_nra,seq_nrb,seq_nrc){/*Returntrueif(a=bccircularly;falseotherwise.*/if(((a=b)&&(bc))||((ca)&&(a=b))||((bc)&&(ca)))return(true);elsereturn(false);}staticvoidsend_data(seq_nrframe_nr,seq_nrframe_expected,packetbuffer[]){/*Constructandsendadataframe.*/frames;/*scratchvariable*/s.info=buffer[frame_nr];/*insertpacketintoframe*/s.seq=frame_nr;/*insertsequencenumberintoframe*/s.ack=(frame_expected+MAX_SEQ)%(MAX_SEQ+1);/*piggybackack*/to_physical_layer(&s);/*transmittheframe*/start_timer(frame_nr);/*startthetimerrunning*/}voidprotocol5(void){seq_nrnext_frame_to_send;/*MAX_SEQ1;usedforoutboundstream*/seq_nrack_expected;/*oldestframeasyetunacknowledged*/seq_nrframe_expected;/*nextframeexpectedoninboundstream*/framer;/*scratchvariable*/packetbuffer[MAX_SEQ+1];/*buffersfortheoutboundstream*/seq_nrnbuffered;/*#outputbufferscurrentlyinuse*/seq_nri;/*usedtoindexintothebufferarray*/event_typeevent;enable_network_layer();/*allownetwork_layer_readyevents*/ack_expected=0;/*nextackexpectedinbound*/next_frame_to_send=0;/*nextframegoingout*/frame_expected=0;/*numberofframeexpectedinbound*/nbuffered=0;/*initiallynopacketsarebuffered*/while(true){wait_for_event(&event);/*fourpossibilities:seeevent_typeabove*/switch(event){casenetwork_layer_ready:/*thenetworklayerhasapackettosend*//*Accept,save,andtransmitanewframe.*/from_network_layer(&buffer[next_frame_to_send]);/*fetchnewpacket*/nbuffered=nbuffered+1;/*expandthesender'swindow*/send_data(next_frame_to_send,frame_expected,buffer);/*transmittheframe*/inc(next_frame_to_send);/*advancesender'supperwindowedge*/break;caseframe_arrival:/*adataorcontrolframehasarrived*/from_physical_layer(&r);/*getincomingframefromphysicallayer*/if(r.seq==frame_expected){/*Framesareacceptedonlyinorder.*/to_network_layer(&r.info);/*passpackettonetworklayer*/inc(frame_expected);/*advanceloweredgeofreceiver'swindow*/}/*Acknimpliesn-1,n-2,etc.Checkforthis.*/while(between(ack_expected,r.ack,next_frame_to_send)){/*Handlepiggybackedack.*/nbuffered=nbuffered-1;/*oneframefewerbuffered*/stop_timer(ack_expected);/*framearrivedintact;stoptimer*/inc(ack_expected);/*contractsender'swindow*/}break;casecksum_err:;/*justignorebadframes*/break;casetimeout:/*trouble;retransmitalloutstandingframes*/next_frame_to_send=ack_expected;/*startretransmittinghere*/for(i=1;i=nbuffered;i++){send_data(next_frame_to_send,frame_expected,buffer);/*resend1frame*/inc(next_frame_to_send);/*preparetosendthenextone*/}}if(nbufferedMAX_SEQ)enable_network_layer();elsedisable_network_layer();}}Èý¡¢Ñ¡Ôñ¾Ü¾øARQ£¨selective-rejectARQ£©ÎļþÃûp6.c/*Protocol6(nonsequentialreceive)acceptsframesoutoforder,butpassespacketstothenetworklayerinorder.Associatedwitheachoutstandingframeisatimer.Whenthetimergoesoff,onlythatframeisretransmitted,notalltheoutstandingframes,asinprotocol5.*/#defineMAX_SEQ7/*shouldbe2^n-1*/#defineNR_BUFS((MAX_SEQ+1)/2)typedefenum{frame_arrival,cksum_err,timeout,network_layer_ready,ack_timeout}event_type;#includeprotocol.hbooleanno_nak=true;/*nonakhasbeensentyet*/seq_nroldest_frame=MAX_SEQ+1;/*initvalueisforthesimulator*/staticbooleanbetween(seq_nra,seq_nrb,seq_nrc){/*Sameasbetweeninprotocol5,butshorterandmoreobscure.*/return((a=b)&&(bc))||((ca)&&(a=b))||((bc)&&(ca));}staticvoidsend_frame(frame_kindfk,seq_nrframe_nr,seq_nrframe_expected,packetbuffer[]){/*Constructandsendada