DEV Community

Cover image for Why HTTP/1.1 Eventually Became a Bottleneck
Anik Sikder
Anik Sikder

Posted on • Originally published at aniksikder.hashnode.dev

Why HTTP/1.1 Eventually Became a Bottleneck

To understand HTTP/2 and HTTP/3, we first need to understand the problem they were designed to solve.

Many developers think protocol upgrades happen because engineers want newer technology.

In reality, protocols evolve because existing systems hit limits.

HTTP/2 and HTTP/3 were not created because HTTP/1.1 was broken.

They were created because the modern web outgrew it.


The Web HTTP/1.1 Was Designed For

Imagine it's 2005.

You open a typical website.

The browser requests:

index.html
style.css
logo.png
Enter fullscreen mode Exit fullscreen mode

That's it.

A handful of files.

The total page size might be a few hundred kilobytes.

For this type of website, HTTP/1.1 performs reasonably well.

Now fast-forward to today.

Open a modern e-commerce platform, social network, or SaaS application.

Your browser may request:

HTML
CSS
JavaScript Bundles
Fonts
Icons
Product Images
Videos
Analytics Scripts
Tracking Pixels
API Requests
Recommendation Engines
Chat Widgets
Third-Party Integrations
Enter fullscreen mode Exit fullscreen mode

Instead of three requests, there may be hundreds.

A modern webpage is often closer to an application than a document.

The internet changed dramatically.

HTTP/1.1 largely remained the same.


Understanding the Real Problem

At first glance, downloading 100 files doesn't sound difficult.

The challenge isn't the files themselves.

The challenge is coordination.

Imagine a warehouse receiving hundreds of orders.

If workers can only process one order at a time, a queue quickly forms.

The same idea applies to network communication.

The browser wants many resources.

The server has many resources.

The protocol determines how efficiently they can communicate.


The Single-Lane Highway Problem

Think of a highway with only one lane.

πŸš— HTML
   ↓
πŸš— CSS
   ↓
🚚 Large Image
   ↓
πŸš— JavaScript
   ↓
πŸš— Font File
Enter fullscreen mode Exit fullscreen mode

Everything must travel through the same lane.

If a large truck blocks traffic, smaller vehicles behind it cannot pass.

This is exactly what happens when network requests become serialized.

One slow response can delay many others.

The result is unnecessary waiting.


The Restaurant Analogy

Imagine a restaurant with only one waiter.

A customer places an order.

The waiter walks to the kitchen.

The waiter waits.

The food is prepared.

The waiter returns.

Only then can the next customer be served.

Customer 1
    ↓
 Waiter
    ↓
 Kitchen

Customer 2 waits...

Customer 3 waits...

Customer 4 waits...
Enter fullscreen mode Exit fullscreen mode

As the restaurant grows busier, waiting time increases.

The problem is not the customers.

The problem is the process.

HTTP/1.1 faced a similar challenge as web applications became more complex.


What Is Head-of-Line Blocking?

Suppose the browser requests:

1. HTML
2. CSS
3. app.js
4. hero-image.jpg
5. font.woff
Enter fullscreen mode Exit fullscreen mode

Now imagine the image is several megabytes.

HTML             βœ… Complete
CSS              βœ… Complete
hero-image.jpg   ⏳ Slow
app.js           ❌ Waiting
font.woff        ❌ Waiting
Enter fullscreen mode Exit fullscreen mode

The image becomes the bottleneck.

Resources behind it must wait.

This phenomenon is called Head-of-Line Blocking.

A single slow transfer can reduce the performance of everything behind it.

Think of it like a traffic accident blocking an entire lane of vehicles.

The vehicles themselves are not the problem.

The blockage is.


Browser Engineers Fought Back

Browser vendors quickly realized that relying on a single connection was inefficient.

Instead of waiting for one connection to finish, browsers started opening multiple TCP connections.

A simplified example:

Browser
 β”œβ”€β”€ TCP Connection 1
 β”œβ”€β”€ TCP Connection 2
 β”œβ”€β”€ TCP Connection 3
 β”œβ”€β”€ TCP Connection 4
 β”œβ”€β”€ TCP Connection 5
 └── TCP Connection 6
Enter fullscreen mode Exit fullscreen mode

Now multiple files could be downloaded simultaneously.

This significantly improved perceived performance.

For many years, browsers commonly opened around six parallel connections per domain.

At first, this seemed like the perfect solution.

But it introduced new costs.


Why More Connections Create More Overhead

Every TCP connection is not free.

Before any useful data can be transferred, a connection must be established.

Client
   ↓
 SYN
   ↓
 SYN-ACK
   ↓
 ACK
   ↓
 Connection Ready
Enter fullscreen mode Exit fullscreen mode

Only after the TCP handshake can data begin flowing.

If six connections are opened:

6 Handshakes
6 Connection States
6 Buffers
6 Resource Allocations
Enter fullscreen mode Exit fullscreen mode

The browser spends more effort.

The server spends more effort.

The network carries more overhead.

What started as a workaround eventually became part of the problem.

Engineers realized they were compensating for protocol limitations rather than eliminating them.


The Turning Point

By the early 2010s, the web had become dramatically different from the web HTTP/1.1 was originally designed for.

Developers were building:

  • Gmail-like applications
  • Facebook-style feeds
  • Streaming platforms
  • Real-time dashboards
  • Large e-commerce systems

The industry needed a way to efficiently transfer many resources without opening dozens of connections.

The goal became clear:

Instead of using many TCP connections inefficiently, use one connection intelligently.

That idea became the foundation of HTTP/2.


Key Takeaways

  • HTTP/1.1 was designed for a much simpler web.
  • Modern applications require far more network requests than early websites.
  • Head-of-Line Blocking can cause slow resources to delay others.
  • Browsers worked around this limitation by opening multiple TCP connections.
  • Multiple connections improved performance but increased overhead.
  • The web eventually reached a point where workarounds were no longer enough.
  • HTTP/2 was created to solve these architectural limitations more efficiently.

Top comments (0)