Bandwidth-Delay Product & TCP Window Calculator

The bandwidth-delay product is how much data a path holds while it is in transit — the bits that have left the sender but not yet been acknowledged. It is the size a TCP window has to reach before a single stream can fill the link, and it is the reason a 10 Gbps circuit across an ocean can crawl at 5 Mbps with default settings. Enter the link rate, the round-trip time and your current socket buffer, and this calculator returns the product in bytes, the window scale factor RFC 7323 requires, and the throughput one stream actually reaches today.

Calculator

This calculator runs in your browser. Enable JavaScript for live results — the inputs, formula and worked example below remain fully readable without it.

Inputs this calculator takes, with typical values
InputWhat to enterExample
Link bandwidthThe rate of the slowest hop on the path, not the speed of your local interface.1 Gbps
Round-trip timeMeasured with ping or a TCP handshake, at the load you actually run — a busy path is slower than an idle one.80 ms
Current TCP window or socket bufferThe receive buffer in use today. 65,535 bytes is the largest an unscaled TCP window can advertise.65535 bytes

It returns

  • Bandwidth-delay product — Bytes in flight on the path — the minimum window that fills the link.
  • Product in MiB
  • Window scale factor needed — The RFC 7323 shift count; the advertised window is multiplied by 2 to this power.
  • Throughput with the current window
  • Share of the link one stream reaches
  • Extra buffer needed

The formula

BDP=BT
R=8WT
s=log2BDP65535

In plain text: BDP (bits) = bandwidth (bit/s) × RTT (s); BDP (bytes) = BDP (bits) ÷ 8

  • BDPBandwidth-delay product — data in flight on the path (bits)
  • BBandwidth of the narrowest hop (bit/s)
  • TRound-trip time (s)

Round-trip time is used rather than one-way delay because the sender cannot release new data until an acknowledgement returns, so the window has to cover a full circuit of the path.

Updated Category Bandwidth, Throughput & Latency Verified against published test cases Reading time 12 min

What the bandwidth-delay product measures

Think of the path between two hosts as a pipe. Bandwidth is how wide it is; round-trip time is how long it is. Multiply the two and you get its volume — the amount of data that fits inside the network at one instant. That volume is the bandwidth-delay product, and it is the amount a sender must be allowed to have outstanding, unacknowledged, if the pipe is to stay full.

TCP limits outstanding data to the smaller of the congestion window and the receiver's advertised window. If that limit is below the product, the sender fills the window, stops, and waits for the first acknowledgement to come back before it can send again. The link then sits idle for most of every round trip, and throughput settles at window ÷ RTT no matter how fast the circuit is. This is the single most common reason a fast long-distance link performs like a slow one, and it is why the symptom is unmistakable: the transfer rate barely changes when you upgrade the circuit.

The effect scales with distance. At 1 ms round trip — within a data centre — a gigabit link holds 125 KB, comfortably inside any default buffer. Across the Atlantic at 80 ms it holds 10 MB, which is far outside the defaults most systems ship with. Networks in the second category are called long fat networks, and RFC 7323 exists to make them work.

If you want to know how long a given transfer takes once the window is right, use the data transfer time calculator; for sizing an aggregate link from user counts rather than a single stream, use the network bandwidth requirement calculator.

The formula and the three quantities it links

BDP = bandwidth × round-trip time. Keep the units honest: bandwidth in bits per second, time in seconds, and the answer comes out in bits. Divide by 8 for bytes, which is the unit every socket option is expressed in. A 1 Gbps path at 100 ms holds 1,000,000,000 × 0.1 = 100,000,000 bits, which is 12,500,000 bytes.

Round-trip time is used rather than one-way delay for a specific reason. The sender is not waiting for the data to arrive; it is waiting for permission to send more, and that permission travels back in an acknowledgement. The window therefore has to cover the outbound flight, the receiver's turnaround and the return flight — a full circuit.

Throughput with a fixed window = window × 8 ÷ RTT. Rearranging the same relationship gives the practical diagnostic. A 65,535-byte window on a 100 ms path yields 65,535 × 8 ÷ 0.1 = 5,242,800 bit/s, about 5.24 Mbps, and that figure is the same whether the circuit is 10 Mbps or 10 Gbps. What a window can never do is exceed the line rate, so the achievable figure reported above is the smaller of the two.

Window scale factor = ⌈log₂(BDP ÷ 65,535)⌉. The TCP header's window field is 16 bits, capping the advertised window at 65,535 bytes. RFC 7323 adds a scale option, negotiated only in the SYN and SYN-ACK, that left-shifts the advertised value by an agreed number of bits. A shift of 8 multiplies by 256, taking the ceiling to about 16 MB. The maximum shift is 14, giving roughly 1 GB, and paths whose product exceeds that cannot be filled by one stream at all.

Two practical notes about buffers. Most operating systems now auto-tune the receive buffer up to an administrator-set maximum, so the number that matters is usually that maximum rather than the default. And the send buffer needs to be at least as large as the receive window, because it holds the unacknowledged data awaiting possible retransmission.

Worked example: 1 Gbps London to New York at 80 ms

A research group copies datasets over a 1 Gbps circuit with a measured round-trip time of 80 ms and finds the transfer sits at about 6.5 Mbps. Work out why.

  1. Convert the bandwidth. 1 Gbps = 1,000 Mbps = 1,000,000,000 bit/s.
  2. Convert the delay. 80 ms = 0.08 s.
  3. Multiply. 1,000,000,000 × 0.08 = 80,000,000 bits in flight.
  4. Convert to bytes. 80,000,000 ÷ 8 = 10,000,000 bytes, which is 10,000,000 ÷ 1,048,576 = 9.537 MiB.
  5. Compare with the current window. The host is using the unscaled maximum of 65,535 bytes, which covers 65,535 ÷ 10,000,000 = 0.66% of the product.
  6. Predict the throughput. 65,535 × 8 ÷ 0.08 = 6,553,500 bit/s = 6.55 Mbps, which matches the measurement. The circuit is not the problem.
  7. Find the scale factor. 10,000,000 ÷ 65,535 = 152.6, and log₂(152.6) = 7.25, so the ceiling is 8. A shift of 8 multiplies the advertised window by 28 = 256, giving a ceiling of 16,776,960 bytes — comfortably above the 10,000,000 needed.
  8. Set the buffer. Raise the receive and send buffer maxima to at least 10,000,000 bytes. With the window matched to the product, one stream can reach 10,000,000 × 8 ÷ 0.08 = 1,000,000,000 bit/s, the full 1,000 Mbps.

Notice that steps 6 and 8 use the same expression with different windows: throughput is directly proportional to window size at fixed RTT, right up to the point where the line rate takes over as the binding constraint. That is the whole mechanism in one sentence.

How to read the result

Compare the product with your current buffer first. If the buffer is at or above the product, the window is not your limit and you should look elsewhere — packet loss, a slower hop than you assumed, disk throughput at either end, or a sender that is not offering data fast enough. If it is below, the shortfall figure is exactly how many more bytes you need, and the utilisation figure tells you what fraction of the circuit you are currently buying.

A window matched exactly to the product fills the link only when nothing goes wrong. Practitioners commonly provision two to three times the product so that TCP can keep sending while it recovers from a loss and while the congestion window rebuilds. That is a rule of thumb rather than a derived quantity, and it costs memory per connection, which is why servers with many concurrent flows tune the auto-tuning maximum rather than the default.

Loss changes the picture completely. The product tells you the window you need; it does not promise you will get it. Classic loss-based congestion control cannot sustain a large window on a lossy path, because each loss halves the congestion window and it then rebuilds by roughly one segment per round trip — slowly, when round trips are long. On a path with measurable loss the practical ceiling comes from the loss rate and the RTT together rather than from the buffer, which is why long-haul tuning normally starts by eliminating loss and only then raises buffers.

Read the scale factor as a configuration check, not a target. Window scaling is negotiated once, in the SYN exchange, and only if both ends offer it. A middlebox that strips or rewrites the option leaves the connection permanently unscaled no matter what the hosts are configured to do, and the symptom is a transfer that plateaus at exactly window ÷ RTT with no loss to explain it. Packet capture on the handshake settles that question in seconds.

Bandwidth-delay product at 1 Gbps by round-trip time

Bytes in flight on a 1 Gbps path. Every row is 1,000,000,000 × RTT ÷ 8, so the product scales linearly with delay — doubling the distance doubles the buffer you need.
Round-trip timeTypical pathProduct (bytes)Product (MiB)Scale factor
0.5 msSame rack or switch62,5000.060
1 msWithin a data centre125,0000.121
10 msMetropolitan area1,250,0001.195
30 msCoast to coast, one country3,750,0003.586
80 msTransatlantic10,000,0009.548
150 msTranspacific18,750,00017.889
300 msMulti-hop intercontinental37,500,00035.7610
600 msGeostationary satellite75,000,00071.5311

Scale factor is ⌈log₂(product ÷ 65,535)⌉. At 0.5 ms the product already fits an unscaled window, so no scaling is required.

Assumptions and limits worth knowing

  • The product describes one flow. Ten parallel streams share the same pipe, so each needs roughly a tenth of the window to fill it between them. Parallel transfer tools exploit exactly this, at the cost of being less friendly to other traffic.
  • Bandwidth means the narrowest hop. A 10 Gbps interface into a 200 Mbps circuit has a 200 Mbps product. Measuring the bottleneck, not the interface, is the whole difficulty in practice.
  • Round-trip time is not constant. Queueing adds delay under load, so the product grows exactly when the path is busiest. Measure RTT at realistic load, not on an idle link.
  • Buffers cost memory per connection. A 16 MB window on 1,000 concurrent connections is 16 GB of kernel memory. Auto-tuning exists so the maximum is only reached by flows that need it.
  • Oversized buffers in the network are a different problem. Bufferbloat is excess queueing inside routers, which inflates RTT and therefore inflates the product itself. Sizing endpoint buffers does not fix it; active queue management does.
  • Modern congestion control changes the arithmetic. BBR paces to an estimate of bandwidth and minimum RTT rather than filling a window to loss, so it is far less sensitive to a single loss event — but it still cannot exceed the advertised receive window, so the product remains a hard floor for the buffer.

Where this fits in performance work

The bandwidth-delay product is the first calculation in any long-haul throughput investigation and rarely the last. A sensible order of work is: measure the true bottleneck rate and the round-trip time; compute the product; confirm the receive window can reach it and that scaling is actually negotiated; then measure loss. RFC 6349 sets out a formal version of this procedure for TCP throughput testing, including the ratio of achieved throughput to the ideal as a reportable metric.

Above the transport layer, application behaviour often matters more than the window. A protocol that makes one request per round trip is limited by RTT no matter how large the buffers are — the classic case is a file copy over a chatty protocol, where a hundred small operations cost a hundred round trips. Pipelining, larger block sizes and parallel connections are the fixes there, and none of them is a buffer setting.

Storage and backup work meets the same constraint from the other side. If you are checking whether a nightly copy fits its window, the backup window calculator works from the size and the achievable rate, and this page is how you find out whether that rate is realistic on the path you have. For encapsulated or tunnelled paths, subtract the header overhead first — the MTU, MSS and packet overhead calculator shows how much of the line rate the headers consume before any of this arithmetic starts.

Finally, keep the product in mind when someone proposes a longer path for resilience or compliance. Routing traffic through a distant scrubbing centre or inspection point adds round-trip time, and every millisecond added multiplies straight into the buffer every endpoint needs. A path change is a throughput change.

Frequently asked questions

What TCP window size do I need for a 1 Gbps link at 100 ms?

At least 12,500,000 bytes, and 25–35 MB if you want headroom for loss recovery. The product is 1,000,000,000 bit/s × 0.1 s = 100,000,000 bits, which is 12.5 MB. A window smaller than that limits a single stream to window × 8 ÷ RTT regardless of the circuit speed. Because 12.5 MB is far above the unscaled 65,535-byte ceiling, window scaling must also be negotiated for the setting to have any effect.

Why is my transfer slow on a fast link?

Most often because the receive window is smaller than the bandwidth-delay product, so the sender stalls waiting for acknowledgements. The tell is that measured throughput equals window × 8 ÷ RTT almost exactly and does not change when the circuit is upgraded. The other common causes are packet loss, a bottleneck hop slower than you assumed, and an application that issues one small request per round trip. Rule out the window first, because it is the cheapest to test.

What is the maximum TCP window size?

65,535 bytes without window scaling, and about 1 GB with it. The window field in the TCP header is 16 bits, so the largest value it can carry is 65,535. RFC 7323 adds a scale option that left-shifts the advertised value by up to 14 bits, multiplying it by up to 16,384 and giving a ceiling near 1,073,725,440 bytes. The option is exchanged only in the SYN and SYN-ACK, so both ends must support it and no middlebox may strip it.

Should I set the buffer to exactly the bandwidth-delay product?

Set it to at least the product, and commonly two to three times it. The product is the minimum that keeps the pipe full when nothing goes wrong; extra headroom lets the sender keep transmitting while it recovers from a loss and while the congestion window rebuilds. The trade-off is memory, since the maximum is per connection, so a busy server tunes the auto-tuning ceiling rather than raising every socket's default.

Does the bandwidth-delay product apply to UDP?

The volume-in-flight idea applies to any protocol, but the window constraint does not. UDP has no acknowledgement-driven window, so a UDP sender can transmit at line rate over any distance — which is why QUIC, DNS bulk transfer and media protocols behave differently on long paths. Anything built on UDP that guarantees delivery, including QUIC, implements its own flow control and then faces exactly the same sizing question.

How do I measure round-trip time properly?

Use ping or a TCP handshake timing to the far endpoint, sampled over minutes rather than seconds, and under the load you actually run. Idle-path measurements understate the delay because queueing adds latency exactly when the link is busy. If ICMP is deprioritised or blocked, time the SYN to SYN-ACK interval in a packet capture instead, which measures the same circuit that carries your data.

Will parallel streams fix a window that is too small?

Often yes, and that is why bulk transfer tools offer them. Each stream carries its own window, so eight streams with a 1 MB window each have 8 MB in flight between them. The drawbacks are that parallel streams claim a larger share of a congested link than a single flow would, and that they multiply memory and connection state. Raising the window is the cleaner fix where you control both endpoints.

Why does my utilisation stay low after I raised the buffer?

Check whether window scaling was actually negotiated, then check for loss. Scaling is offered only in the SYN exchange, so a connection that was established before the setting changed, or one whose SYN passed through a middlebox that removed the option, stays unscaled and caps at 65,535 bytes whatever the socket is configured for. If scaling is present and loss is above roughly one packet in ten thousand, the congestion window rather than the receive window is what limits you.

References