+=======+ | | | INIT | | | FCN!=0 & more frags +======++ ~~~~~~~~~~~~~~~~~~~~~~ Frag RuleID trigger | +--+ Send cur_W + frag(FCN); ~~~~~~~~~~~~~~~~~~~ | | | FCN--; cur_W=0; FCN=max_value;| | | set [cur_W, cur_Bmp] clear [cur_W, Bmp_n];| | v clear rcv_Bmp | ++==+==========+ **BACK_TO_SEND +->+ | cur_W==rcv_W & **BACK_TO_SEND | SEND | [cur_W,Bmp_n]==rcv_Bmp +-------------------------->+ | & more frags | +----------------------->+ | ~~~~~~~~~~~~ | | ++==+==========+ cur_W++; | | FCN==0 & more frags| |last frag clear [cur_W, Bmp_n] | | ~~~~~~~~~~~~~~~~~~~~~~~| |~~~~~~~~~ | | set cur_Bmp; | |set [cur_W, Bmp_n]; | |send cur_W + frag(All-0);| |send cur_W + frag(All-1)+RCS; | | set Retrans_Timer| |set Retrans_Timer | | | | +---------------------------------+ | | | | |cur_W == | | |Retrans_Timer expires & | | | rcv_W & [cur_W,Bmp_n]!=rcv_Bmp| | |more Frags | | | ~~~~~~~~~~~~~~~~~~~ | | |~~~~~~~~~~~~~~~~~~~~ | | | Attempts++; W=cur_W | | |stop Retrans_Timer; | | | +--------+ rcv_W==Wn &| | |[cur_W,Bmp_n]==cur_Bmp; v v | | v [Wn,Bmp_n]!=rcv_Bmp| | |cur_W++ +=====+==+=+=+==+ +=+=========+ ~~~~~~~~~~~| | +-------------------+ | | Resend | Attempts++;| +----------------------+ Wait x ACK | | Missing | W=Wn | +--------------------->+ | | Frags(W) +<-----------+ | rcv_W==Wn &+-+ | +======+====+ | [Wn,Bmp_n]!=rcv_Bmp| ++=+===+===+==+=+ | | ~~~~~~~~~~~~~~| ^ | | | ^ | | send (cur_W,+--+ | | | +------------+ | ALL-0-empty) | | | all missing frag sent(W) | | | | ~~~~~~~~~~~~~~~~~ | Retrans_Timer expires &| | | set Retrans_Timer | No more Frags| | | | ~~~~~~~~~~~~~~| | | | stop Retrans_Timer;| | | |(re)send frag(All-1)+RCS | | | +-------------------------+ | | cur_W==rcv_W&| | [cur_W,Bmp_n]==rcv_Bmp&| | Attempts > MAX_ACK_REQUESTS No more Frags & RCS flag==OK| | ~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~| | send Abort +=========+stop Retrans_Timer| | +===========+ | END +<-----------------+ +->+ ERROR | +=========+ +===========+