- Learn
- Computer Science & IT
- Computer Science
- Computer Networks
- Congestion Control
Congestion Control
IntermediateLesson 4 of 8 in Computer Networks Course
What you will learn
- Describe how traffic that exceeds a link's capacity builds queues, delay and loss, why that wastes the network's capacity, and the two broad ways a network can be kept out of congestion.
- Trace how a bottleneck queue turns load into delay and lossDefine congestion and the bottleneck link, and follow how a router's queue grows when traffic arrives faster than the link can send it.
- Explain the costs of congestion and congestion collapseShow how retransmissions, unneeded duplicates and packets dropped late on long paths waste capacity, and how uncontrolled senders can drive useful throughput toward zero.
- Compare end-to-end and network-assisted congestion controlClassify congestion control schemes by where the congestion signal comes from, which signals they use, and whether they control a window or a rate.
- Trace how a bottleneck queue turns load into delay and loss
- Follow how a TCP sender uses its congestion window to probe for bandwidth with slow start and congestion avoidance, backs off with fast retransmit, fast recovery and timeouts, and what throughput that behavior produces.
- Relate the congestion window to the sending rateUse the congestion window, the receive window and the round-trip time to work out how fast a TCP sender transmits and how much data a path needs in flight.
- Trace slow start and congestion avoidanceCalculate how cwnd grows in slow start and in congestion avoidance, and explain when the sender switches from one to the other.
- Explain how TCP reacts to loss: timeouts, fast retransmit and fast recoveryApply the rules TCP follows after a timeout or three duplicate acknowledgments, and trace how TCP Tahoe, Reno and NewReno differ.
- Estimate TCP throughput from its sawtoothUse the sawtooth model and the loss-rate formula to estimate the throughput of a long-lived TCP connection, and see why classic TCP struggles on fast, long paths.
- Relate the congestion window to the sending rate
- Explain why additive increase and multiplicative decrease drive competing flows toward equal shares, measure fairness, and recognize the real-world conditions under which shares become unequal.
- Show why AIMD converges to a fair and efficient shareUse the two-flow picture of Chiu and Jain to show how additive increase and multiplicative decrease bring two senders to equal shares of a link.
- Evaluate fairness among real flowsMeasure fairness with Jain's index and max-min fairness, and explain how RTT differences, parallel connections, unresponsive traffic and different algorithms change who gets what.
- Show why AIMD converges to a fair and efficient share
- Describe why full buffers create long delays, how active queue management drops or marks packets early, and how explicit congestion notification carries a congestion signal to the sender without losing packets.
- Explain bufferbloat and active queue managementExplain why large drop-tail buffers and loss-based senders produce standing queues, and how RED and CoDel keep queues short by acting early.
- Describe explicit congestion notification in IP and TCPFollow the ECN codepoints and TCP flags from router to receiver to sender, and explain how data-center TCP and L4S use frequent marks for very low delay.
- Explain bufferbloat and active queue management
- Explain how CUBIC grows its window as a function of time since the last loss, how delay-based and model-based algorithms such as Vegas and BBR avoid filling buffers, and the trade-offs between them.
- Explain how CUBIC grows its windowCalculate CUBIC's window from its cubic growth function, and explain its gentler decrease, its Reno-friendly mode and why its growth depends on time rather than RTT.
- Explain delay-based control and how BBR models the pathExplain how Vegas reads queueing from delay, how BBR estimates the bottleneck bandwidth and minimum RTT to pace at the right rate, and how CUBIC and BBR compare.
- Explain how CUBIC grows its window
- Explain why TCP is hard to change, how QUIC rebuilds a reliable, secure transport over UDP, and how QUIC detects loss and controls congestion.
- Explain why transports ossify and how QUIC's design respondsExplain how middleboxes and kernel implementations slow TCP's evolution, and how QUIC's streams, combined handshake, encryption and connection IDs address TCP's limits.
- Describe loss detection and congestion control in QUICExplain how QUIC's packet numbers and acknowledgments improve loss detection, and apply its default congestion controller's rules for the initial window, recovery, persistent congestion, ECN and pacing.
- Explain why transports ossify and how QUIC's design responds
Congestion Control study guide
1Why congestion slows useful delivery
A fast sender can still face a slow path. Several inputs may feed one output link, and their combined traffic has to share its capacity. Follow what happens to packets when that capacity runs out, then separate useful delivery from the traffic spent on repeats and eventual losses. The sender's challenge is to recognize overload soon enough to reduce it, using either its own observations or feedback from routers.
1.1 From a busy link to a growing queue
Congestion begins when traffic reaches part of a network faster than that part can carry it for a sustained period. Packets wait in a router's output buffer, called a queue. The bottleneck is the link with the least capacity available to this traffic along its path.
Follow the surplus
Suppose a router receives 12 Mbps for an output link that can send 10 Mbps. It cannot speed up the output to match the input. Each second leaves 2 megabits waiting, or 250,000 bytes after division by 8. Starting empty, a 1,000,000-byte buffer fills in:
A packet joining behind that much queued data waits for the link to transmit the data ahead of it:
Once the buffer stays full, the output still carries only 10 Mbps. About 2 Mbps of the 12 Mbps arriving is dropped, one sixth of the offered traffic. These calculations treat arrivals and departures as steady rates; packet-by-packet timing adds small variations.
Decide whether the queue will drain
A short burst is different from sustained overload. A queue can absorb a burst and drain when arrivals fall below the output rate. If steady arrivals exactly match the output rate, an existing queue persists: each departure is replaced by one arrival. Sustained arrivals above the output rate make the queue grow until the buffer fills.
Real traffic is uneven. Even below full average utilization, bursts make packets wait. Near capacity, there is little spare time to drain those bursts, so average delay rises sharply. Congestion mainly increases the queueing part of packet delay; processing, transmission, and propagation are separate components.
Name the rate you mean
| Rate | What it counts |
|---|---|
| Offered load | Traffic sent into the network, including retransmissions |
| Throughput | Packets or bytes delivered per second |
| Goodput | New useful application data delivered per second, counted once |
A speed mismatch can expose the bottleneck: a 1 Gbps local network may feed a 50 Mbps access link. Aggregation has the same effect when several router inputs share one output. A single input can look modest while their sum overloads that output.
Choose the right limit
Flow control protects the receiver's buffer using its advertised receive window. Congestion control protects the path between the endpoints. A receiver can have ample free memory while a router on the path drops packets.
A larger router buffer can hold a longer burst, but sustained overload fills any finite buffer and adds waiting time. A faster bottleneck link removes that capacity shortage. Another link then limits the path; it becomes congested only when traffic exceeds the capacity available there.
Key Takeaways
- Congestion grows queues when sustained arrivals exceed the available output rate.
- A queue drains below capacity and persists under steady arrivals exactly at capacity.
- Convert queued bytes to bits before dividing by the link rate to find waiting time.
- Goodput counts useful data once; offered load includes retransmissions.
- Flow control protects the receiver; congestion control protects the network path.
1.2 Why a busy network can deliver very little
A full link is useful only when its traffic helps deliver new data. Congestion consumes capacity in ways that can make useful delivery fall even while the network stays busy.
Count the costs
Queueing delay comes first. A video call can become hard to follow before any packets are dropped, because speech arrives too late. Reliability alone cannot repair that delay.
Lost packets create a second cost: a reliable sender retransmits them. If a 10 Mbps link carries equally sized packets and 20% repeat data already carried on that link, at most 8 Mbps carries new data:
Application goodput is lower after accounting for headers and any losses elsewhere. The link's activity therefore overstates the progress made by the application.
Some retransmissions are unnecessary. A packet can be waiting in a long queue when the sender's timer expires. Its replacement then enters the same busy network. Both copies may arrive, but the receiver keeps the data only once. Queueing has converted a delay problem into extra offered load.
Look upstream of a drop
A drop near the destination can waste work at several earlier links. Imagine a packet crossing links A and B before being dropped in the queue for C. The transmissions on A and B used capacity without delivering that packet. Repeating this pattern leaves less upstream capacity for traffic that could have reached its destination.
As offered load rises, throughput initially rises too. With enough downstream drops, however, increasing load sends more traffic into work that will be wasted. End-to-end throughput can peak and then fall. Congestion collapse is the extreme: offered load remains high while useful goodput falls toward zero.
In October 1986, throughput between Lawrence Berkeley Laboratory and UC Berkeley fell from 32 kbps to 40 bps, an 800-fold fall. Jacobson and Karels' 1988 work introduced a coordinated response: slow start, congestion avoidance, better round-trip-time estimation, and exponential timer backoff. Window control and sensible timers address different parts of the feedback loop.
Find the useful operating range
Raj Jain's knee and cliff describe two boundaries. Beyond the knee, added load brings little extra throughput but much more delay. Beyond the cliff, throughput falls as losses and wasted work dominate. Congestion control seeks efficient delivery near the knee while staying clear of collapse.
The Internet has no central controller assigning every sender a rate. Each sender must react to the feedback it sees. If one keeps transmitting at a fixed high rate while others back off, it can take their capacity and deepen the overload.
Retransmission makes a byte stream reliable, but it does not make loss free. Recovery consumes capacity and delays delivery of the missing data; waiting for a retransmission timer can stall the connection much longer than fast recovery does.
Key Takeaways
- Queueing delay can harm interactive traffic before packets are lost.
- Retransmissions and unnecessary duplicates consume capacity without adding new application data.
- A downstream drop wastes the upstream transmissions that carried the packet.
- Congestion collapse combines heavy network activity with very low useful delivery.
- The knee marks rising delay with little throughput gain; the cliff marks falling throughput.
- Every sender contributes to keeping offered load within what the path can support.
1.3 How senders learn when to slow down
A sender does not directly see every router queue on its path. Congestion control is a feedback process: observe delivery, decide what the observations mean, and adjust the amount or rate of traffic entering the network.
Locate the feedback source
In end-to-end control, endpoints infer congestion from loss or delay without an explicit router message. Reno uses loss. Vegas uses changes in round-trip time. BBR builds a path model from delivery-rate and RTT measurements.
In network-assisted control, a router supplies explicit feedback. ECN marks a forward-traveling packet, and the receiver reports the mark in its acknowledgment. Older ATM schemes could report an explicit allowed rate. A router can also send a message directly back to the sender, called a choke packet. The Internet's ICMP Source Quench used that approach and was deprecated in 2012.
Read signals carefully
| Signal | What it offers | What can mislead the sender |
|---|---|---|
| Loss | Evidence that packets did not arrive | Wireless corruption can cause loss without congestion |
| Rising RTT | An early warning of extra waiting | A route change can also raise RTT |
| Explicit marks | A router's congestion warning without losing marked data | The path and endpoints must support the mechanism |
With drop-tail queues, loss normally arrives after the buffer fills. Active queue management can drop or mark packets earlier. This changes when a signal arrives without changing the sender's need to respond.
Minimum observed RTT is useful because it approximates a path with little queueing. An RTT above that minimum suggests waiting, but an endpoint must interpret measurements over time. Neither one noisy sample nor every lost wireless packet identifies the cause with certainty.
Control a window or a rate
A window-based sender caps unacknowledged data in flight. As acknowledgments return, space opens for new data. A rate-based sender sets a target rate and usually uses pacing, spacing packets over time. The controls are linked:
For example, 100,000 bytes per 50 ms corresponds to 2,000,000 bytes/s, or 16 Mbps, when the window is the active limit. A rate-based controller can also use a window as an upper bound on outstanding data.
Balance several goals
Efficiency means keeping available bottleneck capacity busy. Fairness concerns how competing flows divide it. Low delay requires short queues; stability avoids large, repeated swings; responsiveness means adapting when capacity or competition changes. A rule that quickly fills a path can still be poor at keeping delay low or sharing with other algorithms.
TCP's controller usually runs in the operating system. QUIC's controller usually runs in an application library. UDP supplies no controller, so applications using it must provide congestion control themselves. The carrier protocol does not remove the obligation to respond to congestion.
Key Takeaways
- End-to-end controllers infer congestion; network-assisted controllers receive explicit router feedback.
- Loss, delay, and explicit marks have different timing and interpretation limits.
- Window control limits data in flight; pacing spaces packets at a chosen rate.
- Efficiency, fairness, delay, stability, and responsiveness must be judged together.
2How TCP grows and repairs its window
TCP controls how much unacknowledged data it leaves in the network. ACKs allow that amount to grow; loss makes it shrink. Track the window in segments to see the growth rules clearly, then convert to bytes and seconds to estimate a rate. Distinguishing a timeout from duplicate-ACK recovery explains the different drops in a window trace and reveals why classic TCP has trouble recovering on fast paths with long round trips.
2.1 The window, the round trip, and the path
The congestion window, cwnd, is a sender-side limit on unacknowledged data in flight. It is measured in bytes, though traces often count maximum-size segments. It is not a TCP header field. The receiver advertises a different limit, the receive window, rwnd.
Apply both limits
New transmissions must fit within both flow control and congestion control. The usable limit is:
If cwnd is 30,000 bytes and rwnd is 18,000 bytes, the receiver's limit governs. With 12,000 bytes still outstanding, the sender can send another 6,000 bytes. After a congestion-window reduction, existing data may exceed the new limit; the sender waits for acknowledgments before adding more.
The maximum segment size, MSS, counts application data, excluding headers. A 1,500-byte Ethernet MTU minus 20-byte IPv4 and 20-byte TCP headers leaves 1,460 bytes, with no options. Standards use SMSS for the sender's MSS.
Turn a window into a rate
A window-limited sender delivers roughly one window per RTT. For cwnd of 65,536 bytes and RTT of 50 ms:
Multiply by 8 to obtain about 10.5 Mbps. This estimate also needs enough application data, a receive window at least as large, and a path able to carry the resulting rate.
Fill the path without filling its queue
The bandwidth-delay product, BDP, is bottleneck bandwidth times the queue-free, minimum RTT. For 100 Mbps and 40 ms:
Dividing by 8 gives 500,000 bytes, about 342 segments of 1,460 bytes. One BDP in flight keeps this idealized bottleneck busy with no standing queue. Less data leaves idle capacity; excess data waits and raises measured RTT. Computing BDP from an already inflated RTT mistakes queued data for data the path needs.
ACK clocking helps maintain the pace. As packets leave the bottleneck, ACKs return and release space for replacements. In steady state, departures therefore help time new arrivals. This is the conservation-of-packets idea behind TCP's self-clocking behavior.
Set the starting point and threshold
RFC 5681's initial window ranges from two to four segments according to SMSS: four up to 1,095 bytes, three through 2,190 bytes, and two above that. RFC 6928 allows an initial window up to ten segments. A trace starting at one segment is a useful teaching trace, not a claim that all new connections start there.
ssthresh, the slow-start threshold, selects the growth mode. Below it, TCP uses slow start; above it, congestion avoidance. At equality RFC 5681 permits either. A high initial threshold lets a new sender discover capacity through slow start.
Key Takeaways
- cwnd is private sender state; rwnd is advertised by the receiver.
- New data must respect both windows after accounting for bytes already in flight.
- MSS counts application data, excluding IP and TCP headers.
- A window-limited rate is approximately the usable window divided by RTT.
- BDP uses the queue-free RTT; excess in-flight data builds a queue.
- ACK clocking ties new transmissions to delivery through the bottleneck.
- The initial window and ssthresh determine how a trace begins and grows.
2.2 Exponential growth, then one segment per round trip
TCP first has to discover how much traffic the path can carry. Slow start expands the window rapidly from a small starting point. Congestion avoidance then probes more cautiously once the slow-start threshold is reached.
Count acknowledgments in slow start
RFC 5681 increases cwnd by up to one SMSS for each acknowledgment of new data:
where N is the newly acknowledged byte count. With one ACK per full segment and enough data to fill each window, every segment sent makes room for two in the next round: one replacement and one from the increased window.
Starting at 1 MSS, the round-by-round values are 1, 2, 4, 8, 16, 32, and 64 MSS. Six RTTs reach 64 MSS. At 100 ms per RTT, that is 0.6 s. The name reflects a safer start than immediately sending a whole receive window; the growth itself is exponential.
Delayed ACKs change the count. If the receiver sends one ACK for every two full segments, the simple per-ACK rule gives roughly 1.5-fold growth per RTT. Appropriate Byte Counting, described in RFC 3465, uses newly acknowledged bytes to address the dependence on ACK frequency.
Switch growth modes
For a trace with initial cwnd of 1 MSS and ssthresh of 8 MSS, choose congestion avoidance at equality. The trace becomes:
The first three changes double the window. Later changes add one MSS per RTT. Loss can interrupt either phase. Implementations using HyStart++ (RFC 9406) can also leave slow start early when delay rises.
Explain additive increase
A common per-ACK rule during congestion avoidance is:
At 10 MSS, one ACK adds about 0.1 MSS. About ten ACKs arrive over the round, so the total increase is about one MSS. The per-ACK increment becomes smaller as cwnd grows, keeping the round-by-round increase roughly constant.
This difference matters on a large path. From 16 to 32 MSS takes one RTT in ideal slow start but sixteen RTTs in congestion avoidance. The slower growth reduces sudden overshoot once the sender has a useful estimate of capacity.
Recognize a restart
Slow start is not limited to the beginning of a connection. A retransmission timeout resets cwnd to one segment. An idle period longer than the retransmission timeout also requires a restart from no more than the initial window, because the earlier ACK clock and capacity estimate may no longer fit the path.
Congestion avoidance does not hold cwnd at a fixed safe value. It keeps adding capacity until congestion feedback arrives. On a drop-tail path, this continued probing tends to build a standing queue before loss signals the sender to back off.
Key Takeaways
- With one ACK per segment, ideal slow start doubles cwnd each RTT.
- Delayed ACKs slow the simple per-ACK growth rule.
- Congestion avoidance adds about one MSS per RTT, not per ACK.
- ssthresh separates growth modes; a trace must choose a convention at equality.
- Timeouts and long idle periods can require a new slow start.
2.3 Different losses produce different recovery traces
TCP can infer a missing segment from a timer or from duplicate acknowledgments. The distinction matters: a timeout gives less evidence that the network is still delivering traffic than three duplicate ACKs do.
Set the new threshold
Reno uses the amount actually outstanding, FlightSize, to set:
FlightSize is often close to cwnd during a fully active transfer, but they need not be equal when the application sends little data. The lower bound prevents the threshold from falling below two segments.
After a timeout, the sender retransmits, sets cwnd to one SMSS, and restarts slow start. Repeated timeouts for the same data double the retransmission timer. This exponential backoff prevents persistent failure from producing an equally persistent stream of retries.
Recover before the timer expires
Three duplicate ACKs show that three later segments arrived beyond a gap. They do not mean three segments were lost. One or two duplicates can arise from reordering, so TCP waits for the third before fast retransmit sends the missing segment.
Reno then enters fast recovery. Suppose FlightSize is 12 MSS. The new threshold is 6 MSS, and Reno temporarily sets:
The three extra segments account for packets evidenced as having left the network. Each further duplicate ACK inflates cwnd by one MSS, allowing continued sending when the window permits. When an ACK advances the cumulative acknowledgment, Reno deflates cwnd to 6 MSS and resumes congestion avoidance.
| Event with 12 MSS outstanding | Tahoe | Reno |
|---|---|---|
| Timeout | cwnd becomes 1 MSS | cwnd becomes 1 MSS |
| Third duplicate ACK | Retransmit and restart at 1 MSS | Retransmit and enter recovery at 9 MSS |
| Successful recovery | Grow through slow start | Deflate to 6 MSS, then grow additively |
With an initial window of 1 MSS and ssthresh of 8 MSS, cwnd grows 1, 2, 4, 8, 9, 10, 11, 12 MSS before the loss. Reno eventually continues at 6, 7, 8, 9. Tahoe restarts at 1, 2, 4, reaches the new threshold of 6, then continues 7, 8.
Repair several holes in one window
Classic Reno exits recovery at the first ACK of new data. If that ACK covers only part of the original flight, another gap remains. Reno can reduce again or time out.
NewReno (RFC 6582) stays in recovery on such a partial ACK and retransmits the next missing segment. It leaves when all data outstanding at recovery entry is acknowledged. SACK reports received blocks explicitly; SACK-based recovery can identify and repair several holes within a round trip.
One congestion episode should normally cause one reduction, even if several packets are lost. NewReno and SACK-based recovery handle this more reliably than classic Reno. CUBIC uses a different reduction factor for ordinary congestion signals, keeping 70%, but also restarts at one segment after a timeout.
Key Takeaways
- Reno sets ssthresh from FlightSize, with a minimum of two SMSS.
- A timeout resets cwnd to one SMSS and repeated timeouts back off the timer.
- Three duplicate ACKs trigger fast retransmit; they indicate later arrivals beyond a gap.
- Reno inflates cwnd during fast recovery and deflates it to ssthresh on exit.
- NewReno stays in recovery through partial ACKs to repair multiple losses.
- SACK reports received blocks so the sender can locate more than one hole.
- Tahoe restarts slow start after duplicate-ACK loss; Reno normally continues additively after recovery.
- Congestion-window reductions belong to congestion episodes, not to every individual lost packet.
2.4 Estimate the rate of a long-lived transfer
Classic Reno repeatedly increases its window and cuts it after congestion. The resulting sawtooth gives a useful steady-state estimate when RTT is roughly constant, fast retransmit detects losses, and timeouts and slow start are absent.
Average the window
Let the peak window be W segments. A halving produces a range from W/2 to W, whose average is 0.75 W. Multiply by MSS to obtain bytes per round trip, then divide by RTT:
For W of 24 segments, MSS of 1,460 bytes, and RTT of 80 ms, the peak rate is 3.504 Mbps. The average is about 2.63 Mbps. Remember that a window in segments needs a segment-size factor; a window already in bytes does not.
Connect throughput to loss
The Mathis approximation expresses the same Reno-like behavior using the loss fraction L:
If MSS is in bytes and RTT in seconds, T is bytes/s. With MSS of 1,460 bytes, RTT of 0.1 s, and loss fraction 0.0001, the denominator is 0.001 s. The result is 1,781,200 bytes/s, about 14.25 Mbps after multiplying by 8.
At a fixed loss fraction, doubling RTT halves throughput. At fixed RTT, doubling throughput requires loss to fall to one quarter, because the denominator contains the square root of loss. A loss fraction of 0.0001 means 0.01%, not 0.0001%.
See the high-speed problem
A 10 Gbps path with a 100 ms queue-free RTT needs 1 billion bits, or 125,000,000 bytes, in flight to fill it. Using 1,500-byte segments gives about 83,333 segments. Halving that window leaves about 41,667 segments to regain. Reno adds one per RTT, so regaining them takes about 4,167 s, nearly 70 minutes.
That 83,333-segment value is the window needed to send at 10 Gbps at one instant. A Reno sawtooth averaging 10 Gbps would need a higher peak because its average window is only three quarters of its peak. The loss-rate formula estimates that sustaining a 10 Gbps average with this MSS and RTT requires loss around one segment in 4.7 billion.
Check other limits
A controller cannot deliver faster than the bottleneck, and a small receive window can bind before cwnd does. Use the smallest applicable limit. Timeouts reduce the rate below the simple model, and a short object may finish entirely in slow start. Its completion time depends strongly on startup rounds and the initial window, so the long-lived formula is a poor description of that transfer.
A faster access link therefore helps only when it removes an active limit. Long RTT, loss, or a small window can leave a single connection far below the upgraded link's capacity.
Key Takeaways
- A Reno sawtooth from W/2 to W has an average window of about 0.75 W.
- The Mathis model gives throughput proportional to 1/RTT and 1/√L.
- Keep segments, bytes, bits, and seconds consistent when calculating rates.
- Large BDP paths make Reno recovery slow because growth is only one segment per RTT.
- Bottleneck capacity and the receive window remain independent upper limits.
- Short transfers and timeout-heavy connections need more than a steady-state model.
3How flows divide a shared link
Keeping a link busy and sharing it fairly are separate goals. Two flows can use every bit of capacity while one takes almost all of it. Follow how equal additive increases and proportional decreases change their rates, then test what happens when their conditions differ. Fairness measures help describe the outcome, but interpreting a measure also requires knowing who the flows represent and how much traffic each one needs.
3.1 Why AIMD moves flows toward equal shares
If K active flows all want more capacity than a bottleneck can give them, an equal per-flow share is R/K, where R is the available rate. Efficiency asks whether their rates add to R. Fairness asks how evenly they divide it.
Put two rates on a diagram
In a Chiu–Jain diagram, the horizontal and vertical coordinates are the two flow rates. The efficiency line is:
The fairness line is the diagonal where the rates are equal. Their intersection is the fair, fully used allocation. On a 10 Mbps link it is 5 Mbps per flow. Points below the efficiency line leave capacity unused; points above it offer more traffic than the link can carry.
Separate the two updates
Additive increase adds the same amount to each rate. Starting from 8 and 1 Mbps, adding 0.5 Mbps to each gives 8.5 and 1.5 Mbps. The difference remains 7 Mbps, but the smaller flow gains more relative to its starting rate. On the diagram the point moves parallel to the equality diagonal.
Multiplicative decrease multiplies both rates by the same factor. Halving 9 and 2 Mbps produces 4.5 and 1 Mbps. Their ratio is unchanged, while the absolute difference falls from 7 to 3.5 Mbps. The point moves toward the origin and quickly removes overload.
These are different meanings of improvement: equal addition improves the relative balance; proportional reduction shrinks the absolute gap. Repeating the two prevents the gap from growing back while capacity is probed again.
Trace several cycles
Start at 8 and 1 Mbps on the 10 Mbps link. Add 0.5 Mbps per flow per step and reduce only after the total exceeds capacity. After two increases the rates are 9 and 2, totaling 11. Halving gives 4.5 and 1.
Five more increases reach 7 and 3.5, totaling 10.5. Halving gives 3.5 and 1.75. The gaps have been 7, 3.5, and 1.75 Mbps. Another synchronized halving makes the next gap 0.875 Mbps. The flows approach equal shares while their total continues to oscillate around available capacity.
Compare other update rules
| Rule | What happens to unequal rates |
|---|---|
| Additive increase, additive decrease | Equal additions and subtractions preserve the absolute gap |
| Multiplicative increase, multiplicative decrease | Equal proportional changes preserve the rate ratio |
| Multiplicative increase, additive decrease | Growth favors the larger flow and balance can worsen |
| Additive increase, multiplicative decrease | Repeated cycles approach equal shares and efficient use |
This convergence assumes equal RTTs, synchronized congestion feedback, matching responses, and flows that stay active long enough. Reno's additive step is about one MSS per RTT and its decrease factor is one half. Other positive additive steps and decrease factors between zero and one give the same basic convergence argument. Real flows need not meet all its assumptions, so an instantaneous unequal pair does not by itself show failure of AIMD.
Key Takeaways
- Efficiency concerns the sum of rates; fairness concerns their division.
- Equal additive increases preserve the absolute gap while improving relative balance.
- Equal multiplicative decreases preserve the ratio while shrinking the absolute gap.
- Repeated AIMD cycles converge under matched RTTs, feedback, and responses.
- Fairness describes long-run sharing while the rates continue to oscillate.
3.2 Measure sharing and explain unequal outcomes
Equal shares are a useful reference, but real flows can differ in demand, RTT, number of connections, and congestion controller. A fairness claim needs a clear answer to “fair between which flows?”
Calculate Jain's index
For nonnegative flow rates with a nonzero total, Jain's index is:
Rates of 8 and 2 Mbps give a sum of 10 and a sum of squares of 68, so the index is about 0.735. Equal rates give 1. If one of n flows receives everything, the index is 1/n.
The index measures equality, not utilization. Two flows at 1 Mbps each and two at 5 Mbps each both have an index of 1, even though they use different amounts of a 10 Mbps link. Check the total rate separately.
Account for limited demand
Max-min fairness gives low-demand flows what they need, then shares the remaining capacity among flows still seeking more. On a 12 Mbps link, three flows want 2, 8, and 10 Mbps. The initial equal share is 4 Mbps. The first needs only 2, leaving 10 Mbps for the other two. The allocation is therefore 2, 5, and 5 Mbps.
Increasing one of the larger rates would require reducing a flow already at an equal or smaller rate. That property defines max-min fairness. Its unequal allocation can be appropriate even though Jain's equality measure falls below 1.
Identify advantages between flows
Reno grows once per RTT. At the same loss fraction, its approximate throughput is inversely proportional to RTT: a 20 ms flow can achieve about four times the rate of an 80 ms flow. Equal bottleneck access does not erase that timing advantage.
Sharing is also per connection. With nine existing connections, an application adding one might receive about one tenth of the link. If it instead adds eleven comparable connections, its share becomes eleven twentieths, or 55%. HTTP/2 and HTTP/3 multiplex many requests over a connection, while HTTP/1.1 clients often open several connections.
A fixed-rate UDP application may keep sending while TCP flows back off. UDP itself supplies no controller; RFC 8085 calls for applications to add suitable congestion control. A TCP-friendly flow uses no more bandwidth than comparable TCP traffic under the same conditions. TFRC uses the TCP throughput equation to support a smoother rate.
Consider the queue and the algorithm
A FIFO queue does not enforce equal flow shares. Its outcome depends on sender behavior. Fair queuing, including the per-flow scheduling in FQ-CoDel, gives flows separate queues and service opportunities.
CUBIC's growth and Reno's growth differ on large-BDP paths. BBR's sharing with CUBIC also depends on version and buffer depth; early BBR could be aggressive with shallow buffers. No single equality calculation establishes that different controllers will coexist evenly on every path.
Key Takeaways
- Jain's index measures equality; check utilization independently.
- Max-min fairness satisfies small demands before dividing the remaining capacity.
- Shorter RTTs and more parallel connections can increase a sender’s share.
- UDP applications need their own congestion control; TCP-friendly traffic limits comparable bandwidth use.
- FIFO queues leave sharing to senders, while fair queuing provides per-flow service.
- Algorithm versions and buffer depth can change coexistence between flows.
4How routers give earlier congestion warnings
A large buffer can hide packet loss while making an interactive connection painfully slow. Routers can shorten that wait by responding to a persistent queue before it overflows. Follow the difference between queue-length and delay-based detection, then trace an ECN mark from a router to the sender. The same marking idea supports different sender responses in classic TCP, controlled data centers, and low-latency Internet designs.
4.1 Keep useful buffering without a standing queue
A drop-tail queue accepts packets until its buffer is full, then drops new arrivals. Loss-based senders keep probing upward until they receive a congestion signal. With a large drop-tail buffer, that signal can arrive only after a long queue has formed.
Calculate the delay hidden in a buffer
A 2,000,000-byte buffer ahead of a 20 Mbps uplink holds 16 million bits. If it is full, a packet behind that data waits:
An upload can therefore keep throughput high while adding almost a second to a call sharing the uplink. Bufferbloat means persistent excess delay caused by large buffers and the traffic behavior that keeps them occupied.
Buffering still has a purpose: short bursts need somewhere to wait. In the simple single-Reno-flow model, about one BDP of buffering can keep the link busy immediately after a window halving. Making the buffer far larger adds waiting without increasing the link's transmission rate.
Signal congestion before overflow
Active queue management, AQM, drops or marks packets early to signal that senders should reduce their load. A physical overflow is no longer the only way to announce congestion. RFC 7567 recommends widespread AQM deployment.
Random Early Detection, RED, watches a moving average of queue length. Below a minimum threshold it does not signal. Between two thresholds, it drops or marks with an increasing probability. Above the maximum threshold, it signals on every arrival. Averaging prevents a single short burst from looking like persistent overload, but choosing thresholds that work across different speeds and loads is difficult.
Measure waiting time directly
CoDel, Controlled Delay, measures a packet's sojourn time: its time inside the queue. Its standard target is 5 ms and its interval is 100 ms. If even the minimum observed sojourn time stays above target for an interval, a standing queue exists. CoDel then drops or ECN-marks packets, increasing the signaling frequency while the excess delay persists.
The minimum over an interval matters. A burst may produce high delay briefly yet drain soon afterward; a queue whose delay never gets small needs intervention. CoDel's delay measurement lets its defaults work across a wide range of link rates.
| Mechanism | What it watches | When it signals |
|---|---|---|
| Drop-tail | Whether the buffer is full | At overflow |
| RED | Average queue length | Probabilistically as thresholds are crossed |
| CoDel | Persistent packet waiting time | When delay stays above target |
FQ-CoDel combines separate flow queues with CoDel. The flow separation helps a large transfer avoid placing every small interactive packet behind its backlog.
Early signals can also reduce global synchronization, where many flows lose packets together, halve together, and leave the link temporarily underused. Randomized early signals spread reactions across time. With ECN-capable traffic, an AQM can send its warning through a mark while still delivering the packet.
Key Takeaways
- Bufferbloat is persistent queueing delay, even when throughput stays high.
- Queueing time is queued bits divided by the output rate.
- AQM signals congestion before physical buffer overflow.
- RED tracks average queue length; CoDel tracks persistent waiting time.
- FQ-CoDel combines per-flow queues with CoDel delay control.
- Early, distributed signals reduce synchronized losses and window reductions.
4.2 Follow an ECN warning back to the sender
Explicit congestion notification, ECN, lets a router deliver a packet and warn that congestion is developing. The mark changes the sender's behavior without creating missing data that must be retransmitted.
Read the IP codepoint
The ECN field is two bits in the IPv4 Type of Service byte or IPv6 Traffic Class.
| Bits | Meaning |
|---|---|
| 00 | Not-ECT: the transport has not declared ECN capability |
| 10 | ECT(0): ECN-capable transport |
| 01 | ECT(1): ECN-capable transport; also the L4S identifier |
| 11 | CE: congestion experienced |
In the classic RFC 3168 TCP handshake, the client's SYN sets ECE and CWR. An accepting server's SYN-ACK sets ECE. After negotiation, classic TCP marks data packets ECT(0).
Trace the feedback loop
An AQM that would drop an ECN-capable packet as a congestion warning can change its codepoint to CE and forward it. A Not-ECT packet cannot carry that warning and is dropped when the AQM needs to signal. A completely full buffer still drops packets, including ECN-capable ones.
The receiver echoes CE by setting ECE, ECN-Echo, in its ACKs. It continues until it receives CWR, Congestion Window Reduced, from the sender. These flags report and acknowledge the feedback; their presence does not mean data was lost.
For classic Reno-style ECN, start with cwnd of 20 MSS. After ECE arrives, the sender reduces cwnd to 10 MSS and puts CWR on its next new data segment. The receiver stops echoing once CWR arrives. Repeated echoes from the same window do not require repeated halvings. The warning returns on the acknowledgment path, so the response is subject to feedback delay.
ECN specifies the signal; the congestion algorithm supplies the reduction rule. Reno halves, while CUBIC normally retains 70% on an ECN event. Both endpoints and a marking bottleneck must support ECN for this loop to work.
Use the fraction of marks
DCTCP, Data Center TCP, uses frequent marks in a controlled environment. It estimates the marked-byte fraction with a smoothed value alpha:
where M is the recently marked fraction. Some implementations use g of 1/16. It reduces the window using:
With alpha of 0.2, a window of 100 becomes 90; with alpha of 1 it halves. DCTCP needs compatible marking and feedback. Mixing it with classic TCP in one ordinary queue can produce unfair shares.
L4S, the experimental architecture in RFCs 9330–9332, carries a related scalable response onto Internet paths. ECT(1) identifies scalable traffic, and a dual-queue coupled AQM separates it from classic traffic while coordinating their treatment. Frequent shallow marks aim for queueing delay around a millisecond. ECT(1) alone is not a guarantee of that delay: the controller and bottleneck behavior complete the design.
Key Takeaways
- CE marks a delivered packet; ECN-capable traffic can still be dropped at overflow.
- Classic TCP negotiates ECN, echoes CE through ECE, and acknowledges its response with CWR.
- The controller chooses how much to reduce; ECN supplies the congestion signal.
- DCTCP uses the marked fraction to scale its reduction in controlled environments.
- L4S combines ECT(1), scalable congestion control, and coupled queue management.
5How CUBIC and BBR adapt to modern paths
A path with a large bandwidth-delay product needs a large amount of data in flight. Reno can take too long to recover that window after a reduction. CUBIC changes how the window grows over time, while BBR estimates the path's delivery rate and queue-free RTT. Compare what each algorithm measures, how it probes for capacity, and what its behavior means for delay and sharing with other traffic.
5.1 Use time to grow the CUBIC window
CUBIC addresses Reno's slow growth on fast, long-distance paths. Its window follows elapsed time since a congestion reduction, giving it a different response from a fixed one-segment increase every RTT. RFC 9438 specifies CUBIC; it is the default in major Linux, Windows, and Apple TCP stacks.
Remember the last congestion point
At an ordinary loss or ECN congestion event, CUBIC records its window as Wmax. With a fully used window, its decrease factor of 0.7 retains 70% of the flight size. Reno would retain half. A retransmission timeout is different: CUBIC follows Reno back to a one-segment window and slow start, while setting its threshold with CUBIC's decrease factor.
For the basic cubic epoch after a reduction, the target window in segments is:
Time t is in seconds. When the reduced window is 0.7 Wmax, the return time to the old peak is:
Work through the curve
With Wmax of 100 segments, the reduced window is 70. The value inside the cube root is 75, so K is about 4.22 s. At one second, the curve is about 86.7 segments; at two seconds it is 95.6; at three seconds it is 99.3. It reaches 100 at K.
Below the old peak, growth is initially fast and then slows. This concave region cautiously approaches a point where congestion previously occurred. Near the peak is a relatively flat plateau. Above it, the convex region accelerates to probe for capacity that may now be available. At seven seconds the example curve reaches about 108.6 segments.
Explain the RTT advantage and its limit
Reno needs 50 RTTs to climb from 50 back to 100 segments: 5 s with a 100 ms RTT and 10 s with a 200 ms RTT. The cubic curve's return time depends on the recorded peak and elapsed time, so its 4.22 s return does not depend directly on the ACK count.
CUBIC also computes a Reno-friendly estimate. It uses an equivalent AIMD increase of about 0.53 segments per RTT with a decrease factor of 0.7, taking this estimate when it exceeds the cubic target. Short-RTT paths can therefore recover sooner than the pure cubic return time. Time-based growth reduces a major source of RTT bias; it does not make every real allocation RTT-independent.
Adjust the remembered peak
If congestion recurs below the previous peak, CUBIC's fast convergence lowers the remembered Wmax. A new event at 90 segments after a previous peak of 100 gives:
The immediate reduced window is 63 segments. The remembered peak and the new current window have different jobs: one shapes future growth, while the other limits current sending.
CUBIC remains loss-based, with ECN as an alternative signal. It can build a standing queue on a drop-tail path. Faster recovery and a gentler ordinary reduction improve use of large-BDP paths, but neither by itself guarantees low queueing delay.
Key Takeaways
- CUBIC normally retains 70% after a loss or ECN event, but restarts at one segment after a timeout.
- The cubic target depends on elapsed seconds and the remembered congestion window.
- Growth slows near the old peak, then accelerates above it.
- The Reno-friendly estimate can exceed the cubic curve, especially at short RTTs.
- Fast convergence lowers the remembered peak when congestion recurs below it.
- CUBIC is still a loss-based controller and can build standing queues.
5.2 Estimate the path with delay and delivery measurements
Loss is not the only sign of a crowded path. Delay can reveal queued data, while delivery measurements can estimate how much bandwidth the path supplies. Vegas and BBR use these observations in different ways.
Estimate Vegas's queued data
Vegas compares an expected rate based on the minimum, base RTT with the actual rate based on the measured RTT. Their difference, multiplied by base RTT, estimates the flow's queued data.
With cwnd of 50 segments, base RTT of 40 ms, and measured RTT of 50 ms, expected delivery is 1,250 segments/s and actual delivery is 1,000 segments/s. The queue estimate is:
Vegas grows below a lower threshold and shrinks above an upper threshold. If loss-based traffic keeps filling their shared queue, Vegas repeatedly sees delay and backs off, which can leave it a small share.
Build BBR's two-part model
BBR, Bottleneck Bandwidth and Round-trip propagation time, estimates bottleneck bandwidth from recent maximum delivery rates and minimum RTT over a 10 s filter. Their product estimates BDP. Its ideal target is a full link with roughly one BDP in flight and little queued data.
A 50 Mbps bandwidth estimate and 30 ms minimum RTT give 1.5 million bits, or 187,500 bytes, per BDP. A typical congestion-window gain of 2 caps outstanding data around 375,000 bytes. The pacing rate is a separate control: pacing gain times estimated bandwidth. A cap permits data in flight; it does not require the sender to send at twice the bandwidth.
Follow BBR version 3's states
| State | Main job | Draft version 3 behavior |
|---|---|---|
| Startup | Discover capacity | Pace at about 2.77 times the estimate; exit when growth stalls or loss is high |
| Drain | Remove startup queue | Pace at about 0.5 times the estimate |
| ProbeBW | Test and use bandwidth | Up 1.25, Down 0.9, Cruise 1.0, Refill 1.0 pacing gains |
| ProbeRTT | Refresh minimum RTT | Reduce in-flight data toward half a BDP for at least 200 ms and one round trip |
Startup's growth test is less than 25% delivery-rate growth for three rounds. ProbeRTT is scheduled no more often than about every 5 s. On the example path, ProbeBW Up targets 62.5 Mbps and Down 45 Mbps. These version 3 details are specified in the BBR Internet-Draft, not in a published BBR RFC.
Compare feedback and trade-offs
Reno and CUBIC increase until loss or ECN signals congestion. BBR paces from a bandwidth-and-RTT model. It deliberately queues briefly in Startup and ProbeBW Up, so “model-based” does not mean “never builds a queue.”
BBR version 1 largely ignored loss. Version 3 uses heavy loss, around 2% in a round, to constrain overshoot and improve coexistence. It can sustain more throughput on randomly lossy long paths, but cannot perfectly identify why a packet was lost. Its specific ECN response remains open in the draft; any connection declaring ECN support must respond to CE as congestion. Buffer depth, RTT, version, and competing algorithms still matter to fairness.
Key Takeaways
- Vegas infers queued data from expected and actual rates using base RTT.
- BBR models bandwidth and minimum RTT, then controls pacing and in-flight limits separately.
- BBR Startup and ProbeBW intentionally probe above the estimated delivery rate.
- Drain and ProbeRTT reduce queued data for different measurement purposes.
- BBR version 3 constrains heavy loss; it does not ignore congestion.
- BBR is model-based, while Vegas responds directly to delay growth.
- Algorithm version and path conditions affect coexistence and queueing.
6Why QUIC can evolve while sharing the network
Transport design has to work through equipment that is already deployed. TCP extensions can be delayed by middleboxes and operating system update cycles. QUIC carries an encrypted transport over UDP so applications can deploy new behavior more readily. Follow how streams, packet numbers, and richer acknowledgments improve delivery and recovery, while the sender still follows congestion control principles familiar from TCP.
6.1 Move transport features into an encrypted UDP-based design
A protocol ossifies when deployed devices depend on its existing form so strongly that changes become hard to deploy. Middleboxes inspect TCP headers and may reject unfamiliar options or flags. Kernel-based implementations also spread new behavior through operating system updates, often slowly.
Identify the costs QUIC addresses
TCP has evolved through SACK, ECN, window scaling, and new congestion controllers. Yet its structure still matters for web traffic. A conventional new TCP-plus-TLS connection needs the TCP handshake before its TLS handshake. Its single ordered byte stream also means one missing segment blocks delivery of later bytes, including data for unrelated requests. This is transport head-of-line blocking.
A connection's addresses and ports can create another obstacle when a device moves between networks. QUIC, standardized in RFC 9000, changes these parts of transport design while carrying its packets over UDP. HTTP/3 runs over QUIC.
Combine the handshakes
QUIC integrates TLS 1.3 with its transport handshake. In a simple exchange with 80 ms RTT, negligible processing, and no loss, a new TCP-plus-TLS 1.3 connection sends the request after two RTTs and receives the first response bytes after three: 240 ms. A new QUIC connection can receive them after two RTTs: 160 ms.
A resumed QUIC connection may send early application data in its first flight, called 0-RTT. The first response can then arrive after one RTT, 80 ms in this example. Early data can be replayed, so applications restrict it to actions safe to repeat. The term 0-RTT describes when sending can begin, not an instantaneous response.
Separate streams, not all shared limits
QUIC carries independent ordered byte streams. If a packet contains data for image 1, losing it does not block delivery of already received data for images 2 and 3 in separate streams. A packet carrying several streams can affect each one it carried. All streams still share the connection's congestion controller, so loss can reduce their total available rate.
QUIC provides reliable stream delivery on top of UDP. It also provides flow control both per stream and per connection. UDP is the carrier, not a substitute for these transport functions.
Protect changeable details
QUIC encrypts packet payloads, including all transport frames. Header protection covers packet numbers and some first-byte bits. Fields needed for routing and negotiation, such as connection IDs and the version, remain visible. Hiding changeable transport details gives middleboxes less behavior to depend on.
Connection IDs identify a connection independently of the current IP addresses and ports. With path validation, a connection can migrate as a phone moves from Wi-Fi to cellular access, without starting a completely new connection.
QUIC is usually a user-space library. An application update can therefore ship a transport improvement without waiting for every operating system kernel to change. That flexibility also gives the application responsibility for correct loss detection, security, flow control, and congestion control.
Key Takeaways
- Ossification occurs when deployed equipment makes protocol changes difficult.
- QUIC combines transport and TLS setup and can support replay-sensitive 0-RTT early data.
- Independent streams avoid transport-wide ordered-delivery stalls across unrelated streams.
- Payload encryption and header protection hide most changeable transport details.
- Connection IDs support migration beyond a fixed address-and-port tuple.
- QUIC adds reliability, flow control, and congestion control above UDP.
6.2 Use clearer loss signals with familiar congestion control
QUIC improves what a sender can learn from acknowledgments, but still has to avoid overloading the path. RFC 9002 defines loss detection and a default NewReno-like controller. Implementations can use other suitable algorithms, including CUBIC or BBR.
Identify each transmission
Packet numbers increase and never repeat within a packet number space. Resent data travels in frames inside a new packet with a new number. An ACK can therefore identify the transmission that arrived, avoiding TCP's ambiguity between an original segment and its retransmission.
ACK frames report received ranges and the receiver's ACK delay. After the handshake, the sender uses validated, bounded ACK delay when adjusting RTT estimates; it does not blindly subtract arbitrary receiver delay from every sample.
QUIC declares a packet lost when a packet at least three packet numbers later has been acknowledged, or through its time threshold once a later packet is acknowledged. The recommended time threshold is 9/8 of the larger of the latest and smoothed RTT. A probe timeout, PTO, sends acknowledgment-eliciting probes. PTO expiration alone does not collapse cwnd.
Set byte-based window limits
For maximum datagram size d, RFC 9002's initial window is:
With d of 1,200 bytes, the result is 12,000 bytes. With d of 1,500 bytes, it is 14,720 bytes. The minimum congestion window is two maximum-size datagrams, so those paths have minima of 2,400 and 3,000 bytes respectively.
In the default controller, a loss or new CE congestion signal halves cwnd, bounded below by the minimum, and sets ssthresh to the reduced window. A recovery period prevents another reduction for further losses of packets sent before recovery began. An acknowledgment of a packet sent during recovery ends the period. The sender then resumes normal growth.
Recognize sustained failure
Persistent congestion is stronger evidence than one timer expiration. It requires a sufficiently long run of lost acknowledgment-eliciting packets, with no intervening packet acknowledged and a prior RTT sample. Its duration threshold is:
With 100 ms smoothed RTT, 10 ms variation, 25 ms maximum ACK delay, and negligible timer granularity, the threshold is 495 ms. The qualifying loss interval must exceed that value. The controller then drops cwnd to two datagrams, its minimum window.
Keep feedback and timing useful
QUIC ACKs can report cumulative ECT(0), ECT(1), and CE counts. After validating ECN operation on the path, the sender treats a new CE increase as a congestion event without needing packet loss.
Pacing spreads transmissions. A rate around 1.25 times cwnd divided by smoothed RTT is one suggested approach; burst limits can serve the same purpose. Sending a whole window at once creates a burst even when the average rate is acceptable. User-space deployment makes new controllers easier to ship, but each stack must still share bandwidth responsibly.
Key Takeaways
- Unique packet numbers identify transmissions; received ranges locate gaps.
- ACK delay adjustment follows validation and handshake rules.
- Packet and time thresholds detect loss; PTO probes for feedback.
- The default controller halves once per recovery episode and respects a two-datagram minimum.
- Persistent congestion requires a qualifying loss interval longer than its duration threshold.
- Validated ECN counts can signal congestion without a drop.
- Pacing or burst limits avoid sending the full window in one burst.
Congestion Control examples
1Follow traffic through a bottleneck
13 steps
- 1IntroductionA link can stay busy while an application waits
Several fast inputs feed one slower output, a bottleneck. The router has to hold the surplus, so the same flow can experience high throughput and a long wait.
Follow the queue first, then account for work that fails to deliver new data (goodput and congestion collapse). Finally, decide what kind of feedback could tell the sender to change its behavior. These three views explain why activity alone is a poor measure of network health.
- 2ExplanationCompare arrivals with departures
The bottleneck is the link with the least capacity available to the traffic on its path. When sustained arrivals exceed its output rate, the surplus accumulates in the output queue.
Below the output rate, spare capacity drains the queue. Exactly matching it leaves an existing queue unchanged under steady rates: each departure is replaced by one arrival. Brief overload can be absorbed if a quieter period follows.
- 3ExampleFind how quickly the queue grows
An empty router buffer receives 15 Mbps while its output sends 11 Mbps. First find the surplus:
Convert the surplus to bytes per second:
This is the rate at which waiting data accumulates. Using the full arrival rate would count data the output link has already transmitted.
- 4ExampleTurn queued data into waiting time
Keep the same 11 Mbps output. A 1,000,000-byte buffer fills after 2 s of the 500,000-byte/s surplus.
When full, it holds 8,000,000 bits ahead of a newly joining packet. Its approximate wait is:
The output rate determines how long already queued data takes to leave. The input surplus determines how quickly that backlog formed.
- 5ChallengePredict a queue after the load falls
A queue holds 300,000 bytes. Its output is 12 Mbps, and steady arrivals fall to 8 Mbps. How long will the existing queue take to drain?
---reveal---
The net drain rate is 4 Mbps, or 500,000 bytes/s. Therefore:
Dividing by the full output rate would ignore new packets that continue arriving while the old backlog drains.
- 6ExplanationTrack what a retransmission replaces
Goodput counts new useful application data once. Throughput counts delivered traffic, while offered load includes everything injected into the network.
A reliable sender replaces lost data, but those repeats consume link time. If a timer expires while an original is merely delayed, two copies may travel through the path and arrive successfully. The application still receives that piece of data only once.
- 7ExampleAccount for work lost farther downstream
A packet travels over links A and B, then is dropped in the queue before C. Both upstream transmissions have already consumed capacity, yet the packet never reaches its destination.
As more traffic is lost late, upstream links can spend an increasing share of their time on doomed packets. End-to-end delivery can fall while those links remain busy. This is one route toward congestion collapse, not simply a full queue at one router.
- 8ChallengeSeparate busy capacity from useful progress
A 16 Mbps link is full. Of its equally sized packets, 25% repeat data it has carried before. Ignoring headers and downstream losses, what is the largest possible rate of new data?
---reveal---
Only three quarters is new:
The other 4 Mbps may be useful for repairing reliability, but it does not add new data to the rate being counted here.
- 9Key InsightKnow what changes at the knee and cliff
Beyond the knee, a larger offered load gives little extra throughput while delay rises sharply. Beyond the cliff, throughput falls as losses and wasted work dominate.
These describe different problems: inefficient waiting can appear before useful delivery collapses. A controller should keep the bottleneck productively busy while avoiding the high-delay operating point that a large buffer can conceal.
- 10ExplanationLocate the origin of the warning
With end-to-end control, the sender infers congestion from loss, RTT, or delivery measurements. A router supplies no explicit congestion report.
With network-assisted control, the router sends a warning. In ECN, it marks a forward-traveling packet and the receiver reports that mark back. The report still counts as network-assisted even though it returns inside an endpoint acknowledgment.
- 11ConnectionSeparate the signal from the sending control
A loss can come from queue overflow or wireless corruption. A rise in RTT can come from a queue or a route change. A mark explicitly reports congestion but needs compatible path support.
After interpreting the signal, the sender can limit a window or choose a paced rate. These are control choices, separate from where the signal originated. Roughly one window per RTT links the amount in flight to the achieved rate.
- 12ChallengeChoose a helpful feedback path
A download keeps a large router buffer occupied. The receiver has ample free memory. The router starts marking congestion and the receiver echoes the marks. What kind of control is this, and why can it address the download delay?
---reveal---
It is network-assisted congestion control. The sender can reduce traffic entering the congested path, allowing the router queue to shrink. More receiver space would not drain that queue because the limiting capacity is in the network.
- 13RecapRead load, useful delivery, and feedback together
Predict queue growth from arrivals minus departures; find waiting time from queued bits divided by output rate. Then check how much link work delivers new application data.
Loss, delay, and explicit feedback tell a sender different things. A useful congestion controller interprets those signals and adjusts traffic so that the path delivers data efficiently without maintaining excessive queues.
2Trace a TCP window from startup through recovery
20 steps
Save this lesson to follow every Walkthrough step by step.
- 1IntroductionRead the window before reading the rate
- 2ExplanationRespect both sender and receiver limits
- 3ExampleEstimate a window-limited rate
- 4ExampleCompute the data needed to fill a path
- 5ChallengeFind the limit that actually binds
- 6ExplanationWhy slow start grows quickly
- 7ExampleChange the rule at the threshold
- 8TipLabel the phase on every trace
- 9ChallengeTrace the switch without skipping a round
- 10ExplanationDistinguish a gap from a silent path
- 11ExampleEnter fast recovery with temporary inflation
- 12ExampleFinish recovery at the threshold
- 13ChallengeUse the flight size and deflate correctly
- 14ExplanationAverage the sawtooth window
- 15ExampleConvert the average to bits per second
- 16ConnectionSee why loss and RTT matter
- 17ChallengeChange two model inputs together
- 18Key InsightA high BDP magnifies slow recovery
- 19ChallengeCombine the rate estimate with flow control
- 20RecapRead growth, recovery, and limits as separate decisions
3Follow fair sharing from an ideal pair to real users
12 steps
Save this lesson to follow every Walkthrough step by step.
- 1IntroductionAsk who receives the capacity
- 2ExplanationDraw the two target lines
- 3ExampleWatch the gap and ratio separately
- 4ChallengeChoose an update that changes relative sharing
- 5ConnectionKnow when the ideal convergence applies
- 6ExplanationUse Jain’s index for equality
- 7ExampleCalculate a score and utilization
- 8ExampleShare the remainder after a small demand
- 9ChallengeFind the right population for a fairness score
- 10Key InsightSenders and queues both shape the outcome
- 11ChallengeDistinguish equality from efficient AIMD behavior
- 12RecapSeparate an allocation from its explanation
4Trace an early congestion warning
13 steps
Save this lesson to follow every Walkthrough step by step.
- 1IntroductionA low loss count can hide a long wait
- 2ExampleMeasure the wait inside a large buffer
- 3ExplanationRED gives a probabilistic early warning
- 4ExplanationCoDel asks whether delay ever gets small
- 5ChallengeInterpret a delay history
- 6ConnectionSeparate flow service from queue delay control
- 7ExplanationMark a delivered packet
- 8ExampleClose the classic TCP feedback loop
- 9ChallengeHandle repeated echoes from one event
- 10ExampleScale a DCTCP response to marked traffic
- 11ConnectionL4S combines endpoint and queue behavior
- 12ChallengeExplain delivery without a timeout
- 13RecapFollow detection, marking, and response
5Compare CUBIC growth with BBR’s path model
14 steps
Save this lesson to follow every Walkthrough step by step.
- 1IntroductionChoose what the controller should learn
- 2ExplanationStart with a gentler ordinary reduction
- 3ExampleFind the cubic return time
- 4ExampleEvaluate a point below the old peak
- 5Key InsightThe pure curve is only one candidate
- 6ChallengeUse the two different CUBIC memories
- 7ExampleLet Vegas infer queued segments
- 8ExplanationBuild BBR’s bandwidth-delay model
- 9ExampleCalculate the model before applying gains
- 10ConnectionProbe, then make room to measure
- 11ChallengeTranslate a model into control settings
- 12TipKeep version and feedback rules attached
- 13ChallengeDistinguish an RTT warning from a path model
- 14RecapCompare measurements, growth, and queueing
6Follow QUIC from setup to congestion recovery
15 steps
Save this lesson to follow every Walkthrough step by step.
- 1IntroductionChange the transport without abandoning its job
- 2ExplanationUnderstand why TCP changes can stall
- 3ConnectionProtect details that need to change
- 4ExampleCompare the first response time
- 5ExampleSeparate stream ordering from connection sharing
- 6ChallengeCorrect a claim about UDP-based transport
- 7ExplanationGive every transmission its own identity
- 8ExampleDetect a hole before probing for feedback
- 9ExampleCalculate the initial and minimum windows
- 10ChallengeReduce once for an old-flight episode
- 11ExampleFind a persistent-congestion duration
- 12ConnectionCarry ECN counts in ACKs
- 13TipCheck when bytes leave, not just how many
- 14ChallengeConnect independent delivery with a shared response
- 15RecapKeep deployment benefits and congestion duties together
Congestion Control practice questions
Set 1: Connect rates, fairness, and transport feedback10 Practice Questions
Question 1 of 10
Show answerHide answer
Question 2 of 10
Show answerHide answer
Question 3 of 10
Show answerHide answer
Question 4 of 10
Show answerHide answer
Question 5 of 10
Show answerHide answer
Question 6 of 10
Show answerHide answer
Question 7 of 10
Show answerHide answer
Question 8 of 10
Show answerHide answer
Question 9 of 10
Show answerHide answer
Question 10 of 10
Show answerHide answer
Set 2: Read congestion signals and window changes10 Practice Questions
Save this lesson to see every answer and practice every set.
Question 1 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 2 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 3 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 4 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 5 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 6 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 7 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 8 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 9 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 10 of 10
Show answerHide answer
Save this lesson to see this answer.
Set 3: Diagnose queues and recovery episodes10 Practice Questions
Save this lesson to see every answer and practice every set.
Question 1 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 2 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 3 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 4 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 5 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 6 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 7 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 8 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 9 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 10 of 10
Show answerHide answer
Save this lesson to see this answer.
Set 4: Apply the rules when conditions change10 Practice Questions
Save this lesson to see every answer and practice every set.
Question 1 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 2 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 3 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 4 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 5 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 6 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 7 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 8 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 9 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 10 of 10
Show answerHide answer
Save this lesson to see this answer.
Set 5: Reason across models and transport behavior10 Practice Questions
Save this lesson to see every answer and practice every set.
Question 1 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 2 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 3 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 4 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 5 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 6 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 7 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 8 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 9 of 10
Show answerHide answer
Save this lesson to see this answer.
Question 10 of 10
Show answerHide answer
Save this lesson to see this answer.
Stuck on your own question? Homework Help
Key Terms
A
ACK clocking
ACK delay
ACK range
Active queue management (AQM)
Additive increase
AIMD
Appropriate Byte Counting
B
Bandwidth-delay product (BDP)
Base RTT
BBR
Bottleneck
Bufferbloat
C
Chiu–Jain diagram
Cliff
Congestion
Congestion avoidance
Congestion collapse
Congestion experienced (CE)
Congestion signal
Congestion window (cwnd)
Congestion Window Reduced (CWR)
Connection migration
Controlled Delay (CoDel)
CUBIC
CUBIC return time K
D
Data Center TCP (DCTCP)
Delayed acknowledgment
Drop-tail
E
ECN-capable transport (ECT)
ECN-Echo (ECE)
Efficiency line
End-to-end congestion control
Explicit congestion notification (ECN)
F
Fair queuing
Fairness line
Fast convergence
Fast recovery
Fast retransmit
FlightSize
Flow control
G
Global synchronization
Goodput
H
Head-of-line blocking
High-speed recovery problem
I
Initial window
J
Jain’s fairness index
K
Knee
L
L4S
Loss fraction
M
Mathis approximation
Max-min fairness
Maximum segment size (MSS)
Multiplicative decrease
N
Network-assisted congestion control
NewReno
O
Offered load
Output queue
P
Pacing
Pacing gain
Packet number space
Packet threshold
Parallel connections
Partial acknowledgment
Persistent congestion
Probe timeout (PTO)
ProbeBW
ProbeRTT
Protocol ossification
Q
QUIC
QUIC stream
R
Random Early Detection (RED)
Rate-based control
Receive window (rwnd)
Recovery period
Reno-friendly region
Retransmission
Retransmission timeout (RTO)
Round-trip time (RTT)
RTT unfairness
S
Sawtooth model
Selective acknowledgment (SACK)
Slow start
Slow-start threshold (ssthresh)
Sojourn time
Standing queue
T
TCP Vegas
TCP-friendly traffic
Throughput
Time threshold
U
Unneeded retransmission
W
Window gain
Window inflation
Window-based control
Wmax
#
0-RTT early data
About this lesson
Make your own Study Materials
Turn your notes, slides and documents into Study Guides, Practice Questions, Flashcards and 6 more tools.