Skip to main content

图解 HTTP - [日] 上野宣

PhIrWT

本书对互联网基盘——HTTP 协议进行了全面系统的介绍。作者由 HTTP 协议的发展史娓娓道来,严谨细致地剖析了 HTTP 协议的结构,列举诸多常见通信场景及实战案例。本书的特色为在讲解的同时,辅以大量生动形象的通信图例,更好地帮助读者深刻理解 HTTP 通信过程中客户端与服务器之间的交互情况。

关于作者

上野宣 是日本知名的网络技术专家和教育者:

  • 网络技术顾问:专注于 Web 技术和网络协议的研究与咨询
  • 技术作家:著有多本网络技术相关的入门和进阶书籍
  • 教育家:擅长用通俗易懂的方式讲解复杂的技术概念

上野宣以其"图解"系列的写作风格著称,通过大量直观的图表帮助读者理解抽象的网络协议概念。

核心内容

1. HTTP 基础

HTTP 请求报文格式:

请求行:GET /index.html HTTP/1.1
请求头:
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive

请求体:(POST 请求时包含数据)
HTTP 响应报文格式:

状态行:HTTP/1.1 200 OK
响应头:
Server: nginx
Content-Type: text/html; charset=UTF-8
Content-Length: 1234
Set-Cookie: sessionId=abc123; Path=/; HttpOnly

响应体:<html>...</html>

2. HTTP 方法

// GET - 获取资源
GET /api/users/123 HTTP/1.1
Host: api.example.com

// POST - 创建资源
POST /api/users HTTP/1.1
Host: api.example.com
Content-Type: application/json

{
"name": "Alice",
"email": "alice@example.com"
}

// PUT - 更新资源(全量)
PUT /api/users/123 HTTP/1.1
Host: api.example.com
Content-Type: application/json

{
"name": "Alice Updated",
"email": "alice.updated@example.com"
}

// PATCH - 更新资源(部分)
PATCH /api/users/123 HTTP/1.1
Host: api.example.com
Content-Type: application/json

{
"name": "Alice New"
}

// DELETE - 删除资源
DELETE /api/users/123 HTTP/1.1
Host: api.example.com

3. 状态码

1xx - 信息性状态码
100 Continue - 继续发送请求体

2xx - 成功状态码
200 OK - 请求成功
201 Created - 资源创建成功
204 No Content - 成功但无返回内容

3xx - 重定向状态码
301 Moved Permanently - 永久重定向
302 Found - 临时重定向
304 Not Modified - 资源未修改(缓存)

4xx - 客户端错误
400 Bad Request - 请求语法错误
401 Unauthorized - 需要认证
403 Forbidden - 禁止访问
404 Not Found - 资源不存在
429 Too Many Requests - 请求过于频繁

5xx - 服务器错误
500 Internal Server Error - 服务器内部错误
502 Bad Gateway - 网关错误
503 Service Unavailable - 服务不可用
504 Gateway Timeout - 网关超时

4. HTTP 首部字段

// 通用首部
Connection: keep-alive
Date: Mon, 23 May 2022 12:00:00 GMT
Cache-Control: no-cache, no-store, must-revalidate

// 请求首部
Accept: application/json
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
User-Agent: Mozilla/5.0...
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

// 响应首部
Content-Type: application/json; charset=utf-8
Content-Length: 1234
Set-Cookie: sessionId=abc123; HttpOnly; Secure
Access-Control-Allow-Origin: *

// 实体首部
Content-Encoding: gzip
Content-Range: bytes 0-1023/2048
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT

5. 缓存机制

// 强缓存
Cache-Control: max-age=3600 // 1 小时内有效
Expires: Wed, 21 Oct 2015 07:28:00 GMT // 过期时间

// 协商缓存
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT

// 请求时验证
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT

// 响应 304 表示未修改,使用缓存
HTTP/1.1 304 Not Modified
// 服务器设置 Cookie
Set-Cookie: sessionId=abc123; Path=/; Domain=.example.com;
Expires=Wed, 21 Oct 2023 07:28:00 GMT;
HttpOnly; Secure; SameSite=Strict

// 客户端发送 Cookie
Cookie: sessionId=abc123; userId=123

// Cookie 属性说明
Path=/ // 路径范围
Domain=.example.com // 域名范围
Expires=... // 过期时间
Max-Age=3600 // 有效期(秒)
HttpOnly // 禁止 JavaScript 访问
Secure // 仅 HTTPS 传输
SameSite=Strict // CSRF 防护

7. HTTPS 与 SSL/TLS

HTTPS = HTTP + SSL/TLS

SSL/TLS 握手流程:

1. Client Hello
- 客户端发送支持的加密套件
- 生成随机数 A

2. Server Hello
- 服务器选择加密套件
- 生成随机数 B
- 发送证书(包含公钥)

3. 密钥交换
- 客户端验证证书
- 生成随机数 C(预主密钥)
- 用服务器公钥加密 C 发送

4. 生成会话密钥
- 双方用 A+B+C 生成相同的会话密钥
- 后续通信使用对称加密

5. 加密通信开始

8. HTTP/2 新特性

HTTP/2 vs HTTP/1.1:

1. 二进制分帧层
- 消息分解为帧(Frame)
- 帧可以交错传输,提高效率

2. 多路复用
- 多个请求/响应在同一连接上并行
- 解决队头阻塞问题

3. 头部压缩
- HPACK 压缩算法
- 减少重复头部信息

4. 服务器推送
- 服务器主动推送资源给客户端
- 减少往返延迟

5. 优先级
- 可以为帧设置优先级
- 重要资源优先传输

经典摘录

HTTP 是互联网的基础协议,理解 HTTP 是理解 Web 的第一步。

HTTP 是无状态协议,这意味着每个请求都是独立的。Cookie 和 Session 是为了弥补这一特性而设计的。

缓存是优化 Web 性能最有效的手段之一。正确使用缓存可以显著减少服务器负载和网络延迟。

HTTPS 不再是可选项,而是现代 Web 的必备条件。

读书心得

《图解 HTTP》是一本非常适合入门的 HTTP 协议书籍。作者用大量直观的图表,将抽象的协议概念具象化,让读者能够清晰地理解 HTTP 通信的全过程。

书中对我帮助最大的是缓存机制部分。强缓存(Cache-Control、Expires)和协商缓存(ETag、Last-Modified)的配合使用,是前端性能优化的核心手段。理解这些机制,可以帮助我们在实际项目中合理设置缓存策略,减少不必要的网络请求。

HTTPS 原理部分也讲解得非常清晰。从对称加密到非对称加密,从 CA 证书到 SSL 握手,书中用通俗的语言解释了 HTTPS 如何保证通信安全。

虽然书中部分内容(如 HTTP/2)可能随着技术发展有所更新,但 HTTP 的核心概念是相对稳定的。这本书建立的 HTTP 知识体系,是学习更高级网络概念的基础。

对于前端开发者来说,理解 HTTP 协议不仅能帮助我们更好地调试网络问题,还能在性能优化、安全加固等方面做出更明智的决策。

强烈建议每位前端开发者都认真阅读这本书,它会让你的技术基础更加扎实。