TCP-over-UDP
Introduction
- This is an implementation of a custom TCP-like reliable data transport protocol over UDP
- We name this protocol
RDT
(for Reliable Data Transport Protocol) - Following functionalities have been added over UDP to make it reliable:
- Single and cumulative
ACK
nowledgement - Sequence numbering
- Re-transmission
- Detecting duplicates and discarding them
- Congestion/flow control
- Single and cumulative
- Just for demonstration purposes, the server has been set to reply back with an uppercased version of the string it receives from client
Repository structure
src/
contains the source codesrc/RDTPacket.java
describes structure of aRDT
packetsrc/RDTSocket.java
andsrc/RDTServerSocket.java
contain client socket and server socket implementations ofRDT
, respectivelysrc/Client.java
andsrc/Server.java
contain client and server applications, respectively (both useRDT
to communicate)
compile.sh
bash shell-script can be used to compile required source files
Build
- First compile by
cd
-ing into the root of this repository and then running command./compile.sh
- To start the server,
- Execute
java -classpath bin Server <port_no>
whereport_no
is the port number at which you want to start the server - For example, execute
java -classpath bin Server 1024
if server is to be started at port number 1024
- Execute
- To start client,
- Execute
java -classpath bin Client <ip_addr> <port_no>
whereip_addr
,port_no
are IP address of server and port number, respectively - For example, execute
java -classpath bin Client 192.168.1.15 1024
is server's IP is 192.168.1.15 and port number is 1024
- Execute
Example run
- Client first sends string
Hello
followed byIs this working alright?
- Consequently, server replies first with
HELLO
followed byIS THIS WORKING ALRIGHT?
- Client output
java -classpath bin Client 192.168.1.15 1024 type "quit" to exit session Hello --windowSize = 5 --dropping packet seq=#0 --timeout packet seq=#0, retransmitted this packet --exiting slow start phase --cwnd decreased from 5.000000 to 2.500000 --received ack with ackNumber=#5, rwnd=9 --windowSize = 9 --sending packet seq=#5 --received ack with ackNumber=#6, rwnd=9 --received packet seq=#0 --received 'HELLO', delivered to upper layer --acked with ackNumber=#5, rwnd=9 --received packet seq=#5 --received ' ', delivered to upper layer --acked with ackNumber=#6, rwnd=9 Client received: HELLO Is this working alright? --windowSize = 5 --dropping packet seq=#0 --timeout packet seq=#0, retransmitted this packet --exiting slow start phase --cwnd decreased from 5.000000 to 2.500000 --received ack with ackNumber=#5, rwnd=9 --windowSize = 9 --sending packet seq=#5 --received ack with ackNumber=#10, rwnd=9 --windowSize = 9 --sending packet seq=#10 --received ack with ackNumber=#15, rwnd=9 --windowSize = 9 --dropping packet seq=#15 --timeout packet seq=#15, retransmitted this packet --cwnd decreased from 12.500000 to 6.250000 --received ack with ackNumber=#20, rwnd=9 --windowSize = 6 --dropping packet seq=#20 --timeout packet seq=#20, retransmitted this packet --cwnd decreased from 6.250000 to 3.125000 --received ack with ackNumber=#25, rwnd=9 --received packet seq=#0 --received 'IS TH', delivered to upper layer --acked with ackNumber=#5, rwnd=9 --received packet seq=#5 --received 'IS WO', delivered to upper layer --acked with ackNumber=#10, rwnd=9 --received packet seq=#10 --received 'RKING', delivered to upper layer --acked with ackNumber=#15, rwnd=9 --received packet seq=#15 --received ' ALRI', delivered to upper layer --acked with ackNumber=#20, rwnd=9 --received packet seq=#20 --received 'GHT? ', delivered to upper layer --acked with ackNumber=#25, rwnd=9 Client received: IS THIS WORKING ALRIGHT?
- Server output
java -classpath bin Server 1024 accepted connection from 192.168.1.15 at 50233 --received packet seq=#0 --received 'Hello', delivered to upper layer --acked with ackNumber=#5, rwnd=9 --received packet seq=#5 --received ' ', delivered to upper layer --acked with ackNumber=#6, rwnd=9 Server received: Hello --windowSize = 5 --dropping packet seq=#0 --timeout packet seq=#0, retransmitted this packet --exiting slow start phase --cwnd decreased from 5.000000 to 2.500000 --received ack with ackNumber=#5, rwnd=9 --windowSize = 5 --sending packet seq=#5 --received ack with ackNumber=#6, rwnd=9 --received packet seq=#0 --received 'Is th', delivered to upper layer --acked with ackNumber=#5, rwnd=9 --received packet seq=#5 --received 'is wo', delivered to upper layer --acked with ackNumber=#10, rwnd=9 --received packet seq=#10 --received 'rking', delivered to upper layer --acked with ackNumber=#15, rwnd=9 --received packet seq=#15 --received ' alri', delivered to upper layer --acked with ackNumber=#20, rwnd=9 --received packet seq=#20 --received 'ght? ', delivered to upper layer --acked with ackNumber=#25, rwnd=9 Server received: Is this working alright? --windowSize = 5 --sending packet seq=#0 --received ack with ackNumber=#5, rwnd=9 --windowSize = 9 --sending packet seq=#5 --received ack with ackNumber=#10, rwnd=9 --windowSize = 9 --dropping packet seq=#10 --timeout packet seq=#10, retransmitted this packet --exiting slow start phase --cwnd decreased from 15.000000 to 7.500000 --received ack with ackNumber=#15, rwnd=9 --windowSize = 7 --sending packet seq=#15 --received ack with ackNumber=#20, rwnd=9 --windowSize = 7 --dropping packet seq=#20 --timeout packet seq=#20, retransmitted this packet --cwnd decreased from 7.500000 to 3.750000 --received ack with ackNumber=#25, rwnd=9