三种ARQ算法C语言Word文档格式.docx
- 文档编号:19432501
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:9
- 大小:17.62KB
三种ARQ算法C语言Word文档格式.docx
《三种ARQ算法C语言Word文档格式.docx》由会员分享,可在线阅读,更多相关《三种ARQ算法C语言Word文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
to_physical_layer(&
s);
/*byebyelittleframe*/
wait_for_event(&
event);
/*donotproceeduntilgiventhegoahead*/
}
}
voidreceiver2(void)
framer,s;
/*buffersforframes*/
/*onlypossibilityisframe_arrival*/
from_physical_layer(&
r);
/*gogettheinboundframe*/
to_network_layer(&
r.info);
/*passthedatatothenetworklayer*/
/*sendadummyframetoawakensender*/
二、
回退N帧ARQ(go-back-nARQ)
文件名p5.c
/*Protocol5(pipelining)allowsmultipleoutstandingframes.Thesendermaytransmitup
toMAX_SEQframeswithoutwaitingforanack.Inaddition,unlikethepreviousprotocols,
thenetworklayerisnotassumedtohaveanewpacketallthetime.Instead,the
networklayercausesanetwork_layer_readyeventwhenthereisapackettosend.*/
#defineMAX_SEQ7/*shouldbe2^n-1*/
typedefenum{frame_arrival,cksum_err,timeout,network_layer_ready}event_type;
staticbooleanbetween(seq_nra,seq_nrb,seq_nrc)
/*Returntrueif(a<
=b<
ccircularly;
falseotherwise.*/
if(((a<
=b)&
&
(b<
c))||((c<
a)&
(a<
=b))||((b<
c)&
(c<
a)))
return(true);
else
return(false);
staticvoidsend_data(seq_nrframe_nr,seq_nrframe_expected,packetbuffer[])
/*Constructandsendadataframe.*/
/*scratchvariable*/
s.info=buffer[frame_nr];
/*insertpacketintoframe*/
s.seq=frame_nr;
/*insertsequencenumberintoframe*/
s.ack=(frame_expected+MAX_SEQ)%(MAX_SEQ+1);
/*piggybackack*/
/*transmittheframe*/
start_timer(frame_nr);
/*startthetimerrunning*/
voidprotocol5(void)
seq_nrnext_frame_to_send;
/*MAX_SEQ>
1;
usedforoutboundstream*/
seq_nrack_expected;
/*oldestframeasyetunacknowledged*/
seq_nrframe_expected;
/*nextframeexpectedoninboundstream*/
framer;
packetbuffer[MAX_SEQ+1];
/*buffersfortheoutboundstream*/
seq_nrnbuffered;
/*#outputbufferscurrentlyinuse*/
seq_nri;
/*usedtoindexintothebufferarray*/
enable_network_layer();
/*allownetwork_layer_readyevents*/
ack_expected=0;
/*nextackexpectedinbound*/
next_frame_to_send=0;
/*nextframegoingout*/
frame_expected=0;
/*numberofframeexpectedinbound*/
nbuffered=0;
/*initiallynopacketsarebuffered*/
/*fourpossibilities:
seeevent_typeabove*/
switch(event){
casenetwork_layer_ready:
/*thenetworklayerhasapackettosend*/
/*Accept,save,andtransmitanewframe.*/
buffer[next_frame_to_send]);
/*fetchnewpacket*/
nbuffered=nbuffered+1;
/*expandthesender'
swindow*/
send_data(next_frame_to_send,frame_expected,buffer);
inc(next_frame_to_send);
/*advancesender'
supperwindowedge*/
break;
caseframe_arrival:
/*adataorcontrolframehasarrived*/
/*getincomingframefromphysicallayer*/
if(r.seq==frame_expected){
/*Framesareacceptedonlyinorder.*/
/*passpackettonetworklayer*/
inc(frame_expected);
/*advanceloweredgeofreceiver'
/*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'
}
casecksum_err:
;
/*justignorebadframes*/
casetimeout:
/*trouble;
retransmitalloutstandingframes*/
next_frame_to_send=ack_expected;
/*startretransmittinghere*/
for(i=1;
i<
=nbuffered;
i++){
/*resend1frame*/
/*preparetosendthenextone*/
if(nbuffered<
MAX_SEQ)
disable_network_layer();
三、选择拒绝ARQ(selective-rejectARQ)
文件名p6.c
/*Protocol6(nonsequentialreceive)acceptsframesoutoforder,butpassespacketstothe
networklayerinorder.Associatedwitheachoutstandingframeisatimer.Whenthetimer
goesoff,onlythatframeisretransmitted,notalltheoutstandingframes,asinprotocol5.*/
#defineNR_BUFS((MAX_SEQ+1)/2)
typedefenum{frame_arrival,cksum_err,timeout,network_layer_ready,ack_timeout}event_type;
booleanno_nak=true;
/*nonakhasbeensentyet*/
seq_nroldest_frame=MAX_SEQ+1;
/*initvalueisforthesimulator*/
/*Sameasbetweeninprotocol5,butshorterandmoreobscure.*/
return((a<
a));
staticvoidsend_frame(frame_kindfk,seq_nrframe_nr,seq_nrframe_expected,packetbuffer[])
/*Constructandsendadata,ack,ornakframe.*/
s.kind=fk;
/*kind==data,ack,ornak*/
if(fk==data)s.info=buffer[frame_nr%NR_BUFS];
/*onlymeaningfulfordataframes*/
if(fk==nak)no_nak=false;
/*onenakperframe,please*/
if(fk==data)start_timer(frame_nr%NR_BUFS);
stop_ack_timer();
/*noneedforseparateackframe*/
voidprotocol6(void)
/*loweredgeofsender'
/*upperedgeofsender'
swindow+1*/
/*loweredgeofreceiver'
seq_nrtoo_far;
/*upperedgeofreceiver'
inti;
/*indexintobufferpool*/
packetout_buf[NR_BUFS];
packetin_buf[NR_BUFS];
/*buffersfortheinboundstream*/
booleanarrived[NR_BUFS];
/*inboundbitmap*/
/*howmanyoutputbufferscurrentlyused*/
/*initialize*/
/*nextackexpectedontheinboundstream*/
/*numberofnextoutgoingframe*/
/*framenumberexpected*/
too_far=NR_BUFS;
/*receiver'
supperwindow+1*/
for(i=0;
NR_BUFS;
i++)arrived[i]=false;
/*fivepossibilities:
/*accept,save,andtransmitanewframe*/
/*expandthewindow*/
out_buf[next_frame_to_send%NR_BUFS]);
send_frame(data,next_frame_to_send,frame_expected,out_buf);
/*advanceupperwindowedge*/
/*fetchincomingframefromphysicallayer*/
if(r.kind==data){
/*Anundamagedframehasarrived.*/
if((r.seq!
=frame_expected)&
no_nak)
send_frame(nak,0,frame_expected,out_buf);
elsestart_ack_timer();
if(between(frame_expected,r.seq,too_far)&
(arrived[r.seq%NR_BUFS]==false)){
/*Framesmaybeacceptedinanyorder.*/
arrived[r.seq%NR_BUFS]=true;
/*markbufferasfull*/
in_buf[r.seq%NR_BUFS]=r.info;
/*insertdataintobuffer*/
while(arrived[frame_expected%NR_BUFS]){
/*Passframesandadvancewindow.*/
in_buf[frame_expected%NR_BUFS]);
no_nak=true;
arrived[frame_expected%NR_BUFS]=false;
inc(too_far);
/*advanceupperedgeofreceiver'
start_ack_timer();
/*toseeif(aseparateackisneeded*/
if((r.kind==nak)&
between(ack_expected,(r.ack+1)%(MAX_SEQ+1),next_frame_to_send))
send_frame(data,(r.ack+1)%(MAX_SEQ+1),frame_expected,out_buf);
/*handlepiggybackedack*/
stop_timer(ack_expected%NR_BUFS);
/*framearrivedintact*/
/*advanceloweredgeofsender'
if(no_nak)send_frame(nak,0,frame_expected,out_buf);
/*damagedframe*/
send_frame(data,oldest_frame,frame_expected,out_buf);
/*wetimedout*/
caseack_timeout:
send_frame(ack,0,frame_expected,out_buf);
/*acktimerexpired;
sendack*/
NR_BUFS)enable_network_layer();
elsedisable_network_layer();
四、协议中用到的H文件
文件名protocol.h
#defineMAX_PKT4/*determinespacketsizeinbytes*/
typedefenum{false,true}boolean;
/*booleantype*/
t
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARQ 算法 语言