Transport Layer Transportlayer services Multiplexing and demultiplexing Connectionless

  • Slides: 54
Download presentation
Transport Layer § Transport-layer services § Multiplexing and demultiplexing § Connectionless transport: UDP §

Transport Layer § Transport-layer services § Multiplexing and demultiplexing § Connectionless transport: UDP § Principles of reliable data transfer Connection-oriented transport: TCP § Principles of congestion control § TCP congestion control § Evolution of transport-layer functionality COMPSCI 453 Computer Networks Professor Jim Kurose College of Information and Computer Sciences University of Massachusetts Class textbook: Computer Networking: A Top. Down Approach (8 th ed. ) J. F. Kurose, K. W. Ross Pearson, 2020 http: //gaia. cs. umass. edu/kurose_ross

Principles of reliable data transfer receiving process sending process application transport data reliable channel

Principles of reliable data transfer receiving process sending process application transport data reliable channel reliable service abstraction

Principles of reliable data transfer receiving process sending process application transport data reliable channel

Principles of reliable data transfer receiving process sending process application transport data reliable channel reliable service abstraction receiving process sending process application transport sender-side of reliable data transfer protocol transport network data receiver-side of reliable data transfer protocol unreliable channel reliable service implementation

Principles of reliable data transfer receiving process sending process application transport Complexity of reliable

Principles of reliable data transfer receiving process sending process application transport Complexity of reliable data transfer protocol will depend (strongly) on characteristics of unreliable channel (lose, corrupt, reorder data? ) sender-side of reliable data transfer protocol transport network data receiver-side of reliable data transfer protocol unreliable channel reliable service implementation

Principles of reliable data transfer receiving process sending process application transport Sender, receiver do

Principles of reliable data transfer receiving process sending process application transport Sender, receiver do not know the “state” of each other, e. g. , was a message received? § unless communicated via a message sender-side of reliable data transfer protocol transport network data receiver-side of reliable data transfer protocol unreliable channel reliable service implementation

Reliable data transfer protocol (rdt): interfaces rdt_send(): called from above, (e. g. , by

Reliable data transfer protocol (rdt): interfaces rdt_send(): called from above, (e. g. , by app. ). Passed data to deliver to receiver upper layer deliver_data(): called by rdt to deliver data to upper layer rdt_send() receiving process sending process data deliver_data() data sender-side implementation of rdt reliable data transfer protocol udt_send() Header packet data receiver-side implementation of rdt reliable data transfer protocol Header data rdt_rcv() unreliable channel udt_send(): called by rdt to transfer packet over unreliable channel to receiver Bi-directional communication over unreliable channel rdt_rcv(): called when packet arrives on receiver side of channel

Reliable data transfer: getting started We will: § incrementally develop sender, receiver sides of

Reliable data transfer: getting started We will: § 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 determined by next event state 1 event actions state 2

rdt 1. 0: reliable transfer over a reliable channel § underlying channel perfectly reliable

rdt 1. 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 reads data from underlying channel sender Wait for call from above rdt_send(data) packet = make_pkt(data) udt_send(packet) receiver Wait for call from below rdt_rcv(packet) extract (packet, data) deliver_data(data)

rdt 2. 0: channel with bit errors § underlying channel may flip bits in

rdt 2. 0: channel with bit errors § underlying channel may flip bits in packet • checksum (e. g. , Internet checksum) to detect bit errors § the question: how to recover from errors? How do humans recover from “errors” during conversation?

rdt 2. 0: channel with bit errors § underlying channel may flip bits in

rdt 2. 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 stop and wait sender sends one packet, then waits for receiver response

rdt 2. 0: FSM specifications sender rdt_send(data) snkpkt = make_pkt(data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) &&

rdt 2. 0: FSM specifications sender rdt_send(data) snkpkt = make_pkt(data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && is. NAK(rcvpkt) Wait for call from ACK or udt_send(sndpkt) above NAK rdt_rcv(rcvpkt) && corrupt(rcvpkt) udt_send(NAK) rdt_rcv(rcvpkt) && is. ACK(rcvpkt) L Wait for call from below receiver rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) extract(rcvpkt, data) deliver_data(data) udt_send(ACK)

rdt 2. 0: FSM specification sender rdt_send(data) snkpkt = make_pkt(data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) &&

rdt 2. 0: FSM specification sender rdt_send(data) snkpkt = make_pkt(data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && is. NAK(rcvpkt) Wait for call from ACK or udt_send(sndpkt) above NAK rdt_rcv(rcvpkt) && corrupt(rcvpkt) udt_send(NAK) rdt_rcv(rcvpkt) && is. ACK(rcvpkt) L Note: “state” of receiver (did the receiver get my message correctly? ) isn’t known to sender unless somehow communicated from receiver to sender § that’s why we need a protocol! Wait for call from below receiver rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) extract(rcvpkt, data) deliver_data(data) udt_send(ACK)

rdt 2. 0: operation with no errors sender rdt_send(data) snkpkt = make_pkt(data, checksum) udt_send(sndpkt)

rdt 2. 0: operation with no errors sender rdt_send(data) snkpkt = make_pkt(data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && is. NAK(rcvpkt) Wait for call from ACK or udt_send(sndpkt) above NAK rdt_rcv(rcvpkt) && corrupt(rcvpkt) udt_send(NAK) rdt_rcv(rcvpkt) && is. ACK(rcvpkt) L Wait for call from below receiver rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) extract(rcvpkt, data) deliver_data(data) udt_send(ACK)

rdt 2. 0: corrupted packet scenario sender rdt_send(data) snkpkt = make_pkt(data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt)

rdt 2. 0: corrupted packet scenario sender rdt_send(data) snkpkt = make_pkt(data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && is. NAK(rcvpkt) Wait for call from ACK or udt_send(sndpkt) above NAK rdt_rcv(rcvpkt) && corrupt(rcvpkt) udt_send(NAK) rdt_rcv(rcvpkt) && is. ACK(rcvpkt) L Wait for call from below receiver rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) extract(rcvpkt, data) deliver_data(data) udt_send(ACK)

rdt 2. 0 has a fatal flaw! what happens if ACK/NAK corrupted? § sender

rdt 2. 0 has a fatal flaw! what happens if ACK/NAK corrupted? § sender doesn’t know what happened at receiver! § can’t just retransmit: possible duplicate handling duplicates: § sender retransmits current pkt if ACK/NAK corrupted § sender adds sequence number to each pkt § receiver discards (doesn’t deliver up) duplicate pkt stop and wait sender sends one packet, then waits for receiver response

rdt 2. 1: sender, handling garbled ACK/NAKs rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt)

rdt 2. 1: sender, handling garbled ACK/NAKs rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && (corrupt(rcvpkt) || Wait for is. NAK(rcvpkt) ) call 0 from above rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && is. ACK(rcvpkt) ACK or NAK 0 udt_send(sndpkt) rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && is. ACK(rcvpkt) L rdt_rcv(rcvpkt) && (corrupt(rcvpkt) || is. NAK(rcvpkt) ) udt_send(sndpkt) L Wait for ACK or NAK 1 Wait for call 1 from above rdt_send(data) sndpkt = make_pkt(1, data, checksum) udt_send(sndpkt)

rdt 2. 1: receiver, handling garbled ACK/NAKs rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq 0(rcvpkt) rdt_rcv(rcvpkt)

rdt 2. 1: receiver, handling garbled ACK/NAKs rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq 0(rcvpkt) rdt_rcv(rcvpkt) && (corrupt(rcvpkt) extract(rcvpkt, data) deliver_data(data) sndpkt = make_pkt(ACK, chksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && (corrupt(rcvpkt) sndpkt = make_pkt(NAK, chksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && not corrupt(rcvpkt) && has_seq 1(rcvpkt) sndpkt = make_pkt(ACK, chksum) udt_send(sndpkt) sndpkt = make_pkt(NAK, chksum) udt_send(sndpkt) Wait for 0 from below Wait for 1 from below rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq 1(rcvpkt) extract(rcvpkt, data) deliver_data(data) sndpkt = make_pkt(ACK, chksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && not corrupt(rcvpkt) && has_seq 0(rcvpkt) sndpkt = make_pkt(ACK, chksum) udt_send(sndpkt)

rdt 2. 1: discussion sender: § seq # added to pkt § two seq.

rdt 2. 1: discussion sender: § seq # added to pkt § two seq. #s (0, 1) will suffice. Why? § must check if received ACK/NAK corrupted § twice as many states • state must “remember” whether “expected” pkt should have seq # of 0 or 1 receiver: § must check if received packet is duplicate • state indicates whether 0 or 1 is expected pkt seq # § note: receiver can not know if its last ACK/NAK received OK at sender

rdt 2. 2: a NAK-free protocol § same functionality as rdt 2. 1, using

rdt 2. 2: a NAK-free protocol § same functionality as rdt 2. 1, using ACKs only § instead of NAK, receiver sends ACK for last pkt received OK • receiver must explicitly include seq # of pkt being ACKed § duplicate ACK at sender results in same action as NAK: retransmit current pkt As we will see, TCP uses this approach to be NAK-free

rdt 2. 2: sender, receiver fragments rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt)

rdt 2. 2: sender, receiver fragments rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && Wait for call 0 from above rdt_rcv(rcvpkt) && (corrupt(rcvpkt) || has_seq 1(rcvpkt)) udt_send(sndpkt) Wait for 0 from below sender FSM fragment ( corrupt(rcvpkt) || is. ACK(rcvpkt, 1) ) udt_send(sndpkt) Wait for ACK 0 rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && is. ACK(rcvpkt, 0) receiver FSM fragment rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq 1(rcvpkt) extract(rcvpkt, data) deliver_data(data) sndpkt = make_pkt(ACK 1, chksum) udt_send(sndpkt) L

rdt 3. 0: channels with errors and loss New channel assumption: underlying channel can

rdt 3. 0: channels with errors and loss New channel assumption: underlying channel can also lose packets (data, ACKs) • checksum, seq. #, ACKs, retransmissions will be of help … but not enough How do humans handle lost sender-to-receiver words in conversation? Approach: sender waits “reasonable” amount of time for ACK § retransmits if no ACK received in this time § if pkt (or ACK) just delayed (not lost): • retransmission will be duplicate, but seq. #s already handles this • receiver must specify seq # of pkt being ACKed § requires countdown timer

rdt 3. 0 sender rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) start_timer rdt_rcv(rcvpkt) L

rdt 3. 0 sender rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) start_timer rdt_rcv(rcvpkt) L rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && is. ACK(rcvpkt, 1) rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || is. ACK(rcvpkt, 0) ) timeout udt_send(sndpkt) start_timer rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && is. ACK(rcvpkt, 0) stop_timer timeout udt_send(sndpkt) start_timer L Wait for ACK 0 Wait for call 0 from above L rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || is. ACK(rcvpkt, 1) ) Wait for ACK 1 Wait for call 1 from above rdt_send(data) sndpkt = make_pkt(1, data, checksum) udt_send(sndpkt) start_timer rdt_rcv(rcvpkt) L

rdt 3. 0 in action receiver send pkt 0 rcv ack 0 send pkt

rdt 3. 0 in action receiver send pkt 0 rcv ack 0 send pkt 1 rcv ack 1 send pkt 0 ack 0 pkt 1 ack 1 pkt 0 ack 0 send pkt 0 rcv pkt 0 send ack 0 rcv pkt 1 send ack 1 rcv pkt 0 send ack 0 rcv ack 0 send pkt 1 pkt 0 ack 0 rcv pkt 0 send ack 0 pkt 1 X loss timeout resend pkt 1 rcv ack 1 send pkt 0 (a) no loss receiver sender pkt 1 ack 1 pkt 0 ack 0 rcv pkt 1 send ack 1 rcv pkt 0 send ack 0 (b) packet loss

rdt 3. 0 in action receiver send pkt 0 rcv ack 0 send pkt

rdt 3. 0 in action receiver send pkt 0 rcv ack 0 send pkt 1 ack 0 pkt 1 ack 1 X rcv pkt 0 send ack 0 rcv pkt 1 send ack 1 loss timeout resend pkt 1 rcv ack 1 send pkt 0 pkt 1 ack 1 pkt 0 ack 0 (c) ACK loss send pkt 0 rcv ack 0 send pkt 1 (detect duplicate) send ack 1 rcv pkt 0 send ack 0 pkt 0 ack 0 pkt 1 ack 1 timeout resend pkt 1 rcv pkt 1 receiver sender rcv ack 1 send pkt 0 pkt 1 pkt 0 ack 1 ack 0 pkt 0 ack 0 rcv pkt 0 send ack 0 rcv pkt 1 send ack 1 rcv pkt 1 (detect duplicate) send ack 1 rcv pkt 0 send ack 0 rcv pkt 0 (detect duplicate) send ack 0 (d) premature timeout/ delayed ACK

rdt 3. 0: channels with errors and loss New channel assumption: underlying channel can

rdt 3. 0: channels with errors and loss New channel assumption: underlying channel can also lose packets (data, ACKs) • checksum, sequence #s, ACKs, retransmissions will be of help … but not quite enough Q: How do humans handle lost sender-toreceiver words in conversation?

rdt 3. 0: channels with errors and loss Approach: sender waits “reasonable” amount of

rdt 3. 0: channels with errors and loss Approach: sender waits “reasonable” amount of time for ACK § retransmits if no ACK received in this time § if pkt (or ACK) just delayed (not lost): • retransmission will be duplicate, but seq #s already handles this! • receiver must specify seq # of packet being ACKed § use countdown timer to interrupt after “reasonable” amount of timeout

rdt 3. 0 sender rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) start_timer Wait for

rdt 3. 0 sender rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) start_timer Wait for call 0 from above rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && is. ACK(rcvpkt, 1) Wait for ACK 0 rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && is. ACK(rcvpkt, 0) stop_timer Wait for ACK 1 Wait for call 1 from above rdt_send(data) sndpkt = make_pkt(1, data, checksum) udt_send(sndpkt) start_timer

rdt 3. 0 sender rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) start_timer rdt_rcv(rcvpkt) L

rdt 3. 0 sender rdt_send(data) sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) start_timer rdt_rcv(rcvpkt) L Wait for call 0 from above rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && is. ACK(rcvpkt, 1) timeout udt_send(sndpkt) start_timer rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || is. ACK(rcvpkt, 0) ) L Wait for ACK 0 timeout udt_send(sndpkt) start_timer rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && is. ACK(rcvpkt, 0) stop_timer L rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || is. ACK(rcvpkt, 1) ) Wait for ACK 1 Wait for call 1 from above rdt_send(data) sndpkt = make_pkt(1, data, checksum) udt_send(sndpkt) start_timer rdt_rcv(rcvpkt) L

rdt 3. 0 in action receiver send pkt 0 rcv ack 0 send pkt

rdt 3. 0 in action receiver send pkt 0 rcv ack 0 send pkt 1 rcv ack 1 send pkt 0 ack 0 pkt 1 ack 1 pkt 0 ack 0 send pkt 0 rcv pkt 0 send ack 0 rcv pkt 1 send ack 1 rcv pkt 0 send ack 0 rcv ack 0 send pkt 1 pkt 0 ack 0 rcv pkt 0 send ack 0 pkt 1 X loss timeout resend pkt 1 rcv ack 1 send pkt 0 (a) no loss receiver sender pkt 1 ack 1 pkt 0 ack 0 rcv pkt 1 send ack 1 rcv pkt 0 send ack 0 (b) packet loss

rdt 3. 0 in action sender send pkt 0 rcv ack 0 send pkt

rdt 3. 0 in action sender send pkt 0 rcv ack 0 send pkt 1 ack 0 pkt 1 ack 1 X receiver send pkt 0 rcv pkt 0 send ack 0 rcv ack 0 send pkt 1 rcv pkt 1 send ack 1 loss timeout resend pkt 1 rcv ack 1 send pkt 0 pkt 1 ack 1 pkt 0 ack 0 (c) ACK loss (detect duplicate) send ack 1 rcv pkt 0 send ack 0 pkt 0 ack 0 pkt 1 rcv pkt 0 send ack 0 rcv pkt 1 send ack 1 timeout resend pkt 1 rcv pkt 1 receiver sender rcv ack 1 send pkt 0 rcv ack 1 (ignore) pkt 1 rcv pkt 1 (detect duplicate) pkt 0 send ack 1 rcv pkt 0 send ack 0 pkt 1 (d) premature timeout/ delayed ACK

Performance of rdt 3. 0 (stop-and-wait) § U sender: utilization – fraction of time

Performance of rdt 3. 0 (stop-and-wait) § U sender: utilization – fraction of time sender busy sending § example: 1 Gbps link, 15 ms prop. delay, 8000 bit packet • time to transmit packet into channel: 8000 bits L Dtrans = R = 9 10 bits/sec = 8 microsecs

rdt 3. 0: stop-and-wait operation sender receiver first packet bit transmitted, t = 0

rdt 3. 0: stop-and-wait operation sender receiver first packet bit transmitted, t = 0 RTT ACK arrives, send next packet, t = RTT + L / R first packet bit arrives last packet bit arrives, send ACK

rdt 3. 0: stop-and-wait operation sender Usender= L/R receiver L/R RTT + L /

rdt 3. 0: stop-and-wait operation sender Usender= L/R receiver L/R RTT + L / R . 008 = 30. 008 RTT = 0. 00027 § rdt 3. 0 protocol performance stinks! § Protocol limits performance of underlying infrastructure (channel)

rdt 3. 0: pipelined protocols operation pipelining: sender allows multiple, “in-flight”, yet-to-be-acknowledged packets •

rdt 3. 0: pipelined protocols operation pipelining: sender allows multiple, “in-flight”, yet-to-be-acknowledged packets • range of sequence numbers must be increased • buffering at sender and/or receiver

Pipelining: increased utilization sender receiver first packet bit transmitted, t = 0 last bit

Pipelining: increased utilization sender receiver first packet bit transmitted, t = 0 last bit transmitted, t = L / R RTT first packet bit arrives last packet bit arrives, send ACK last bit of 2 nd packet arrives, send ACK last bit of 3 rd packet arrives, send ACK arrives, send next packet, t = RTT + L / R 3 -packet pipelining increases utilization by a factor of 3!

Go-Back-N: sender § sender: “window” of up to N, consecutive transmitted but un. ACKed

Go-Back-N: sender § sender: “window” of up to N, consecutive transmitted but un. ACKed pkts • k-bit seq # in pkt header § cumulative ACK: ACK(n): ACKs all packets up to, including seq # n • on receiving ACK(n): move window forward to begin at n+1 § timer for oldest in-flight packet § timeout(n): retransmit packet n and all higher seq # packets in window

Go-Back-N: receiver § ACK-only: always send ACK for correctly-received packet so far, with highest

Go-Back-N: receiver § ACK-only: always send ACK for correctly-received packet so far, with highest in-order seq # • may generate duplicate ACKs • need only remember rcv_base § on receipt of out-of-order packet: • can discard (don’t buffer) or buffer: an implementation decision • re-ACK pkt with highest in-order seq # Receiver view of sequence number space: … … rcv_base received and ACKed Out-of-order: received but not ACKed Not received

Go-Back-N in action sender window (N=4) 012345678 012345678 sender send pkt 0 send pkt

Go-Back-N in action sender window (N=4) 012345678 012345678 sender send pkt 0 send pkt 1 send pkt 2 send pkt 3 (wait) rcv ack 0, send pkt 4 rcv ack 1, send pkt 5 ignore duplicate ACK pkt 2 timeout 012345678 send pkt 2 pkt 3 pkt 4 pkt 5 receiver Xloss receive pkt 0, send ack 0 receive pkt 1, send ack 1 receive pkt 3, discard, (re)send ack 1 receive pkt 4, discard, (re)send ack 1 receive pkt 5, discard, (re)send ack 1 rcv rcv pkt 2, pkt 3, pkt 4, pkt 5, deliver, send ack 2 ack 3 ack 4 ack 5

Selective repeat § receiver individually acknowledges all correctly received packets • buffers packets, as

Selective repeat § receiver individually acknowledges all correctly received packets • buffers packets, as needed, for eventual in-order delivery to upper layer § sender times-out/retransmits individually for un. ACKed packets • sender maintains timer for each un. ACKed pkt § sender window • N consecutive seq #s • limits seq #s of sent, un. ACKed packets

Selective repeat: sender, receiver windows

Selective repeat: sender, receiver windows

Selective repeat: sender and receiver sender data from above: § if next available seq

Selective repeat: sender and receiver sender data from above: § if next available seq # in window, send packet timeout(n): § resend packet n, restart timer ACK(n) in [sendbase, sendbase+N]: § mark packet n as received § if n smallest un. ACKed packet, advance window base to next un. ACKed seq # receiver packet n in [rcvbase, rcvbase+N-1] § send ACK(n) § out-of-order: buffer § in-order: deliver (also deliver buffered, in-order packets), advance window to next not-yetreceived packet n in [rcvbase-N, rcvbase-1] § ACK(n) otherwise: § ignore

Selective Repeat in action sender window (N=4) 012345678 012345678 sender send pkt 0 send

Selective Repeat in action sender window (N=4) 012345678 012345678 sender send pkt 0 send pkt 1 send pkt 2 send pkt 3 (wait) receiver Xloss rcv ack 0, send pkt 4 rcv ack 1, send pkt 5 record ack 3 arrived pkt 2 timeout 012345678 receive pkt 0, send ack 0 receive pkt 1, send ack 1 receive pkt 3, buffer, send ack 3 receive pkt 4, buffer, send ack 4 receive pkt 5, buffer, send ack 5 send pkt 2 (but not 3, 4, 5) Q: what happens when ack 2 arrives? rcv pkt 2; deliver pkt 2, pkt 3, pkt 4, pkt 5; send ack 2

Selective repeat: a dilemma! example: § seq #s: 0, 1, 2, 3 (base 4

Selective repeat: a dilemma! example: § seq #s: 0, 1, 2, 3 (base 4 counting) § window size=3 receiver window (after receipt) sender window (after receipt) 0123012 pkt 0 0123012 pkt 1 0123012 pkt 2 0123012 pkt 3 0123012 X pkt 0 will accept packet with seq number 0 (a) no problem 0123012 pkt 0 0123012 pkt 1 0123012 pkt 2 timeout retransmit pkt 0 0123012 (b) oops! 0123012 X X X 0123012 will accept packet with seq number 0

Selective repeat: a dilemma! example: § seq #s: 0, 1, 2, 3 (base 4

Selective repeat: a dilemma! example: § seq #s: 0, 1, 2, 3 (base 4 counting) § window size=3 Q: what relationship is needed between sequence # size and window size to avoid problem in scenario (b)? receiver window (after receipt) sender window (after receipt) 0123012 pkt 0 0123012 pkt 1 0123012 pkt 2 0123012 pkt 3 0123012 X § receiver can’t pkt 0 see sender side (a) no problem § receiver behavior identical in both cases! § something’s pkt 0 0(very) 1 2 3 0 1 wrong! 2 0123012 pkt 1 0123012 pkt 2 timeout retransmit pkt 0 0123012 (b) oops! will accept packet with seq number 0 0123012 X X X 0123012 will accept packet with seq number 0

Transport Layer § § § § Transport-layer services Multiplexing and demultiplexing Connectionless transport: UDP

Transport Layer § § § § Transport-layer services Multiplexing and demultiplexing Connectionless transport: UDP Principles of reliable data transfer (1) Connection-oriented transport: TCP Principles of congestion control TCP congestion control Evolution of transport-layer functionality Video: 2020, J. F. Kurose, All Rights Reserved Powerpoint: 1996 -2020, J. F. Kurose, K. W. Ross, All Rights Reserved COMPSCI 453 Computer Networks Professor Jim Kurose College of Information and Computer Sciences University of Massachusetts Class textbook: Computer Networking: A Top. Down Approach (8 th ed. ) J. F. Kurose, K. W. Ross Pearson, 2020 http: //gaia. cs. umass. edu/kurose_ross

Backup Transport Layer: 3 -46

Backup Transport Layer: 3 -46

Turn switch ON power to filament OFF ON Turn switch OFF no power to

Turn switch ON power to filament OFF ON Turn switch OFF no power to filament

Turn switch OFF D Turn switch ON power to filament OFF ON Turn switch

Turn switch OFF D Turn switch ON power to filament OFF ON Turn switch OFF no power to filament Turn switch ON D

rdt protocol mechanisms: § error detection (e. g. , checksum) § ACKs, NAKs §

rdt protocol mechanisms: § error detection (e. g. , checksum) § ACKs, NAKs § retransmission § sequence numbers (duplicate detection)

rdt 2. 1 sender rdt_send(data) S 1 sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt)

rdt 2. 1 sender rdt_send(data) S 1 sndpkt = make_pkt(0, data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && (corrupt(rcvpkt) || Wait for is. NAK(rcvpkt) ) S 2 call 0 from above S 6 rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && is. ACK(rcvpkt) ACK or NAK 0 udt_send(sndpkt) rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && is. ACK(rcvpkt) L S 5 rdt_rcv(rcvpkt) && (corrupt(rcvpkt) || is. NAK(rcvpkt) ) udt_send(sndpkt) L Wait for ACK or NAK 1 Wait for call 1 from above rdt_send(data) sndpkt = make_pkt(1, data, checksum) udt_send(sndpkt) S 3 S 4

rdt 2. 1 receiver rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq 0(rcvpkt) R 1 R 6

rdt 2. 1 receiver rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq 0(rcvpkt) R 1 R 6 rdt_rcv(rcvpkt) && (corrupt(rcvpkt) extract(rcvpkt, data) deliver_data(data) sndpkt = make_pkt(ACK, chksum) udt_send(sndpkt) R 2 sndpkt = make_pkt(NAK, chksum) udt_send(sndpkt) Wait for 0 from below rdt_rcv(rcvpkt) && not corrupt(rcvpkt) && has_seq 1(rcvpkt) sndpkt = make_pkt(ACK, chksum) udt_send(sndpkt) R 5 R 4 Wait for 1 from below rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq 1(rcvpkt) extract(rcvpkt, data) deliver_data(data) sndpkt = make_pkt(ACK, chksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && (corrupt(rcvpkt) sndpkt = make_pkt(NAK, chksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && not corrupt(rcvpkt) && has_seq 0(rcvpkt) R 3 sndpkt = make_pkt(ACK, chksum) udt_send(sndpkt)

rdt 2. 0: FSM specifications sender rdt_rcv(rcvpkt) && corrupt(rcvpkt) rdt_send(data) S 1 snkpkt =

rdt 2. 0: FSM specifications sender rdt_rcv(rcvpkt) && corrupt(rcvpkt) rdt_send(data) S 1 snkpkt = make_pkt(data, checksum) udt_send(sndpkt) rdt_rcv(rcvpkt) && is. NAK(rcvpkt) Wait for call from ACK or udt_send(sndpkt) above NAK udt_send(NAK) Wait for call from below R 1 receiver S 2 rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) rdt_rcv(rcvpkt) && is. ACK(rcvpkt) S 3 L R 2 extract(rcvpkt, data) deliver_data(data) udt_send(ACK)

Go-Back-N: sender extended FSM rdt_send(data) L base=1 nextseqnum=1 if (nextseqnum < base+N) { sndpkt[nextseqnum]

Go-Back-N: sender extended FSM rdt_send(data) L base=1 nextseqnum=1 if (nextseqnum < base+N) { sndpkt[nextseqnum] = make_pkt(nextseqnum, data, chksum) udt_send(sndpkt[nextseqnum]) if (base == nextseqnum) start_timer nextseqnum++ } else refuse_data(data) Wait rdt_rcv(rcvpkt) && corrupt(rcvpkt) timeout start_timer udt_send(sndpkt[base]) udt_send(sndpkt[base+1]) … udt_send(sndpkt[nextseqnum-1]) rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) base = getacknum(rcvpkt)+1 If (base == nextseqnum) stop_timer else start_timer

Go-Back-N: receiver extended FSM any other event udt_send(sndpkt) L Wait expectedseqnum=1 sndpkt = make_pkt(expectedseqnum,

Go-Back-N: receiver extended FSM any other event udt_send(sndpkt) L Wait expectedseqnum=1 sndpkt = make_pkt(expectedseqnum, ACK, chksum) rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && hasseqnum(rcvpkt, expectedseqnum) extract(rcvpkt, data) deliver_data(data) sndpkt = make_pkt(expectedseqnum, ACK, chksum) udt_send(sndpkt) expectedseqnum++ ACK-only: always send ACK for correctly-received packet with highest in-order seq # • may generate duplicate ACKs • need only remember expectedseqnum § out-of-order packet: • discard (don’t buffer): no receiver buffering! • re-ACK pkt with highest in-order seq #