TCP window size and the bandwidth-delay product

Updated November 2026

A single TCP connection can never move data faster than its window divided by the round-trip time. Work out the bandwidth-delay product of your path, compare it with the window your hosts allow, and you know at once whether TCP settings are what is slowing you down.

What the window is

TCP lets a sender transmit a certain amount of data before it has to stop and wait for an acknowledgment. The receiver advertises how much it can accept: the receive window. The sender also keeps its own limit, the congestion window, which it grows while the path looks clear and cuts after loss. The amount actually in flight is the smaller of the two, and both are bounded by the socket buffers on each host.

Once the sender has a full window in flight, it waits. On a path with a 50 ms round trip, it can send at most one window every 50 ms, whatever the speed of the link.

The formula

Maximum throughput of one TCP connection ≈ window size ÷ round-trip time.

Turned around, the window you need to fill a path is the bandwidth-delay product (BDP):

BDP (bits) = bandwidth (bits per second) × RTT (seconds). Divide by 8 for bytes.

Use the bandwidth of the slowest link on the path and the RTT that ping reports between the two hosts.

Worked BDP examples

Bandwidth-delay product for common paths (1 MB = 1,000,000 bytes)
BandwidthRTTArithmeticBDP
100 Mbit/s20 ms100,000,000 × 0.020 = 2,000,000 bits250 KB
1 Gbit/s10 ms1,000,000,000 × 0.010 = 10,000,000 bits1.25 MB
1 Gbit/s50 ms1,000,000,000 × 0.050 = 50,000,000 bits6.25 MB
10 Gbit/s50 ms10,000,000,000 × 0.050 = 500,000,000 bits62.5 MB
10 Gbit/s100 ms10,000,000,000 × 0.100 = 1,000,000,000 bits125 MB
100 Gbit/s100 ms100,000,000,000 × 0.100 = 10,000,000,000 bits1,250 MB

The last row is larger than the biggest window TCP can use (about 1,074 MB; see below), so a single stream cannot fill a 100 Gbit/s path across 100 ms. That is one reason high-speed transfer tools use several parallel streams.

The other direction: what a window allows

Without window scaling, the TCP header's 16-bit window field allows at most 65,535 bytes. Here is what that means at different distances:

Microsoft gives the same example in its Windows Server tuning guide: with a fixed 64 KB window, a 1 Gbit/s connection with 10 ms latency reaches only about 51 Mbit/s. A 4 MB buffer limit on a 50 ms path allows about 4,000,000 × 8 ÷ 0.05 = 640 Mbit/s, still short of 1 Gbit/s.

Window scaling (RFC 7323)

To get past 65,535 bytes, TCP uses the Window Scale option, first defined in RFC 1323 and now in RFC 7323 (September 2014). Each side announces a shift count in its SYN segment, and the window values it sends afterwards are multiplied by 2 to the power of that count. Key rules:

Middleboxes. If a firewall or load balancer strips or rewrites the Window Scale option, connections silently fall back to a 64 KB window. Microsoft's documentation notes that some network devices do not comply with the option. A transfer that is stuck near 64 KB ÷ RTT on every attempt is a strong hint; a packet capture of the SYN packets will confirm it.

From BDP to buffer settings

Platform steps are in Linux tuning and Windows and macOS.

Check it with iperf3

Run a test and compare the Cwnd column with your BDP. If Cwnd stays flat well below the BDP with no retransmissions, a buffer limit is holding you back. If Cwnd keeps collapsing with retransmissions, the problem is loss, and bigger buffers will not help. See Reading results.

Sources