
HTTP (Hypertext Transfer Protocol), as the foundational communication protocol of the World Wide Web, has undergone progressive evolution from simplicity to complexity since its proposal by Tim Berners-Lee in 1991.
This article systematically analyzes the core features, design philosophies, and evolutionary logic of three milestone versions—HTTP 0.9, HTTP 1.0, and HTTP 1.1—from a technical architecture perspective. It focuses on the interaction mechanisms between each version and the TCP protocol, as well as their impact on web performance.
Before delving into HTTP protocol evolution, readers should have a basic understanding of TCP protocol concepts, including but not limited to:
To supplement TCP knowledge, refer to this article:
As the foundational protocol of the Web, HTTP/0.9 was designed and implemented by Tim Berners-Lee in 1991. Its minimalist architecture reflected the core requirement of early "hypertext transfer." Though limited in functionality, this initial version established the basic client-server interaction model.
Minimalist Request Model
GET <path>\r\nLimited Response Handling
Stateless Communication
Client Server
|-------- SYN ----------->| |
|<------- SYN+ACK --------| | TCP three-way handshake
|-------- ACK ----------->| |
|---- GET /index.html --->| | Request starts
|<----- <HTML>...</HTML> -| | Response data
|-------- FIN ----------->| |
|<------- FIN+ACK --------| | TCP four-way handshakeConnection Characteristics:
/* Request */
GET /sample.html
/* Response */
<HTML>
<head><title>Sample Page</title></head>
<body>...</body>
</HTML>Missing Features
Performance Bottlenecks
Scalability Issues
Historical Note: This simple design was acceptable in the era of 56K modems, but as web applications grew more complex, its limitations quickly became apparent, directly leading to the standardization of HTTP/1.0.
As the first formally standardized HTTP version, HTTP/1.0 (defined in RFC 1945) marked the transition of web protocols from labs to commercial applications. This version addressed core flaws of 0.9 through structured design, laying the foundation for modern web architecture.
Metadata Framework
Protocol Extensibility
Security System
Client Server
|-------- SYN ----------->| |
|<------- SYN+ACK --------| | TCP three-way handshake
|-------- ACK ----------->| |
|-- GET /index.html HTTP/1.0 -->| |
|<-- HTTP/1.0 200 OK ----------| |
|<-- Content-Type: text/html ---| |
|<-- Content-Length: 1024 -----| |
|<-- <HTML>...</HTML> ---------| |
|-------- FIN ----------->| |
|<------- FIN+ACK --------| |Key Header Fields:
| Type | Example Field | Description |
|---|---|---|
| Request | Accept: text/html | Content negotiation |
User-Agent: Mozilla/4.0 | Client identification | |
| Response | Content-Type: image/gif | Content type declaration |
Content-Encoding: gzip | Transfer encoding |
Experimental Persistent Connections
Connection: keep-alivePerformance Trade-offs
/* Request */
GET /profile.html HTTP/1.0
Accept: text/html, image/gif
User-Agent: Mozilla/5.0
/* Response */
HTTP/1.0 200 OK
Content-Type: text/html
Content-Length: 2048
Server: Apache/1.3
<html>...</html>Connection Management Flaws
Performance Bottlenecks
Inadequate Caching
Engineering Impact: These limitations led developers to adopt workarounds like CSS Sprites and domain sharding—practices that influenced web optimization even into the HTTP/2 era.
As a milestone in HTTP evolution, HTTP/1.1 (defined in RFC 2068 (1997) and RFC 2616 (1999)) established the communication framework supporting the modern internet. Its design philosophy shifted from "document transfer" to "application platform."
Connection Efficiency Revolution
Enhanced Caching
Cache-Control and Expires (no server validation needed)Last-Modified/If-Modified-Since and ETag/If-None-MatchContent Transfer Optimizations
Transfer-Encoding: chunked)Range/Content-Range)Content-Encoding)Client Server
|-------- SYN ----------->| |
|<------- SYN+ACK --------| | TCP three-way handshake
|-------- ACK ----------->| |
|-- GET /a HTTP/1.1 ---->| |
|-- GET /b HTTP/1.1 ---->| | Pipelining attempt
|<-- 200 OK /a ----------| |
|<-- 200 OK /b ----------| |
|-- POST /c HTTP/1.1 --->| |
|<-- 201 Created --------| |
|-------- FIN ----------->| | Idle timeout
|<------- FIN+ACK --------| |Key Header Advancements:
Cache-Control directives)If-Match/If-None-Match)Connection Reuse Strategies
Slow Start Adaptation
TIME_WAIT Challenges
# Typical TIME_WAIT accumulation issue
for i in range(10000):
conn = create_connection()
send_request(conn)
close_connection(conn) # Each connection enters TIME_WAIT/* Request */
GET /app.js HTTP/1.1
Host: cdn.example.com
Accept-Encoding: gzip, deflate
If-None-Match: "abc123"
/* Response */
HTTP/1.1 304 Not Modified
ETag: "abc123"
Cache-Control: max-age=3600
Connection: keep-alivePerformance Optimization Techniques
CDN Acceleration Strategies
This article traced HTTP's evolution from the one-line simplicity of 0.9, through 1.0's structured headers and status codes, to 1.1's persistent connections and caching. But even HTTP/1.1's optimizations couldn't overcome fundamental bottlenecks: head-of-line blocking, redundant headers, and the 6-connection limit per domain.
But HTTP/1.1 also introduced caching mechanisms (Cache-Control, ETag, Last-Modified) that were only briefly mentioned at the time — yet in real-world development, they're the HTTP feature you interact with most. User reports that "the page didn't update" after a deployment? Nine times out of ten, the caching configuration is wrong.
The next article dives into HTTP caching mechanisms — systematically breaking down the complete decision flow of strong cache and negotiated cache, plus the best practices of content hashing and immutable caching in front-end engineering.