一、什么是 HTTP?
HTTP(HyperText Transfer Protocol) 是互联网上最核心的通信协议之一。
它定义了 客户端(Client) 与 服务器(Server) 之间如何请求和传输数据。
HTTP 是万维网(WWW)的基础,支持网页浏览、文件下载、API 调用等应用场景。
简单来说:HTTP 是“浏览器与服务器交流的语言”。
例如当你访问:
https://example.com/index.html
实际上发生了以下几步:
-
浏览器将域名
example.com解析为 IP 地址; -
通过 TCP(或 QUIC)建立连接;
-
向服务器发送 HTTP 请求;
-
服务器返回响应(HTML、图片、JSON 等);
-
浏览器渲染内容给你看。
二、HTTP 协议在网络中的位置
HTTP 位于 应用层,是 TCP/IP 协议族的最上层:
| 层级 | 协议 | 功能 |
|---|---|---|
| 应用层 | HTTP、FTP、SMTP、DNS | 直接为用户提供服务 |
| 传输层 | TCP、UDP | 端到端通信(可靠/不可靠) |
| 网络层 | IP、ICMP | 寻址与路由 |
| 数据链路层 | Ethernet、Wi-Fi | 数据帧传输 |
| 物理层 | 电信号、光信号 | 比特流传输 |
HTTP 依赖于 TCP(可靠传输),而 HTTPS 则依赖于 TCP + TLS。
三、一次完整的 HTTP 通信流程
以浏览器访问网页为例:
-
DNS 解析
-
把域名解析为 IP 地址;
-
可能经过本地缓存、路由器缓存、DNS 服务器等多级解析。
-
-
建立连接
-
HTTP/1.x:三次握手建立 TCP 连接;
-
HTTPS:建立 TCP 后还要进行 TLS 握手(证书验证、密钥交换)。
-
-
发送 HTTP 请求
-
浏览器构造请求报文,包含方法、路径、头、体;
-
通过 TCP 发送给服务器。
-
-
服务器处理请求
-
Web 服务器(如 Nginx)解析报文;
-
交给后端程序(如 Go、Node.js、Python)处理;
-
生成响应。
-
-
返回响应
-
服务器返回状态码、响应头、响应体;
-
浏览器解析内容、执行脚本、加载资源。
-
-
关闭连接或复用
-
HTTP/1.0 默认短连接;
-
HTTP/1.1 及以后支持持久连接(keep-alive)。
-
四、HTTP 报文结构详解
1️⃣ 请求报文(Request)
<请求行>
<请求头>
<空行>
<请求体>
示例:
POST /api/login HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Content-Type: application/json
Content-Length: 35
{"username": "test", "password": "123"}
解析:
-
请求行:请求方法 + 路径 + 协议版本
-
请求头:描述请求的额外信息(类型、长度、认证信息等)
-
请求体:请求内容(POST/PUT 一般包含)
2️⃣ 响应报文(Response)
<状态行>
<响应头>
<空行>
<响应体>
示例:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 45
Set-Cookie: sessionid=abc123; HttpOnly
{"message": "login success", "code": 0}
五、常见 HTTP 方法
| 方法 | 描述 | 是否安全 | 是否幂等 | 是否有请求体 |
|---|---|---|---|---|
| GET | 获取资源 | ✅ | ✅ | ❌ |
| POST | 提交数据(新增) | ❌ | ❌ | ✅ |
| PUT | 更新资源(整体) | ❌ | ✅ | ✅ |
| PATCH | 部分更新资源 | ❌ | ✅ | ✅ |
| DELETE | 删除资源 | ❌ | ✅ | ❌ |
| HEAD | 获取资源元信息 | ✅ | ✅ | ❌ |
| OPTIONS | 查看服务器支持哪些方法 | ✅ | ✅ | ❌ |
💡 幂等:多次调用结果相同,例如多次 DELETE 相同资源。
六、HTTP 状态码全表与解析
| 分类 | 范围 | 含义 |
|---|---|---|
| 1xx | 100–199 | 信息性,表示请求已接收继续处理 |
| 2xx | 200–299 | 成功 |
| 3xx | 300–399 | 重定向 |
| 4xx | 400–499 | 客户端错误 |
| 5xx | 500–599 | 服务器错误 |
常用状态码详解:
✅ 成功类
-
200 OK:请求成功;
-
201 Created:资源已创建;
-
204 No Content:成功但无内容返回。
🔁 重定向类
-
301 Moved Permanently:永久重定向;
-
302 Found:临时重定向;
-
304 Not Modified:使用缓存,无需重新下载。
⚠️ 客户端错误
-
400 Bad Request:请求参数错误;
-
401 Unauthorized:未认证;
-
403 Forbidden:权限不足;
-
404 Not Found:资源不存在;
-
429 Too Many Requests:请求太频繁。
💀 服务器错误
-
500 Internal Server Error:通用错误;
-
502 Bad Gateway:网关错误(上游服务异常);
-
503 Service Unavailable:服务器过载或维护;
-
504 Gateway Timeout:上游超时。
七、HTTP 首部字段详解
📤 请求头
| 字段 | 示例 | 说明 |
|---|---|---|
| Host | example.com | 请求目标主机 |
| User-Agent | Mozilla/5.0 | 客户端信息 |
| Accept | application/json | 希望返回的数据类型 |
| Authorization | Bearer token | 携带认证信息 |
| Cookie | userId=100 | 携带 Cookie |
| Content-Type | application/json | 请求体格式 |
| Referer | https://google.com | 来源页面(防盗链) |
📥 响应头
| 字段 | 示例 | 说明 |
|---|---|---|
| Content-Type | text/html | 返回内容类型 |
| Content-Length | 1024 | 返回体长度 |
| Cache-Control | max-age=3600 | 缓存策略 |
| Set-Cookie | session=abc123 | 设置 Cookie |
| Access-Control-Allow-Origin | * | 允许跨域访问 |
| ETag | "a1b2c3" | 内容唯一标识(缓存验证) |
八、HTTP 的无状态与会话保持
HTTP 是 无状态的,每次请求独立。
服务器不会记住你上次是谁。
解决方案:
1️⃣ Cookie
浏览器保存小段文本,每次请求自动带上:
Set-Cookie: token=abc123; HttpOnly
2️⃣ Session
服务器端保存登录状态,通过 Cookie 里的 session ID 识别用户。
3️⃣ Token / JWT
前后端分离常用方案:
服务器签发 Token,客户端每次请求带上:
Authorization: Bearer eyJhbGciOiJIUzI1Ni...
九、HTTPS:安全版 HTTP
HTTP 是明文传输,容易被窃听。
HTTPS = HTTP + SSL/TLS 加密层。
加密原理(简化流程):
-
浏览器请求 HTTPS;
-
服务器返回数字证书(含公钥);
-
浏览器验证证书;
-
双方协商对称密钥;
-
后续通信都加密传输。
优点:
✅ 防止中间人攻击
✅ 防止数据篡改
✅ 提供身份验证
缺点:
⚠️ 握手开销大(HTTP/2/3 已优化)
⚠️ 证书需付费或维护(Let’s Encrypt 可免费)
十、HTTP 性能优化与演进
🔹 HTTP/1.0 的问题
-
每次请求都要新建 TCP 连接;
-
连接开销大;
-
无法并行下载。
🔹 HTTP/1.1 改进
-
支持 长连接(Keep-Alive);
-
支持 管线化(Pipelining);
-
增加缓存控制头(Cache-Control、ETag)。
🔹 HTTP/2
-
二进制分帧:更高效;
-
多路复用:同一连接并发多个请求;
-
头部压缩(HPACK);
-
服务器推送(Server Push)。
🔹 HTTP/3(基于 QUIC)
-
基于 UDP;
-
0-RTT 连接建立;
-
无队头阻塞;
-
更适合移动网络与高延迟环境。
十一、HTTP 缓存机制详解
缓存是性能优化的关键。
强缓存
由 Cache-Control 或 Expires 控制,命中后浏览器直接用本地副本。
Cache-Control: max-age=3600
协商缓存
由 ETag 或 Last-Modified 控制,需要与服务器验证。
If-None-Match: "abc123"
→ HTTP/1.1 304 Not Modified
浏览器缓存策略总结:
| 类型 | 是否请求服务器 | 典型头部 |
|---|---|---|
| 强缓存 | 否 | Cache-Control / Expires |
| 协商缓存 | 是(但不返回实体) | ETag / Last-Modified |
十二、抓包观察 HTTP 流程
你可以使用:
-
Chrome 开发者工具(Network 面板)
-
Postman / curl
-
Wireshark / Fiddler
例如:
curl -v https://www.baidu.com
输出中可看到完整请求头、响应头、TLS 握手信息。
十三、HTTP 与 RESTful API
REST(Representational State Transfer)是一种基于 HTTP 的设计风格。
示例:
| 动作 | URL | 方法 |
|---|---|---|
| 获取用户列表 | /users | GET |
| 获取单个用户 | /users/1 | GET |
| 创建用户 | /users | POST |
| 更新用户 | /users/1 | PUT |
| 删除用户 | /users/1 | DELETE |
十四、总结:HTTP 学习路线图
| 阶段 | 内容 | 工具 |
|---|---|---|
| 初级 | 基础请求响应、状态码、头部 | curl、浏览器 |
| 中级 | HTTPS、缓存、Cookie/Session | Postman、Fiddler |
| 高级 | HTTP/2、HTTP/3、性能调优 | Wireshark、nghttp |
880

被折叠的 条评论
为什么被折叠?



