# 近十年来HTTP=:物理故事_,中空},和拼凑适应

<!--category-- HTTP, Networking, Web Development, Opinion -->
<datetime class="hidden">2025-12-28T18:00</datetime>

HTTP曾经进化 't进化 *强制* 由物理和滥用改变 ,+Lantency_,+和.

每一个版本都存在, 因为上一个版本碰到了严格的限制@. @如果你理解这些限制的话#,}你就能明白为什么网络运作的方式是“-+”以及为何如此多的“MS K3+Best practices @"+”实际上就是协议限制的变通办法 weQ'_一直拖着三十年

I'自从“1997. I've debuged HTTP}连接暴风雨 , 观看浏览器打开了六个连接 每个主机的@" featal", 被HTTP{/2'}诅咒的 TCP HeadMSKO8ofMS K9在移动网络上封隔 最后看到HTppMS11 承认我们所知道的一切

这是关于我们如何来到这里的故事 .

[TOC]

## HTTP/1.0: 永久文本超过不可信赖的管道

### 制造它的世界

HTTP/1.0在“1996”中设计为一个不再存在的世界。 “.为了理解它为何有效? ”你需要了解“"WebMS K5在‘1996:’中的意指什么?

- **拨号连接** 如果你运气好的话 )
- **页数为文件** @ -_ text@ MS K1} 也许有些小图像 @ I,超链接
- **用户点击并等待** @- 即时响应@'* t 预期
- **服务器价格昂贵** 大学和公司不是每个人都有

在这个世界上,瓶颈是 **带宽**@,@ not lantency_.}一个 50#KB 页花了几秒时间下载拨号@.。

**HTTP/1.0 优化到 @:**

- 简单性 @ ( @ debuggable 可使用 Talnet@ MS K1调试
- @(_servers do'}跟踪连接@)
- Human -可读性(text协议MS K2
- 1项请求*MSK01应答 *,}连接已关闭

```
GET /index.html HTTP/1.0
Host: example.com

HTTP/1.0 200 OK
Content-Type: text/html

<html>...
```

simple.Elegant.完美于 @1996.,除了文档检索@.以外,完全不能用于任何其它用途

### 压力打破它

然后网络变换了“. fast.”

@1998,}頁面是{'.}他們有樣式表{,} JavaScript} ,}多個影像}.}一個單頁可能需要{MS K6}各種資源MS K7}{

每一份请求都要求@: @

1. **TCP 握手** (1RT)
2. **请求@/_# 第一字节** (~1RT)
3. **收到答复**
4. **连接已关闭**
5. 重复每个图像@,}样式表 @ ,}脚本@ MS K2}

“20Q 资源”一页的意思是“20Q TCP handhakees @.Q ” 在“MS K3QMs Lantency connational ”上“(Z}仍然常见的@),,这“MSC6Qs 4Q 秒”。 *握手* 在任何内容被传输前@. @%

HTTP/1.0:的基本假设

> **时间是便宜的 @. @**

在“1996, ” 中, “. Bandwidth ” 是“由 @1999,带宽改善而形成的瓶颈”。 **长期性是't** @- 突然间,这些往返旅行又重要了#.

HTTP/1.0 是为文档设计的 < .> 网络已变成一个应用平台\ . 某种东西必须给@.}

## HTTP /1.1:+W#'全补丁

### 制造它的世界

HTTP=MSKK0}当网络爆炸时,HTTP@1997,就抵达了 @MSK 1 网络繁荣开始启动{.}每个企业都需要一个网站}#. 网页正在变得复杂

压力是清晰的 **@- @ per@ -_ 请求是杀死性能**但完全重新设计 HTTP 是一个选项 @'}% 2# # 太多的基础设施已经依赖它@ ._ 解决方案必须是向后 @ MS K4\ complete=. @ *

**改变什么了 @: @ @**

- **长期连接** (`Connection: keep-alive` 重新使用 TCP 连接
- **显示的传输编码** @(_River 响应, 不知道大小前端@)_Q#
- **东道主信头** @(_jirtual 主机@-}每个IPQ,}多个站点对共享主机来说至关重要
- **缓存语义** (`Cache-Control`, `ETag`有条件的请求 )
- **管道** @(_sess 发送多项请求,

**是什么改变了什么?**

- 仍依次回应 @(_甚至用管线@)}#
- 文本页眉 @ ( @ repeated a every request_) @
- 每次连接时仍一个答复

```
GET /page.html HTTP/1.1
Host: example.com
Connection: keep-alive

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Cache-Control: max-age=3600

...
```

### 为何会继续工作

HTTPMSKO 有效解答性能问题{'它只是移到.}

**管道是失败的** Spec 允许发送一个连接的多次请求@, @ but:{}

- 反应必须回来 *顺序顺序* @(_head@-_of#-}封锁线路=)
- 一个反应迟缓 堵住了背后的一切
- Buggy近似物
- 大多数浏览器都完全禁用

所以浏览器欺骗了. 而不是修补协议 , 他们围绕它工作

- 开放 **6 每个主机的平行连接** (browser 限制 @)
- 使用 **域分隔** (`static1.example.com`, `static2.example.com`) 乘以连接
- **精版工作表** 组合图像
- **CSS/JS 捆绑** 减少请求
- **CDNs 光盘** 减少延迟时间

这是整个生态系统对HTTP+/1.1'的补偿 基本限制 .

> **HTTP/1.1 由作弊MS K1 缩放,而不是通过修补模型.**

### 为何它生存至今

HTTP/1.1 工作 *足够充分* 十五年的.不是因为好 而是因为环境补偿了:

- **宽带已抵达 @.** @20#ms handhakees 而不是@200 @ms@MS K2}痛苦是可以忍受的 @MSC3}
- **摩尔・' 法律帮助 .** 服务器可以处理每个浏览器的六个连接, 由 @ 2005. @%
- **CDN 掩盖问题@. @%** 远端服务器 @ 20 @ ms away
- **桌面控制@. @%** 线性连接, 低延迟 , 可靠网络MS K2

协议还是被打破了 我们只是幸运的是 世界在隐藏它

### 实际成本

每个主机的六个连接是 @'_t free}:

- 每个连接意味着另一个TCP握手
- 每个连接都竞争带宽
- 服务器必须维持更多同时连接
- **标题@ -_ of @ MS K1 @ 线阻塞刚刚移到 TCP** - 丢失一个连接的包@, 连接摊位

HTTP/1.1时代的网络速度加快了,但并非因为HTTP□.}而不是由于HTppMSSK2}它的速度更快是因为@:

- 网络速度加快
- Caching变聪明了
- 吸收的中继延迟时间
- 浏览器在平行操作方面变得更好

我们当时在文件检索协议上建立了一个应用平台 程序正在丢失

## 无人承认的令人不适的真相

@2010,@ web spect was a always battle against 反对HTTP本身的网络表现=.

当今时代的"最佳实践 " 讲述这个故事

- 将全部 JavaScript 集中成一个文件
- 将所有您的图像拼在一起
- 内联关键通信支助系统
- 使用数据 URI 来避免请求
- 无法打开更多连接的域块
- 将脚本放在页面底部

其中每一个都是为 @"#HTTP@/1.1}(可以有效处理许多请求) 有效的."

我建造了许多这些小工具, 比如斯普莱特发电机@,CSS压缩机 @,我们开始使用响应压缩等 asQZ...

由于 HTTP 改进了@.}浏览器速度更快,它们之所以快是因为 **围绕HTTP工作**.

每个主机有6个连接不是特性@. @ it'_%s 黑客{.}(域块分割并非最佳做法) @.#ItMS K4}*接纳失败<.> *

我花了几年时间教开发者如何捆绑资产\,sprite image ,和内线关键资源\". 这没有一个是"}好的建筑_."它 **规程损害控制**.

@"_HTTP 很简单@"#神话,

- 浏览器连接管理
- CDN 边缘逻辑
- 构建工具连接
- 服务器连接连接集合

HTTP/1.1}因为一切都有效 *周围* 它加班工作来补偿.

如果您见过 HTTP 的图表, 该图是否显示 lantency\ 't 显示 Latentency", 丢失\ , 或失败模式@, it'} 它在欺骗您吗?. 协议很简单: @. 现实是#'\ tMS K9

## HTTP/2:}我们修好了错误的图层

### 制造它的世界

网络又变换了两次大规模转变改变了一切。

**@1. 動作發生了 @.**
iPhone 由 @2012,移动网络流量在@. 突然用户在#-的有线宽带@MS K4 他们当时在 @3G,}然后是{4G□,, 且具有可变延迟度和频繁丢失包MSQ9。 HTTPMS K10可以容忍的假设打破了.

**网络应用程序取代网页@.**
Gmail.Google MapsMPK1FacebookMS K2Twitter.这些带有链接的 't文档@.它们需要数十或数百个资源{, realMSKO7}时间更新_,和即时响应\.每个主机的#MSK106个连接}<"黑客正在显示其年龄=.}

Google感受到了这种痛苦, 他们有大规模规模的“,”性能 ” “-'obsessed Engineers"\, 而证明 HTTP/1.1"的数据是

### SPDY:谷歌'实验

校对:Soup

**SPDY介绍什么 :**

- **二进制框架** 而不是文本解析
- **多交串流** 对单个 TCP 连接
- **标题压缩** (later 精炼为 HHPACK 用于 HTTP/2)
- **服务器推** 积极主动地交付资源
- **串流优先排序** 首先装载关键资源

Google在Chrome和他们自己的服务中部署SPDY@.,GmailZ, 谷歌搜索{,和YouTube都运行着SPDie}.。 结果令人信服:: 40-60% lantency

**HTTP/2:的路径**

SPDY 证明了这些概念起作用了 @.IETF注意到并使用spdy作为 HTTP/2.的起点。 最后 HTP/2spec {(2015)是'和SPDie MS K5头压缩完全相同

HTTP=/2}HTTP*.*#任务完成后, Google在“2016 ” 中将SPDY销毁。

**HTTP/2 改变了#(}在SPDY}):_BARBAR_**

- **二进制框架** (not text @- 更有效率的解析@)
- **多重驱动** “(” 多个请求“/” 在一条连接上断开的答覆“MS K2”
- **标题压缩** @(_HAPACK#-}不再重复相同的标题@)
- **服务器推** @(_send resources before clients ask {-}虽然事实证明这很难正确调和,
- **每一来源单一连接** @(Q#没有连接爆炸@)

```
┌──────────────────────────────────────────┐
│           Single TCP Connection          │
├──────────────────────────────────────────┤
│ Stream 1: GET /page.html                 │
│ Stream 3: GET /style.css                 │
│ Stream 5: GET /app.js                    │
│ Stream 7: GET /logo.png                  │
│ (all interleaved, no ordering required)  │
└──────────────────────────────────────────┘
```

这是 HTTP/1.1 管线应为 @ . 流体是独立的@. 一个缓慢的响应 :\ ' t阻隔了其他{.#MSK4 信头被压缩}%. 协议最终和我们如何实际使用 web+.}

### 它为什么在正确的网络上工作?

HTTP/2是 **用于宽带网络的完美**在“2015,”中,当宽带在发达世界无处不在时,

**有何改进?**

- 轻型载荷下的延迟时间@(one connection @,}请勿按要求握手*)
- 更少连接@ ( @ nonless server subject *\ MS K1} 少一点 TCP 慢点@ MPK2_ start)}
- 更好的带宽利用率 @ ( @ no 人工连接限制@)
- 标题压缩 @ ( @ repeated headers like cookie 不再花费带宽@ MS K1 @
- 不再需要连接@/ @spriming 需要 (}%many 小文件现在都很好 @)

对于与低包装损失连接的用户来说 , HTTP/2是一个真正的进步

### 压力打破它

但世界已经向前进了 **手机是网络流量的绝大部分**

移动网络有一个基本特性, 它具有宽带功能't: **软件包丢失是常见且无法预测的**.

TCP担保TCP保证 **在 - 发送订单**. 如果包“47”丢失了 “,”套件 “MS K3”等待“47”被重新传送 即使属于完全独立的 HTTP}/2流 *.*

```
┌──────────────────────────────────────────┐
│              TCP Receive Buffer          │
├──────────────────────────────────────────┤
│ [pkt 45][pkt 46][  ?  ][pkt 48][pkt 49]  │
│                   ↑                       │
│         Waiting for packet 47             │
│                                          │
│ Stream 1 data: BLOCKED                   │
│ Stream 3 data: BLOCKED                   │
│ Stream 5 data: BLOCKED (has pkt 48-49)   │
│ Stream 7 data: BLOCKED                   │
└──────────────────────────────────────────┘
```

HTTP/2解了头@-of @-在应用层的阻塞线\ .之后, TCP又在运输层重新启用它+.

**一个丢失的包摊位全部流@ . @ {}** 在无线连接中 ,包损失是稀有的 .在移动网络上 *,丢失 WiFi,或嵌入链接*?包装箱损失是恒定的\. 而且因为 HTTPMS K6使用 *单* @(# by design *% 1} 现在一个丢失的封包块 *一切一切* 而不是六个连接中的一个@. @%

HTTP/2 性能 @:

- **Wired,低损失**超赞
- **Mobile,中度损失**有时 *更严重* HTTP/1.1
- **高悬浮度=,}任何损失***:灾难*

讽刺的@: HTTP/2本意是修补网络上的多环问题 @- 就像手机让人无法忽略#. TCPMS K5保证在移动上比它取代的协议更糟糕一样

### {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}为什么?

最初的HTTP=/2}部署显示有真正的改善

- 连接更少意味着初始卸载速度更快@( @TLS holdhake once @,}不是六倍\)
- 标题压缩减少间接费用
- 对同一来源的资产来说,多重驱动作用很大

我为“1.1?”设计的所有这些工具 突然用 HTTP@/2,}(突然的捆绑)消失了, 是一个BAD的东西 “.HTP/2'}多路转换对于同一来源的资产来说是件好事。“MS K4 ” 但是它帮助了交叉“- 原始请求” (ZMSK6) 我们不得不在这个网站上建立新工具来包装这些“MSKO8” 网包,例如“MSC9’

但尾部延时服却说了一个不同的故事 . *中位* P99越来越差了

我看到了这个第一手的: 客户端在他们的CDN上启用 HTTPMS K1, 并观看了移动 PQ99 lantency *增加数* 仪表板显示在桌面上有所改进 支持票来自移动用户 . 我们花了一周时间发现 HTTP/2'

当HTTP/2工作时,当一个软件包在最坏的瞬间滴落到移动连接上 ,所有东西都冻结了 .用户通知的冻结量超过他们注意到的快速中位数

根本问题:

> **HTTP/2 假设TCP足够好**

对于宽带来说,它是. @,}对于移动机来说是'{t.} 当HTTP=/2}被标准化的时候 ,}手机已经赢得了.+W@'#d

## HTTP /3: Fine,WeMS K2ll 向下堆叠移动

### 制造它的世界

证据确凿, **TCP就是问题所在**.

Google自“2012.”以来就一直在实验性地运行 Quick(QUIC) 。 他们拥有移动网络上的数据@. 丢失的 WiFi,和高端-latency connations @, HTTPMSSK6在不改变运输层的情况下无法固定

但是您可以只做 @"@fix TCP% ." @ it'}在操作系统内执行的操作核心 @MS K4 @ It\'#烤入每一个路由{,}防火墙_,}和互联网上的中继箱<.}改变TCP意味着要等几十年才能整个网络基础设施升级=.}

所以谷歌做了一些大胆的事 **他们在UDP上建了一个新的运输协议书**.

### QUIC: 取代 TCP {(MS K2 的《议定书》

QUIC @( 原创@"Quick UDP Internet connects", 现在只是QUIC{) 是一个跨越 UDP的运输协议,但提供 TCP}-}类似可靠性\.}关键洞察力=:} **在用户空间中执行可靠性@,, 在那里您可以快速循环**.

**为何UDP是一个基金会?**

UDP 刻意最小化@. @ 它为 IP 添加端口号, 为 I... @ 基本是 @ . @ 无手握 @ MPK4 @ 没有可靠性@ MS K5}没有命令@ OMK6 @ 容器无法按顺序运达\ , 重复=, @ 或完全不按%. @ UDP 不按'# t关紧Q.{ *

QUIC需要的正是Quick@._BARBAR_在 UDP_,\QUIC 的基础上,

- **无内核变化的部署** @- @ it@ ' @s 只是一座图书馆
- **迅速变热** “- 铬不断更新船上新的QUIC版本”
- **通过大多数防火墙** - UDP 端口 @443 通常工作
- **实施其自身的交通堵塞控制** - @% 没有粘贴到 TCPQ'\%s 算法

**QUIC的不同做法 @: **

@| @Concern @| @TCP @I| @QUIC @MS K3}关注 TCP @ MSK2_QUIC@|#
|---------|-----|------|
| **可靠性单位** | 连接 MS K1 流 *| *
| **握手** | TCP +TLS 分开MS K2 并合(faster})|
| **加密加密** @|可選擇的 (TLS) | 强制的 @MS K4設計@-in})Z|
| **标题@ - @ of @ MS K1 @ line clock** @|所有数据屏蔽@| 仅受到影响的溪流\|
| **连接身份** @|}IP IP I+}港口 | 连接 ID *| *
| **执行 执行情况** @ |_ Kernel @ MPK1# 用户空间@| @

此连接的 ID 特别智能@. @ tCP 通过IP 地址和端口@ .} 更改“ MS K2 @ switch Wifi 网络”\ , NAT 重新绑定@ I), 而此连接 {.} QUIC 使用一个在网络变更中幸存的连接标识+.}

**HTTP/3:的路径**

就像SPDY导致HTP/2,Google'QUIC实验导致 HTTPMS K2IETF标准化的 QuIC在 @2021@(RCC\9000),和HTTP□/3Z(BRC _9114)只是居于QUC之上的 HTIP语义学,而不是 TCP{.}

标准化的 QUIC 与 Google @' @%s 在一些细节上不同于原创的Googla@(}(密码握手被重新修改),}有些标题格式已经更改了\),}但是核心架构 {-}串流在 UDP @MS K5}中独立恢复了损失

HTTP/3 (2022) 是在 QUIC}. It' 上的HTTP

**HTTP/3}改变了什么 :**

- **QUIC 对 UDP** {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}(not TCP )
- **Stream- 损失程度恢复** @(one lost back only shalls its flank_)}一袋丢失的包只拖住它的小溪 #MSK 1#
- **快速连接设置** @(0-RTT 可能恢复@)#
- **默认加密** QUIC=) 内建的(TLS1.3
- **连接移徙** @(_survives IP 地址更改@)_#

```
┌──────────────────────────────────────────┐
│              QUIC Connection             │
├──────────────────────────────────────────┤
│ Stream 1: [pkt][pkt][pkt] ← flowing      │
│ Stream 3: [pkt][ ? ][pkt] ← waiting      │
│ Stream 5: [pkt][pkt][pkt] ← flowing      │
│ Stream 7: [pkt][pkt]      ← flowing      │
│                                          │
│ Lost packet only affects Stream 3        │
└──────────────────────────────────────────┘
```

**保持原样的是什么?**

- HTTP 语义学 _(GET, POST},标题 *,状态代码=)
- 缓存逻辑
- REST模式
- 应用层的每件事物

> **HTTP/3 曾 ' t change HTppMS K2 它改变了HTTP如何生存到现实**

### 为何QUIC事务@( @In detail_)#

QUIC实施TCP'*%s可靠性保证 *每个溪流*这是修复 HTTP /2'的关键洞察力

**TCP' 承诺 :** 每个字节都按顺序到达."
**QUIC='}预言: :** 每个字节 " *在此串流中* 已按顺序到达@." @%

这就是为什么 HTTPMSKK0}HTTP{MSKO在失去的網絡上崩溃的原因吗?

**溪流独立**

在 QUIC\ , 中,每个 HTTP 请求@/}回应对配方都拥有自己的流 *.*在逻辑上是独立的 _-}它们共享一个连接来提高效率\,}但一流的包丢失 {'*t block others}.}

```
QUIC Connection
├── Stream 1: GET /index.html     [packets 1, 2, 3]
├── Stream 3: GET /style.css      [packets 4, 5]     ← packet 5 lost
├── Stream 5: GET /app.js         [packets 6, 7, 8]
└── Stream 7: GET /logo.png       [packets 9, 10]

Packet 5 is retransmitted. Only Stream 3 waits.
Streams 1, 5, 7 continue unaffected.
```

与 HTTP/2相比, 在 TCPMS K1中, 所有这些流都共享一个 TCP 字节序列@ . 丢掉一包\ , 一切等待 @ .

**连接移民@: @%**

TCP 通过“ 4-tuple:}源代码 IP,}来源端口@,}目的地 IP},}目的端口 @.}改变其中任何一条连接,且此连接已绝迹

```
Phone on WiFi → walks out of range → switches to cellular
TCP: Source IP changed. Connection dead. Full reconnect.
QUIC: Connection ID unchanged. Streams continue seamlessly.
```

这一点之所以重要,是因为移动用户 *连续* ,}所有连接都死了 I. QUIC=,你甚至可能没有注意到.吗?

**-=YTET -伊甸园字幕组=- 翻译:**

传统 TCP @+TLS在发送数据前需要多次往返访问@:

1. TCP SYN /SYN-ACK}/ACC NSK3RTMS K4
2. TLS 握手 @ (1-2 @ RTT)@
3. 发送您的 HTTP 请求

QUIC将交通和密码手电筒连接起来 .}第一个连接需要 @1RT.}但是对于带缓存证书的返回用户来说...",QUIC会提供\0-RTT:}立即发送数据与您的第一个包MS K6}

```
First visit:    Client ──[handshake]──> Server ──[response]──> Client (1 RTT)
Return visit:   Client ──[data]──────────────────[response]──> Client (0 RTT)
```

0-RTT具有安全涵义 @replay attacks is possible *所以它♪'}限於一流请求*. 但对于大多数页面的负荷来说

**首次加密@- @class collegal citizen_:**

TCP 被设计为“ 1970 @s.}加密后通过 TLS@. ” 。 这意味着“: ”

- TCP 信头是普通文本@( @% 任何人都可以看到端口号 @ ,} 序列序号 @)
- 中继箱可以检查和修改 TCP 流量
- 加密是可选的 @ , @ 通常在连接设置后谈判

QUIC 加密程序几乎从一开始就具备了所有内容@. @% 即使软件包号码是加密的\ .}(这只是为了隐私) {'}_BARBAR_它防止了骨质化问题,因为中继箱依赖于能够读取信头@MS K4}使协议无法进化=.}

```
TCP packet:   [IP header][TCP header (plaintext)][TLS encrypted payload]
QUIC packet:  [IP header][UDP header][QUIC header (mostly encrypted)][encrypted payload]
```

### 需要它的世界

HTTP/3 是为我们实际生活在 :的世界设计的

- **移动M-**超过半数的网络流量是移动的
- **不可靠的网络**“: WiFi, 蜂窝 , 拥挤的公共网络”
- **全球用户全球用户**: 与远端服务器的高延迟连接
- **隐私权期望**: 加密是强制性的@,不是可选的

HTTP+/1.0_30年后 假设可靠的有线连接@,_HTTP=/3}承认可靠性是例外{,}而不是规则.}

### 进度成本

HTTP/3是{'}#t freeMS K2#

- **民进党经常被封锁** 返回 HTTP=/2}需要的 @)
- **更多 CPU** QUIC='}%s userspace complace implementation \ (}%not in the cernel like TCP@,}虽然这个缺口随着内核绕道和优化的堆栈而缩小,但这一缺口正在缩小
- **新建调试工具** (tcpdump 显示加密 UDP, 无法读取 HTTP})
- **中中箱干扰** @(_some network mangle UDP 无法预料地拼命拼凑UDP@)

但对于移动的“-”第一个应用程序来说, “,”不可靠的网络“,”和“latency -”敏感服务“MS K4” HTTP%/3”是匹配网络实际行为的第一个版本“.”

## 所有版本的真经验

每个HTTP版本的修改都发生,因为 **环境变化快于协议**.

|版本 @|Eraa @MS K2环境 @|假设@|为什么它打破#|
|---------|-----|-------------|------------|--------------|
|HTTP/1.0| @|DialupMS K5文件{|Bandwidth是瓶颈}|Pages 成为应用程序<,Lantency mattered_|′
@| @Broadband@,#网络应用程序 @|#低延迟隐藏效率不高的隐蔽 #|#手机随包裹丢失而抵达
@, @|#TCP足够可靠,
|HTTP/3| MSSK3 MS K4 移动- 第一次,Global □|}没有东西是可靠的 ~|仍然在部署\...#|

模式是明确的@: @%

1. 议定书是为当前环境设计的
2. 环境变化@(}比协议能够适应的快
3. 工作周期累积@( @CDNs,}连接黑客 @,_Bringling}){
4. 新议定书承认现实
5. 重复重复

协议不断被推到网络的更近处 每一个当环境要求它时 似乎已经足够剥离的抽象信息

**其他意见 @:**

- "+Nateless @"是一个谎言 我们告诉自己在晚上睡觉 每一场会议 cookie@,_auth signal}#,和缓存头目是州管理 we'+ve blocked onQ.}
- 多数成绩优胜者来自 *工作变通办法*,要求所有协议限制的补偿@.
- “" simple @"Q 东西一直在移动”“. HTTP/1.0 很简单”“. 然后我们需要持续连接@.}然后是多路连接=. 然后新的运输#. 每个复杂层解决了真正的问题\.
- **时间问题** HTTP=/2}如果它到达了 @2005., 手机已经改变了游戏@. 协议昨天正在解决_'s problem *.#

## 自 < 1.0 i> 以来, 已改变的是什么?

虽然三十年来协议不断演变 : *

**请求仍失败@. @**
网络分区@.服务器崩溃 @. 超时发生 @MS K2 您的代码仍然需要重试逻辑\.}

**网络仍保留着 #.#**
@200OK @ok does@'}但并不意味着回复正确 *.* 连接关闭但不代表请求成功*'* *%sK5 超时={'}* 不表示服务器没有处理您的请求'}%s.}

**剖腹产仍然提供老化的数据@. @%**
`Cache-Control` 是一个请求@,}不是命令 @.}代理完成他们想要的 .}CDN 无效

**客户端仍然在重试“.”**
用户点击按键@, @ nothing happened ,}再次单击.}现在您有两个请求{.}代理主管事务_.}

**开发者仍然误解了 一等能力 @. @%**
POST是野生西部 . 大多数API都搞错了

```csharp
// This is still your problem, regardless of HTTP version
public async Task<Result> CreateOrderAsync(Order order)
{
    // What happens if this times out?
    // Did the server receive it?
    // Did it process it?
    // Will the client retry?
    // Will you create duplicate orders?
    
    // HTTP/3 doesn't save you here.
    // Idempotency keys do.
}
```

> **如果您不理解这些@ , @ HTTP# MSSK2 @ won' @ t保存您的@ MPK4}**

## 其实我所学到的

在建立所有这些协议版本的网络应用程序后 @, @ here+'_%s what stuck@:#

**协议不是你们的可靠性层**

HTTP 提供您请求的“/” 响应语义@ . @ it doesnó'_ t保证发送@ I,}正确=%,}或确切地说\ -once procession *. 那*'你的工作=.}

**@2._Lantency is the enemy #,}不是带宽#.***

多数性能问题为圆-trip contral,非吞吐捆绑}MS K2减少请求比压缩有效载荷更重要

**“3. ”每个“"”最佳做法“MS K2”都有到期日“MSC3”**

HTTP /1.1. @ it'}对HTTP @/2 @ @ (#打破了单一的-#连结收益 <). @ @{"_Bundule everything into 1 file*"}是福音MS K8}(现在通过 HTP/2}或 HTppZ/3}运输许多小模块

**在真实网络上测量 .**

当地主机的基准证明您在移动网络上的用户 #,#酒店 WiFi,}和饱和的咖啡店连接>.#Test there.

**无聊的零件最重要**

超时@.Retries.巡回断路器 @.Unitedgency.连接集合@MS K4}这些反光细节决定了您的系统是否在负载中工作\.

## 结论结论

HTTP没有跑得更快 因为它变聪明了 . 由于我们终于承认 **网络是问题所在**.

每个版本的时间都是对的 :

- **HTTP/1.0** 适合拨号文件检索
- **HTTP/1.1** 宽带网络应用的完美之处
- **HTTP/2** 用于低端的“-” 光线连接是完美的
- **HTTP/3** 用于构建移动@-_First @,}不可靠的\-网络现实

错误在于认为其中任何一个是永久解决方案@. @它们都是对特定环境压力的响应_.}当环境改变时#,{协议必须遵循\.}

**HTTP 版本不是消费者意义上的升级@.}它们为不同的故障分布提供最佳平衡=.**

毕竟这些基本原理仍保留着

- 请求失败
- 网络谎言
- 抓牢很困难
- 相关性事项

协议进化了 . 问题已经消失了 他们刚刚移动了.

建立能幸存故障的系统@.在真实网络上的测试 @.明白每个HTTP版本都是由它的时代所塑造的一种权衡=%,不是一种过时的升级_.

HTTPMSK130年的HTTP. 和我们建立的网络 .Q, 再过十年...

## 继续阅读

- [RFC 9114:HTTP/3](https://datatracker.ietf.org/doc/html/rfc9114) *- 正式规格
- [RFC *9000:QUIC](https://datatracker.ietf.org/doc/html/rfc9000) 运输协议
- [HTTP/2}解释](https://http2-explained.haxx.se/) 丹尼尔・斯滕贝里・斯登堡・' 精彩的概览
- [高性能浏览器网络化](https://hpbn.co/) @-Ilya Grigorik' 深度下潜#(免费在线@)