Back to Blog
April 5, 20241,000 views

Bandwidth in System Design: Capacity, Congestion, and How to Use It Wisely (Visualized)

Bandwidth is the maximum rate at which data can travel across a network link β€” the hard ceiling on how much information you can push per second. Understanding bandwidth, how it differs from latency and throughput, and how to make the most of it is essential for designing fast, cost-efficient systems.

Bandwidth is the maximum rate at which data can be transferred over a network link, typically measured in bits per second (bps) β€” it is the hard physical ceiling on how much information a connection can carry, and every system design decision that touches data movement is ultimately constrained by it.

When engineers say a datacenter uplink has 10 Gbps of bandwidth, they mean the wire can carry at most 10 billion bits every second β€” no matter how many servers are behind it or how urgently they need to send data. You can optimise protocols, tune buffers, and apply compression, but you cannot exceed the physical limit of the medium. Understanding that limit β€” and how to stay comfortably below it β€” is one of the most practical skills in systems engineering.

Bandwidth, Latency, and Throughput β€” Three Different Things

These three terms are routinely confused in interviews and production incident reports alike. They are related but describe completely different properties of a network path:

Bandwidth is the capacity of the link β€” how wide the pipe is. A 1 Gbps Ethernet port has 1 Gbps of bandwidth whether it is idle or saturated.
Latency (also called delay or round-trip time) is how long a single bit takes to travel from sender to receiver β€” how long the pipe is. A satellite link may have enormous bandwidth but 600 ms of latency.
Throughput is the actual rate at which useful data is successfully delivered over a period of time. Throughput is always less than or equal to bandwidth; it is reduced by congestion, packet loss, protocol overhead, and retransmissions.

The classic mental model is a garden hose: bandwidth is the diameter of the hose (how much water it can carry per second), and latency is the length of the hose (how long before the first drop reaches you). A short fat hose delivers fast and in bulk. A long thin hose keeps you waiting and dribbles. These dimensions are orthogonal β€” you can have a wide hose that is also very long, or a narrow hose right next to you.

Bandwidth vs Latency β€” the Pipe Analogy
Bandwidth = pipe width (capacity per second). Latency = pipe length (travel time). They are independent dimensions.
PropertyWhat it measuresUnitAnalogy
BandwidthMaximum capacity of the linkbps, Mbps, GbpsPipe diameter
LatencyOne-way or round-trip delayms, ΞΌsPipe length
ThroughputActual data successfully deliveredbps (observed)Flow rate at the tap
JitterVariation in latency over timems (std dev)Water pressure fluctuations

The Bandwidth-Delay Product

The bandwidth-delay product (BDP) is one of the most useful numbers in network engineering. It is calculated as:

BDP = Bandwidth Γ— Round-Trip Time

BDP tells you how many bits are in flight on the network at any moment β€” the amount of data that has been sent but not yet acknowledged. If your TCP receive window is smaller than the BDP, the sender will be forced to wait for acknowledgements before sending more data, and you will never saturate the available bandwidth. This is why TCP window scaling and tuning net.core.rmem_max matter for high-bandwidth, high-latency links (the famous "fat pipes" between datacenters on opposite continents).

Example: a 1 Gbps intercontinental link with 150 ms RTT has a BDP of 1,000,000,000 Γ— 0.150 = 150,000,000 bits = ~18 MB. You need at least an 18 MB TCP receive window to keep that link full. The default Linux socket buffer of 87 KB would leave the link at roughly 0.05% utilisation.

Congestion β€” When Demand Exceeds Capacity

Network congestion occurs when the aggregate demand from all senders exceeds the bandwidth of a shared link. At that point routers must make a choice: buffer the excess packets (adding latency), or drop them (forcing TCP to retransmit, reducing throughput). Both outcomes degrade the user experience. The worst scenario is buffer bloat β€” oversized router buffers that accept every packet but hold them for hundreds of milliseconds, creating high latency without any obvious packet loss.

TCP's congestion-control algorithms (CUBIC, BBR, RENO) respond to these signals by backing off the send rate, then probing for more bandwidth again. The result is a sawtooth throughput pattern that is quite visible in packet captures. Understanding this dynamic matters when you are sizing your uplinks: a link running at 70-80% utilisation is approaching the danger zone where tail latency spikes and packet loss begins.

Bandwidth Congestion β€” Queue Build-up and Packet Drop
When arrival rate exceeds link bandwidth, packets queue up. Once the queue overflows, packets are dropped and throughput collapses.

How to Measure Bandwidth

You measure available bandwidth (throughput) rather than the theoretical link rate, because the wire's rated speed is almost never achievable end-to-end. Common tools include iperf3 (TCP/UDP flood tests between two hosts), speedtest-cli (consumer links), and cloud provider metrics like AWS CloudWatch NetworkOut. Monitoring throughput trends over time lets you detect saturation before users notice it.

# Install iperf3 on both machines, then:
# On the server:
iperf3 -s

# On the client (test TCP throughput over 10 seconds):
iperf3 -c <server-ip> -t 10

# Test with 8 parallel streams (closer to real multi-connection traffic):
iperf3 -c <server-ip> -t 10 -P 8

# Check live bandwidth usage on a Linux server:
nload eth0
# or:
sar -n DEV 1 5

Strategies to Use Bandwidth More Efficiently

Rather than always buying more bandwidth (expensive), smart system design squeezes more utility out of existing capacity. The three most impactful techniques are compression, CDNs, and caching.

Compression

Compression reduces payload size before transmission. HTTP responses compressed with gzip or brotli are typically 60-80% smaller than raw text/JSON. Binary protocols like Protocol Buffers (gRPC) or MessagePack can be 3-10x smaller than equivalent JSON. At the media layer, modern codecs (AV1, HEVC, WebP) cut video and image sizes dramatically versus older formats. Every byte removed from a payload is a byte that does not compete for bandwidth.

Compression β€” More Logical Data Through the Same Bandwidth
Compressing payloads reduces their wire size, so the same bandwidth carries more logical content per second.

Content Delivery Networks (CDNs)

A CDN is a globally distributed network of edge servers that caches your static content close to end users. Instead of every video viewer in Tokyo downloading a 50 MB file from your origin datacenter in Virginia β€” consuming 50 MB of your origin's expensive bandwidth per view β€” the first request is fetched from the origin, cached at the Tokyo edge node, and all subsequent viewers in that region pull from the edge. Your origin bandwidth cost collapses to near zero for popular content, and users experience lower latency too. CDNs like Cloudflare, AWS CloudFront, and Fastly are the single most cost-effective bandwidth optimisation for read-heavy, geographically distributed workloads.

Caching

Caching at every layer β€” browser cache, CDN cache, reverse-proxy cache (Nginx, Varnish), in-process cache (Redis, Memcached), and database query cache β€” avoids recomputing and retransmitting the same bytes. A Cache-Control: max-age=86400 header on a JS bundle means 24 hours of zero repeat bandwidth per user per asset. Effective cache key design (considering query params, user-agent, accept-encoding) determines your cache hit rate, which directly translates to bandwidth savings.

TechniqueTypical bandwidth reductionBest applied toTrade-off
gzip / brotli compression60–80% for textHTML, JSON, CSS, JSSmall CPU cost on server
Binary protocols (Protobuf)3–10x vs JSONInternal microservice APIsSchema overhead, less debuggable
CDN edge caching80–99% of origin bandwidthStatic assets, media, public pagesCache invalidation complexity
Browser caching (Cache-Control)100% on repeat visits (per asset)Versioned JS/CSS/imagesStale content if versioning wrong
Image optimisation (WebP/AVIF)25–50% vs JPEG/PNGPhotos, thumbnailsBrowser support matrix
HTTP/2 multiplexingReduces connection overheadMany small parallel requestsRequires HTTPS

Bandwidth in Cloud Architecture

Cloud providers charge for egress bandwidth (data leaving their network) but not for intra-region traffic between services. AWS, GCP, and Azure all price egress at roughly $0.08–$0.09 per GB for the first 10 TB per month. At scale this becomes a dominant cost line. Key architecture decisions driven by bandwidth costs:

Keep data close to compute: process data in the same region and availability zone to avoid cross-AZ or cross-region fees.
Aggregate before sending: batch writes to S3 or analytics stores rather than sending one record at a time; the per-request overhead (HTTP headers, TLS handshakes) is significant at low volumes.
Use regional CDNs: serve static assets from CloudFront, Cloudflare, or Fastly to slash egress bills β€” CDN egress is typically 2-5x cheaper than direct origin egress.
Enable transfer acceleration: AWS S3 Transfer Acceleration uses CloudFront's backbone for uploads from distant clients, reducing effective latency without increasing bandwidth cost.

Frequently Asked Questions

What is the difference between bandwidth and internet speed?

"Internet speed" in consumer marketing almost always refers to the download throughput your ISP can deliver in ideal conditions β€” not the raw bandwidth of the physical medium. Your home fibre line might have a theoretical 1 Gbps capacity, but if the ISP's upstream links are congested or your router firmware is old, the throughput you actually experience could be a fraction of that. Bandwidth is the ceiling; internet speed is how close to that ceiling you can actually get in practice.

Does more bandwidth always mean better performance?

Not always. For latency-sensitive workloads like real-time gaming, voice calls, or financial trading, reducing latency matters far more than adding bandwidth. A 10 Gbps link with 200 ms RTT will feel worse for an RPC call than a 100 Mbps link with 2 ms RTT. Adding bandwidth only helps when the link is actually saturated; if your bottleneck is CPU, database locking, or high latency, more bandwidth buys nothing. Always profile before provisioning.

How do I estimate the bandwidth requirements for a new system?

Start from the data model: estimate the average response size per request type, multiply by your expected peak requests per second, then add protocol overhead (~5-10% for HTTP/2, ~15-20% for HTTP/1.1 with keep-alive). Add a 2x headroom multiplier for bursty traffic, then round up to the nearest standard link size (1 Gbps, 10 Gbps). For a write-heavy service, also account for replication fan-out β€” writing to three replicas triples your internal write bandwidth. Tools like iperf3 in load-test environments let you validate the estimate before going to production.

Bandwidth is the ceiling, not the floor. Build systems that compress aggressively, cache ruthlessly, and stay well below saturation β€” because the tail latency when you hit 80% utilisation is always worse than the graph suggests.

β€” alokknight Engineering