340 likes | 347 Views
TCP Tutorial - Part II -. Laboratory of Intelligent Network @ KUT ( http://link.kut.ac.kr ) Youn-Hee Han. It is licensed under a Creative Commons Attribution 2.5 License. TCP Flow Control. TCP Flow Control. Send buffer size: SendBuffer Sending side
E N D
TCP Tutorial- Part II- Laboratory of Intelligent Network @ KUT (http://link.kut.ac.kr) Youn-Hee Han It is licensed under a Creative Commons Attribution 2.5 License
TCP Flow Control KUT
TCP Flow Control • Send buffer size: SendBuffer • Sending side • LastByteSent - LastByteAcked ≤ AdvertisedWindow • LastByteWritten - LastByteAcked ≤ SendBuffer • LastByteAcked ≤ LastByteSent • LastByteSent ≤ LastByteWritten • buffer bytes between LastByteAcked and LastByteWritten • block sender if tries to write y bytes but (LastByteWritten - LastByteAcked) + y > SenderBuffer Sending application TCP LastByteWritten LastByteAcked LastByteSent (a) KUT
TCP Flow Control • Receive buffer size: RcvBuffer • Receiving side • LastByteRead < NextByteExpected • NextByteExpected ≤ LastByteRcvd + 1 • LastByteRcvd - LastByteRead ≤ RcvBuffer • buffer bytes between LastByteRead and LastByteRcvd • AdvertisedWindow = RcvBuffer - (LastByteRcvd - LastByteRead) Receiving application TCP LastByteRead NextByteExpected LastByteRcvd (b) KUT
TCP Flow Control • TCP sender has a ‘SendBuffer’ • LastByteSent - LastByteAcked ≤ AdvertisedWindow • block sender if tries to send the next segment but (LastByteSent - LastByteAcked) + thee next sgement size > AdvertisedWindow • LastByteWritten – LastByteAcked ≤ SendBuffer • block sender if tries to write y bytes but (LastByteWritten - LastByteAcked) + y > SenderBuffer EffectiveWindow LastByteWritten AdvertisedWindow (from receiver) Sent but not acked Not yet sent Sequence numbers SendBuffer LastByteSent LastByteAcked KUT
TCP receiver has a “RcvBuffer”: flow control sender won’t overflow receiver’s buffer by transmitting too much, too fast TCP Flow Control LastByteRead RcvBuffer (possible window) ACKed but not delivered to app. recv’d but not ACKed Sequence numbers missing data AdvertisedWindow NextByteExpected LastByteRcvd speed-matching service: matching the send rate to the receiving app’s drain rate Receiver advertises spare room by including value of “window sizes” in segments KUT
Sender Receiver t wndbytes rtt Window Advertisement Issues • Persist when AdvertisedWindow = 0 • send a segment with 1 byte of data every so often which triggers a response that contains the current advertised window (eventually nonzero) • Flow Control can limit Throughput • Let rtt be the round-trip time, i.e., the time from sending a segmentuntil an acknowledgement (ACK) is received • Let t = wnd/b be the time to transmit a full “window” of data, where b is link bandwidth • Throughput is wnd/rtt KUT
TCP Congestion Control • Congestion: • informally: “too many sources sending too much data too fast for network to handle” • different from flow control! • Resultants: • long delays (queueing in router buffers) • lost packets (buffer overflow at routers) KUT
TCP Congestion Control • Flow Control vs. Congestion Control Src Dest Limits amount ofdata that destinationmust buffer Src Dest Attempts to reducebuffer overflow insidethe network KUT
10 Mbps 1.5 Mbps 10 Mbps Congestion Collapse • If both sources send full speed, the router is completely overwhelmed • congestion collapse: senders lose data from congestion and they retransmit the data, causing more congestion (can be self-reinforcing) KUT
Basic Rule • Basic Rule • End-to-end congestion control • IP layer provides no explicit feedback regarding network congestion • There is no (or little) congestion TCP sender increases its send rate • There is congestion along the path TCP sender reduces its send rate KUT
Basic Rule • Window Size Determination • What does flow control do? • avoids overrunning the receiver • What does congestion control do? • avoid overrunning router buffers; avoid saturating the network • Congestion Window (=cwin) • It imposes a constraint on the rate at which a TCP sender can send traffic into the network • cwnd (congestion control window) • It is what the sender can handle • wnd (flow control window) • It is what the receiver can handle KUT
Basic Rule • Window Size Determination • What mechanism do weuse? • use both windows • [flow control] wnd (=AdvertisedWindow) • [congestion control] cwnd • actual window used is the MIN of wnd and cwnd Dynamic Window Size (version 1.0): Windows Size = min{cwin, wnd} KUT
TCP Congestion Principals • Underlying principle: packet conservation • at equilibrium, inject packet into network only when one is removed • basis for stability of physical systems • TCP components: • how to get there (equilibrium): slow start • how to stay there (equilibrium): congestion avoidance KUT
Slow Start • Initialize cwnd = 1 (MSS) • Upon receipt of every ACK, cwnd++ • TCP sender maintains three new variables: • cwnd – congestion window • It is determined by inferred information about the level of congestion in the network. • ssthresh – slow-start threshold • It can be thought of as an estimate of the level below which congestion is not expected • ssthresh is typically set to very large value on connection setup • Flight Size • No. of unacknowledgedsegments • Implications • Will overshoot window and cause packet loss • but remember, packet loss is part of the plan KUT
Slow Start algorithm time Slow Start • Slow Start • When connection begins, cwin = 1 MSS • Example: MSS = 500 bytes & RTT = 200 msec • initial rate(thrughput) = 20 kbps • available bandwidth may be >> MSS/RTT • desirable to quickly ramp up to respectable rate Host A Host B one segment RTT two segments Delayed & Cumulative Ack initialize: cwin = 1 for (each segment ACKed) cwin++ until (loss event || cwin >ssthresh) four segments Summary: initial rate is slow but ramps up exponentially fast Exponential increase (per RTT) in window size KUT
Slow Start Example [Jacobson88a] Van Jacobson. Congestion avoidance and control.In Proceedings of the SIGCOMM '88, pages 314-329, Stanford, California, August 1988. ACM. (redrawn from [Jacobson88a] Fig 2) one RTT 0R 1 one pkt time 1R 1 2 3 2R 2 3 4 6 5 7 4 5 6 7 3R 8 10 12 14 (This gives exponential growth of cwnd) 9 11 13 15 KUT
Slow Start Time-Sequence Plot Data (KB) Actually, the slow-start window increase isn’t that slow: time KUT
SSTHRESH SSTHRESH When “Slow Start” ends? Q: When should the exponential increase switch to linear? A: do end when cwnd > ssthreshand move to “Congestion Avoidance phase” KUT
SSTHRESH SSTHRESH At Loss Event (Timeout), what happen? Q: at Loss event, what happen? A:ssthresh is set to 1/2 of Flight Size • ssthresh = max {Flight Size/2, 2*MSS} • and cwin=1 KUT
Slow Start and Congestion Avoidance • State Transition • cwin instead set to 1 MSS; • window then grows exponentially • to ssthresh, then grows linearly • Congestion Avoidance • upon receiving a bunch of ACKs • Increase cwnd by 1/cwnd for each segment ACKed • This is additive increase • why not multiplicative increase? • growing too fast in equilibrium => oscillations Slow Start Congestion Avoidance SSTHRESH SSTHRESH KUT
Slow Start and Congestion Avoidance Slow Start: aggressively grow congestion window until congestion is detected Congestion Avoidance • Initially: • cwnd = 1*MSS (Maximum Segment Size) • ssthresh is very large. • If no loss: • cwnd++ (after each segment ACKed) (This gives exponential growth of cwnd) • If loss (timeout): • ssthresh = max{flight size/2, 2*MSS} (multiplicative decrease) • cwnd = 1*MSS • Timeout Interval = 2 * Timeout Interval • If no loss: • increase cwnd at most 1*MSS per RTT (a bunch of ACKs) (additive increase) • If loss (timeout): • ssthresh = max{flight size/2, 2*MSS} (multiplicative decrease) • cwnd = 1*MSS. • Timeout Interval = 2 * Timeout Interval KUT
Slow Start and Congestion Avoidance • Initally: • - cwnd = 1*MSS • - ssthresh = very high • If a new ACK comes: • - if cwnd < ssthresh update cwnd according to slow start • if cwnd ssthresh update cwnd according to congestion avoidance • If timeout (i.e. loss) : • - ssthresh = max{flight size/2, 2*MSS} ; • - cwnd = 1*MSS • - Timeout Interval = 2 * Timeout Interval (initial) ssthresh cwnd Loss, e.g. timeout ssthresh time slow start – in green congestion avoidance – in blue KUT
Problems So Far • have way to fill pipe (slow start) • have way to run at equilibrium (congestion avoidance) • but at packet loss (timeout) • cwin becomes one Too crude • ssthresh causes ultimately packet loss, every time Need to quickly recover from packet loss KUT
Fallback Mechanism: Timeout • Retransmission TimeOut (RTO) • if no ACK after RTO fires,reset cwnd=1 and resend lowest unACK’ed segmentand Timeout Interval = 2 * Timeout Interval • but they’re very crude • force slow-start again • Long TCP timeouts lead to idle periods • Retransmission is possible after such a LONG timeout. • are very slow—a long time with no traffic • …but is there more information? KUT
Could We Do Better? • Receipt of dupACKs tells the sender that the receiver is still getting new segments, i.e. there is still data flowing between sender and receiver • Why does sender go back to slow start always? KUT
Fast Retransmit & Fast Recovery • Fast Retransmit • allows and uses duplicate ACKs to trigger retransmission • sender doesn't wait for timeout, but retransmits the missing packet instantly • Reaction to 3 dup ACKs (before timeout) for Segment N • i.e. 4 identical ACKs without the arrival of any other intervening packets, • Retransmits the segment N without waiting for timeout • And move to Fast Recovery phase Fast Retransmit Philosophy: • 3 dup ACKs indicates network capable of delivering some segments • timeout indicates a “more alarming” congestion scenario KUT
Fast Retransmit & Fast Recovery • Fast Retransmit • a duplicate ACK implies the receiver gota packet out of order • an earlier packet might have been lost (or delayed) • TCP sender waits until it sees three duplicateACKs before retransmitting a packet KUT
Fast Retransmit & Fast Recovery • Fast Recovery • SSTHRESH is cut in half of cwnd • ssthresh = max {flight size/2, 2*MSS} • Set cwnd as follows: • cwnd = ssthresh + 3 • window then grows linearly • cwnd++ for each dup ack arrival • Additive increase for every subsequent dup ACK • Transmit a segment if permitted by cwnd • When a new ACK received • Exit Fast Recovery phase • Reset cwnd to ssthresh (resume congestion avoidance) • When Timeout occurs perform Slow-Start This artificially "inflates" the congestion window by the numberof dup segments (three) that have been sent and acked It will acknowledge receiving all segments sent till moving to Fast Recovery phase (assuming that no more segments were lost). in orderto reflect the additional segment that has been sent and which the receiver has buffered KUT
Fast Retransmit & Fast Recovery cwnd (initial) ssthresh fast-retransmit fast-retransmit new ACK timeout new ACK cwnd oscillates around the optimal window size ssthresh = flight size/2 Time Slow Start Congestion Avoidance roughly a 20% improvement in the throughput “inflating” cwnd with dupACKs “deflating” cwnd with a new ACK KUT
TCP Congestion Control - Summary • Congestion Control Summary • When cwin is below SSTHRESH, • sender in slow-start phase, window grows exponentially. • When cwin is above SSTHRESH, • sender is in congestion-avoidance phase, window grows linearly. • When a triple duplicate ACK occurs, • Immediately retransmit the packet named Fast Retransmit • ssthresh set to max {0.5 * flight size, 2*MSS} and cwin set to ssthresh+3. named Fast Recovery • When timeout occurs, • ssthresh set to cwin/2 and cwin is set to 1 MSS. “Fast” – because it doesn’t wait for time outwhen not getting an ACK for a segment KUT
TCP Congestion Control - Summary • Slow-Start • Additive-Increase, Multiplicative-Decrease (AIMD) • Approach: increase transmission rate until loss occurs • additive increase ( congestion avoidance phase) • increase cwin by 1 MSS every RTT until loss detected • continuously probing for usable bandwidth • multiplicative decrease ( Fast Retransmit + Recovery or Timeout) • cut cwin in half after loss (4020105) • Minimum cwin size = 1 MSS Saw tooth behavior: probing for bandwidth KUT