TCP Congestion Window

Explore a simplified Reno congestion window: slow start, growth and one loss event.

About this tool

Compare timeout and three duplicate ACKs in a simplified, saturated Reno connection. Show computes all 80 RTT rounds immediately. The complete graph stays visible; use Position, Step or Play to inspect individual states. Window is solid, threshold dashed, and the dot marks the selected state. Values lists the same numeric states without needing the graph.

The window begins at one segment. Slow start doubles it per RTT, capped at the threshold; congestion avoidance adds one segment per RTT. At the chosen loss round, the threshold becomes max(2, floor(window/2)). Timeout returns to one segment and slow start; the duplicate-ACK case shows the window after completed fast recovery, at the new threshold. Both before/after states occur at the same plotted time. Select No loss, or enter round zero, to omit the event.

Example: initial threshold 8, loss after RTT 24: window 29 before loss, threshold 14 afterward. Timeout gives window 1, whereas the duplicate-ACK case gives 14. RTT in seconds changes only the time axis. Playback defaults to four states per second, independent of the simulated RTT; it does not measure network speed.

This is a round-based illustration based on RFC 5681, not a packet-level TCP implementation. It assumes FlightSize equals the congestion window and uses whole segments. Fast-recovery inflation, ACK timing, limited transmit, delayed ACKs, retransmission delay, receive-window limits, SACK, CUBIC and modern initial windows are omitted. A single injected loss is shown; this is not a recurring sawtooth or a throughput prediction. Use TCP Window & Throughput for ideal window/RTT limits.

Before loss jumps directly to the state preceding the injected event; Step shows the response. The selected state is highlighted in Values. Inputs, validation errors, position, playback speed, open table and local table scroll position are retained locally across reloads and language changes. Restored simulations are always paused, even if playback was running. Editing inputs stops playback and hides the previous result. Show recalculates from the beginning; replay, reset and navigation stop the old timer.