Transport Layer
Transport Layer
Transport Layer
Transport Layer
Mayank Pandey
Objectives
• understand principles behind transport layer
services:
– multiplexing/demultiplexing
– reliable data transfer
– flow control
– congestion control
• learn about transport layer protocols in the Internet:
– UDP: connectionless transport
– TCP: connection-oriented transport
– TCP congestion control
2
Transport services and protocols
applicatio
n
• provide logical communication transport
network
between app processes running data link
physical
lo
on different hosts
gi
ca
• transport protocols run in end
enl
systems
d-
en
d
– send side: breaks app
tr
a
messages into segments,
ns
po
passes to network layer
tr
– rcv side: reassembles applicatio
n
segments into messages, transport
network
passes to app layer data link
physical
• more than one transport protocol
available to apps
– Internet: TCP and UDP
3
Internet transport-layer protocols
• reliable, in-order delivery applicatio
n
transport
(TCP) network
data link
network
– congestion control physical
lo
data link
network
gi
physical
data link
– flow control
ca
physical
l en
– connection setup
d-
en
• unreliable, unordered network
d
data link
tr
a
delivery: UDP
physicalnetwork
ns
data link
po
physical
– no-frills extension of “best-
rt
network
data link
effort” IP physical network
applicatio
n
data link transport
• services not available: physical network
data link
– delay guarantees physical
– bandwidth guarantees
4
Multiplexing/demultiplexing
Demultiplexing at rcv host: Multiplexing at send host:
delivering received segments gathering data from multiple
to correct socket sockets, enveloping data with
header (later used for
= socket = process demultiplexing)
application P3 P1
P1
application P2 P4 application
host 2 host 3
host 1
5
How demultiplexing works
• host receives IP datagrams
– each datagram has source IP 32 bits
address, destination IP
source port # dest port #
address
– each datagram carries 1
transport-layer segment other header fields
– each segment has source,
destination port number
• host uses IP addresses & application
port numbers to direct data
(message)
segment to appropriate
socket
TCP/UDP segment format
6
Connectionless demultiplexing
• create sockets with host-local • when host receives UDP
port numbers: segment:
– checks destination port
DatagramSocket mySocket1 = new
DatagramSocket(12534); number in segment
DatagramSocket mySocket2 = new – directs UDP segment to socket
DatagramSocket(12535); with that port number
• when creating datagram to send • IP datagrams with different
into UDP socket, must specify source IP addresses and/or
(dest IP address, dest port number) source port numbers
directed to same socket
7
Connectionless demux (cont)
DatagramSocket serverSocket = new DatagramSocket(6428);
P2 P3 P1
P1
8
Connection-oriented demux
• TCP socket identified by 4- • server host may support
tuple: many simultaneous TCP
– source IP address sockets:
– source port number – each socket identified by its
– dest IP address own 4-tuple
– dest port number • web servers have different
• recv host uses all four sockets for each connecting
values to direct segment to client
appropriate socket – non-persistent HTTP will have
different socket for each
request
9
Connection-oriented demux (cont)
P1 P4 P5 P6 P2 P1P3
SP: 5775
DP: 80
S-IP: B
D-IP:C
10
Socket programming: System Calls
11
Attention: sendto() recvfrom()
12
UDP: User Datagram Protocol [RFC 768]
• “no frills,” “bare bones”
Internet transport protocol Why is there a UDP?
• “best effort” service, UDP • no connection establishment
segments may be: (which can add delay)
– lost • simple: no connection state at
– delivered out of order to sender, receiver
app • small segment header
• connectionless: • no congestion control: UDP can
– no handshaking between blast away as fast as desired
UDP sender, receiver
– each UDP segment handled
independently of others
13
UDP: more
• often used for streaming
32 bits
multimedia apps
Length, in source port # dest port #
– loss tolerant
– rate sensitive bytes of UDP length checksum
segment,
• other UDP uses including
– DNS header
– SNMP
Application
• reliable transfer over UDP: data
add reliability at (message)
application layer
– application-specific error
recovery! UDP segment format
14
UDP checksum
Goal: detect “errors” (e.g., flipped bits) in transmitted
segment
Sender: Receiver:
• treat segment contents as • compute checksum of received
sequence of 16-bit integers segment
• checksum: addition (1’s • check if computed checksum
complement sum) of segment equals checksum field value:
contents – NO - error detected
• sender puts checksum value – YES - no error detected. But
into UDP checksum field maybe errors nonetheless?
More later ….
15
Internet Checksum Example
• Note: When adding numbers, a carryout from the most
significant bit needs to be added to the result
• Example: add two 16-bit integers
1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0
1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
wraparound 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1
sum 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 0 0
checksum 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1
16
Pseudo Header
send receive
side side
We’ll:
• incrementally develop sender, receiver sides of
reliable data transfer protocol (rdt)
• consider only unidirectional data transfer
– but control info will flow on both directions!
• use finite state machines (FSM) to specify sender,
receiver
event causing state transition
actions taken on state transition
state: when in this “state”
next state uniquely state state
1 event
determined by next 2
event actions
22
Rdt1.0: reliable transfer over a reliable channel
• underlying channel perfectly reliable
– no bit errors
– no loss of packets
• separate FSMs for sender, receiver:
– sender sends data into underlying channel
– receiver read data from underlying channel
sender receiver
23
Rdt2.0: channel with bit errors
• underlying channel may flip bits in packet
– checksum to detect bit errors
• the question: how to recover from errors:
– acknowledgements (ACKs): receiver explicitly tells sender that pkt
received OK
How do acknowledgements
– negative humans recover from “errors”
(NAKs): receiver explicitly tells sender
during
that pkt conversation?
had errors
– sender retransmits pkt on receipt of NAK
• new mechanisms in rdt2.0 (beyond rdt1.0):
– error detection
– receiver feedback: control msgs (ACK,NAK) rcvr->sender
24
Rdt2.0: channel with bit errors
• underlying channel may flip bits in packet
– checksum to detect bit errors
• the question: how to recover from errors:
– acknowledgements (ACKs): receiver explicitly tells sender that pkt
received OK
– negative acknowledgements (NAKs): receiver explicitly tells sender
that pkt had errors
– sender retransmits pkt on receipt of NAK
• new mechanisms in rdt2.0 (beyond rdt1.0):
– error detection
– receiver feedback: control msgs (ACK,NAK) rcvr->sender
25
rdt2.0: FSM specification
rdt_send(data)
sndpkt = make_pkt(data, checksum) receiver
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
Wait for Wait for rdt_rcv(rcvpkt) &&
call from ACK or udt_send(sndpkt) corrupt(rcvpkt)
above NAK
udt_send(NAK)
26
rdt2.0: operation with no errors
rdt_send(data)
snkpkt = make_pkt(data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
Wait for Wait for rdt_rcv(rcvpkt) &&
call from ACK or udt_send(sndpkt) corrupt(rcvpkt)
above NAK
udt_send(NAK)
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
27
rdt2.0: error scenario
rdt_send(data)
snkpkt = make_pkt(data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
Wait for Wait for rdt_rcv(rcvpkt) &&
call from ACK or udt_send(sndpkt) corrupt(rcvpkt)
above NAK
udt_send(NAK)
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
28
rdt2.0 has a fatal flaw!
What happens if ACK/NAK corrupted?
Handling
• sender doesn’t know what happened duplicates:
at receiver!
• sender retransmits current pkt
• can’t just retransmit: possible duplicate
if ACK/NAK garbled
• sender adds sequence number
to each pkt
• receiver discards (doesn’t
deliver up) duplicate pkt
29
rdt2.1: sender, handles garbled ACK/NAKs
rdt_send(data)
sndpkt = make_pkt(0, data, checksum)
udt_send(sndpkt) rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
Wait for Wait for
ACK or
isNAK(rcvpkt) )
call 0 from
NAK 0 udt_send(sndpkt)
above
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt) rdt_rcv(rcvpkt)
&& isACK(rcvpkt) && notcorrupt(rcvpkt)
&& isACK(rcvpkt)
L
L
Wait for Wait for
ACK or call 1 from
rdt_rcv(rcvpkt) && NAK 1 above
( corrupt(rcvpkt) ||
isNAK(rcvpkt) ) rdt_send(data)
30
rdt2.1: receiver, handles garbled ACK/NAKs
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq0(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) && rdt_rcv(rcvpkt) &&
(corrupt(rcvpkt) (corrupt(rcvpkt)
sndpkt = make_pkt(NAK, chksum) sndpkt = make_pkt(NAK, chksum)
udt_send(sndpkt) udt_send(sndpkt)
Wait for Wait for
rdt_rcv(rcvpkt) && 0 from 1 from rdt_rcv(rcvpkt) &&
not corrupt(rcvpkt) && below below not corrupt(rcvpkt) &&
has_seq1(rcvpkt) has_seq0(rcvpkt)
sndpkt = make_pkt(ACK, chksum) sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt) udt_send(sndpkt)
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq1(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
31
rdt2.1: discussion
Receiver:
Sender:
• must
seq # check
addediftoreceived
pkt packet is duplicate
– state
• two seq.indicates
#’s (0,1)whether 0 or 1 isWhy?
will suffice. expected pkt seq #
•• note: receiver
must check can not know
if received ACK/NAKif itscorrupted
last ACK/NAK received OK at
• sender
twice as many states
– state must “remember” whether “current” pkt has 0 or 1 seq. #
32
rdt2.2: a NAK-free protocol
33
rdt2.2: sender, receiver fragments
rdt_send(data)
sndpkt = make_pkt(0, data, checksum)
udt_send(sndpkt) rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
Wait for Wait for
ACK isACK(rcvpkt,1) )
call 0 from
above 0 udt_send(sndpkt)
sender FSM
fragment rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
rdt_rcv(rcvpkt) && && isACK(rcvpkt,0)
(corrupt(rcvpkt) || L
has_seq1(rcvpkt)) Wait for receiver FSM
0 from
udt_send(sndpkt) below fragment
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq1(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK1, chksum)
udt_send(sndpkt) 34
rdt3.0: channels with errors and loss
35
rdt3.0 sender
rdt_send(data)
rdt_rcv(rcvpkt) &&
sndpkt = make_pkt(0, data, checksum) ( corrupt(rcvpkt) ||
udt_send(sndpkt) isACK(rcvpkt,1) )
rdt_rcv(rcvpkt) start_timer L
L Wait for Wait
for timeout
call 0from
ACK0 udt_send(sndpkt)
above
start_timer
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt) rdt_rcv(rcvpkt)
&& isACK(rcvpkt,1) && notcorrupt(rcvpkt)
stop_timer && isACK(rcvpkt,0)
stop_timer
Wait Wait for
timeout for call 1 from
udt_send(sndpkt) ACK1 above
start_timer rdt_rcv(rcvpkt)
rdt_send(data) L
rdt_rcv(rcvpkt) &&
sndpkt = make_pkt(1, data, checksum)
( corrupt(rcvpkt) || udt_send(sndpkt)
isACK(rcvpkt,0) ) start_timer
L
36
rdt3.0 in action
37
rdt3.0 in action
38
Performance of rdt3.0
L 8000bits
d trans 9 8 microseconds
R 10 bps
U sender: utilization – fraction of time sender busy sending
L/ R .008
U = = = 0.00027
sender 30.008
RTT +L / R microsec
onds
if RTT=30 msec, 1KB pkt every 30 msec -> 33kB/sec thruput over
1 Gbps link
network protocol limits use of physical resources!
39
rdt3.0: stop-and-wait operation
sender receiver
first packet bit transmitted, t = 0
last packet bit transmitted, t = L / R
L/ R .008
U = = = 0.00027
sender 30.008
RTT +L / R microsec
onds
40
Pipelined protocols
pipelining: sender allows multiple, “in-flight”, yet-to-be-
acknowledged pkts
– range of sequence numbers must be increased
– buffering at sender and/or receiver
Increase utilization
by a factor of 3!
3*L/ R .024
U = = = 0.0008
sender 30.008
RTT +L / R microsecon
ds
42
Pipelined Protocols
Selective Repeat:
Go-back-N: big picture:
big pic
• sender can have up to N unack’ed
unacked packets
packetsininpipeline
pipeline
• rcvr sends
only sends
individual
cumulative
ack foracks
each packet
– doesn’t
• sender ack packettimer
maintains if there’s
for aeach
gap unacked packet
• sender
– whenhas timer
timer forretransmit
expires, oldest unacked packet
only unack’ed packet
– if timer expires, retransmit all unack’ed packets
43
Go-Back-N
Sender:
• k-bit seq # in pkt header
• “window” of up to N, consecutive unack’ed pkts allowed
44
GBN: sender extended FSM
rdt_send(data)
if (nextseqnum < base+N) {
sndpkt[nextseqnum] = make_pkt(nextseqnum,data,chksum)
udt_send(sndpkt[nextseqnum])
if (base == nextseqnum)
start_timer
nextseqnum++
}
L else
refuse_data(data)
base=1
nextseqnum=1
timeout
start_timer
Wait
udt_send(sndpkt[base])
rdt_rcv(rcvpkt) udt_send(sndpkt[base+1])
&& corrupt(rcvpkt) …
udt_send(sndpkt[nextseqnum-
1])
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
base = getacknum(rcvpkt)+1
If (base == nextseqnum)
stop_timer
else
start_timer 45
GBN: receiver extended FSM
default
udt_send(sndpkt) rdt_rcv(rcvpkt)
&& notcurrupt(rcvpkt)
L && hasseqnum(rcvpkt,expectedseqnum)
expectedseqnum=1 Wait extract(rcvpkt,data)
sndpkt = deliver_data(data)
make_pkt(expectedseqnum,ACK,chksum) sndpkt = make_pkt(expectedseqnum,ACK,chksum)
udt_send(sndpkt)
expectedseqnum++
47
Selective Repeat
48
Selective repeat: sender, receiver windows
49
Selective repeat
sender receiver
data from above : pkt n in [rcvbase, rcvbase+N-1]
• if next available seq # in window, send ACK(n)
send pkt out-of-order: buffer
timeout(n): in-order: deliver (also deliver
• resend pkt n, restart timer buffered, in-order pkts),
advance window to next not-
ACK(n) in [sendbase,sendbase+N]: yet-received pkt
• mark pkt n as received
pkt n in [rcvbase-N,rcvbase-1]
• if n smallest unACKed pkt, ACK(n)
advance window base to next
unACKed seq # otherwise:
ignore
50
Selective repeat in action
3-51
Selective repeat:
dilemma
Example:
• seq #’s: 0, 1, 2, 3
• window size=3
• receiver sees no
difference in two
scenarios!
• incorrectly passes
duplicate data as new in
(a)