Selective Repeat
Selective Repeat
Selective repeat protocol, also called Selective Repeat ARQ (Automatic Repeat
request), is a data link layer protocol that uses sliding window method for reliable
delivery of data frames. Here, only the erroneous or lost frames are retransmitted, while
the good frames are received and buffered.
It uses two windows of equal size: a sending window that stores the frames to be sent
and a receiving window that stores the frames receive by the receiver. The size is half
the maximum sequence number of the frame. For example, if the sequence number is
from 0 – 15, the window size will be 8.
Working Principle
Selective Repeat protocol provides for sending multiple frames depending upon the
availability of frames in the sending window, even if it does not receive
acknowledgement for any frame in the interim. The maximum number of frames that
can be sent depends upon the size of the sending window.
The receiver records the sequence number of the earliest incorrect or un-received
frame. It then fills the receiving window with the subsequent frames that it has received.
It sends the sequence number of the missing frame along with every acknowledgement
frame.
The sender continues to send frames that are in its sending window. Once, it has sent
all the frames in the window, it retransmits the frame whose sequence number is given
by the acknowledgements. It then continues sending the other frames.
The control variables in Selective Repeat ARQ are same as in Go-Back-N ARQ:
SF, SL and S. But the sender sliding window size changed into 2m-1.Receiver sliding
window has 2 control variables, RF and RL.
sr.c
The overall program counts acknowledgments and
retransmissions
#include<stdio.h>
#include<stdlib.h>
int k = 0;
int i ;
if(flag) //success
{
printf(" Frame[%d] with value %d Acknowledged !!! \
n\n", i , frames[i]);
nt++; //Increment nt when frame is acknowledged
}
else
//failure
{
printf(" Frame[%d] with value %d Not Acknowledged !!! \n\n", i ,
frames[i]);
left[k++] = frames[i];
//Note frame number not acknowledged and store that frame number
in left 1-D array
}
k = 0;
}
}
for(i = 0 ; i < k ; i++)
{
printf(" Frame[%d] with value %d Retransmitted \n\n", i ,
left[i]);
//print retransmitted frame details
nt++;
int window_size;
int frame_size;
printf("\n\n Selective Repeat \n\n");
scanf("%d",&window_size);
scanf("%d",&frame_size);
input(frames , frame_size);
display(frames , frame_size);
return 0;
Selective Repeat
Input
Display
Frame[1] : 1
Frame[2] : 2
Frame[3] : 3
Frame[4] : 4
Frame[5] : 5
Frame[6] : 6
Frame[7] : 7
Frame[8] : 8
Frame[9] : 9
Frame[10] : 10
Total Transmissions : 13
Both Go-Back-N and Selective Repeat protocols are sliding window protocols.
Following are the important differences between Go-Back-N and Selective Repeat Protocols.
Sr. Key Go-Back-N Selective Repeat
No.
Sender window size In Stop and Wait In GoBackN protocol, In Selective Repeat
1 protocol, Sender Sender window size is protocol, Sender
window size is 1. N. window size is N.
#include<stdio.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<netdb.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
struct frame
int packet[40];
};
struct ack
int acknowledge[40];
};
int main()
int clientsocket;
socklen_t len;
char req[50];
clientsocket=socket(AF_INET,SOCK_DGRAM,0);
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(5018);
bcopy((char*)server->h_addr,(char*)&serveraddr.sin_addr.s_addr, sizeof(server->h_addr));
recvfrom(clientsocket,req,sizeof(req),0,(struct sockaddr*)&serveraddr,&len);
scanf("%d",&windowsize);
sendto(clientsocket,(char*)&windowsize,sizeof(windowsize),0,(struct
sockaddr*)&serveraddr,sizeof(serveraddr)); //Sending window size from client socket to server address
recvfrom(clientsocket,(char*)&totalpackets,sizeof(totalpackets),0,(struct sockaddr*)&serveraddr,&len);
sendto(clientsocket,"RECEIVED",sizeof("RECEIVED"),0,(struct
sockaddr*)&serveraddr,sizeof(serveraddr));
recvfrom(clientsocket,(char*)&totalframes,sizeof(totalframes),0,(struct sockaddr*)&serveraddr,&len);
sendto(clientsocket,"RECEIVED",sizeof("RECEIVED"),0,(struct
sockaddr*)&serveraddr,sizeof(serveraddr));
while(i<totalpackets)
j=0;
buffer=i;
printf("%d",i);
i++;
j++;
recvfrom(clientsocket,(char*)&f1,sizeof(f1),0,(struct sockaddr*)&serveraddr,&len);
printf("\n received frame %d\n\n enter -1 to send negative acknowledgement for the following
packets \n",framesreceived);
j=0;
l=buffer;
k=0;
printf("\npacket:%d\n",f1.packet[j]);
scanf("%d",&acknowledgement.acknowledge[j]);
if(acknowledgement.acknowledge[j]==-1)
if(k==0)
k=1;
j++;
l++;
}
framesreceived++;
sendto(clientsocket,(char*)&acknowledgement,sizeof(acknowledgement),0,(struct
sockaddr*)&serveraddr,sizeof(serveraddr));
close(clientsocket);
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<netdb.h>
#include<unistd.h>
#include<arpa/inet.h>
struct frame
int packet[40];
};
struct ack
int acknowledge[40];
};
int main()
int serversocket;
socklen_t len;
int windowsize,totalpackets,totalframes,i=0,j=0,framesend=0,k,l,buffer;
char req[50];
serversocket=socket(AF_INET,SOCK_DGRAM,0);
bzero((char*)&serveraddr,sizeof(serveraddr));
serversocket=socket(AF_INET,SOCK_DGRAM,0);
bzero((char*)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(5018);
serveraddr.sin_addr.s_addr=INADDR_ANY;
bind(serversocket,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
bzero((char*)&clientaddr,sizeof(clientaddr));
len=sizeof(clientaddr);
//connection establishment.
recvfrom(serversocket,req,sizeof(req),0,(struct sockaddr*)&clientaddr,&len);
(struct sockaddr*)&clientaddr,sizeof(clientaddr));
//obtaining windowsize.
recvfrom(serversocket,(char*)&windowsize,sizeof(windowsize),0,(struct sockaddr*)&clientaddr,&len);
sendto(serversocket,(char*)&totalpackets,sizeof(totalpackets),0,(struct
sockaddr*)&clientaddr,sizeof(clientaddr));
recvfrom(serversocket,req,sizeof(req),0,(struct sockaddr*)&clientaddr,&len);
sendto(serversocket,(char*)&totalframes,sizeof(totalframes),0,(struct
sockaddr*)&clientaddr,sizeof(clientaddr));
recvfrom(serversocket,req,sizeof(req),0,(struct sockaddr*)&clientaddr,&len);
fgets(req,2,stdin);
while(i<totalpackets)
{
//initialising the transmit buffer.
bzero((char*)&f1,sizeof(f1));
buffer=i;
j=0;
printf("%d",i);
f1.packet[j]=i;
j++;
i++;
sendto(serversocket,(char*)&f1,sizeof(f1),0,
(struct sockaddr*)&clientaddr,sizeof(clientaddr));
recvfrom(serversocket,(char*)&acknowledgement,sizeof(acknowledgement),0,(struct
sockaddr*)&clientaddr,&len);
j=0;
k=0;
l=buffer;
while(j<windowsize && l<totalpackets)
if(acknowledgement.acknowledge[j]==-1)
i=f1.packet[j];
i=f1.packet[j];
k=l;
break;
j++;
l++;
if(k==0)
printf("\n Positive acknowledgement received for all packets,within the frame:%d \n",framesend);
framesend++;
fgets(req,2,stdin);
printf("\nAll frames sends successfully\n Closing connection with the client \n");
close(serversocket);
}
CLIENT SIDE OUTPUT
labb04@labb04:~/Desktop$ ./client
received frame 0
packet:0
packet:1
packet:2
-1
received frame 1
packet:2
0
packet:3
packet:4
received frame 2
packet:5
packet:6
packet:7
0
Initializing the received buffer
received frame 3
packet:8
packet:9
packet:10
received frame 4
enter -1 to send negative acknowledgement for the following packets
packet:11
packet:12
packet:13
received frame 5
packet:14
labb04@labb04:~/Desktop$ ./server
labb04@labb04:~/Desktop$