HTTP概述
HTTP 是一种用作获取诸如 HTML 文档这类资源的协议。它是 Web 上进行任何数据交换的基础,同时,也是一种客户端—服务器(client-server)协议,也就是说,请求是由接受方——通常是 Web 浏览器——发起的。完整网页文档通常由文本、布局描述、图片、视频、脚本等资源构成。
和
是基于
TCP协议的
是基于
QUIC协议的,而QUIC协议又是基于UDP的下文若无特殊说明,讨论的都是
和
.
客户端与服务端之间通过交换一个个独立的消息(而非数据流)进行通信。由客户端发出的消息被称作请求(request),由服务端发出的应答消息被称作响应(response)。
HTTP协议的特点
- 应用层协议:基于 TCP(HTTP/1.1、HTTP/2)或 QUIC(HTTP/3),默认使用80端口。
 - 请求-响应模型:通信总是由客户端(如浏览器)发起请求,服务器收到请求后返回响应。服务器不会主动发送数据给客户端。
 - 无状态:协议本身不记录之前的请求信息,每个请求都是独立的。为了维护状态(如用户状态),需要借助
Cookie和Session等机制。 - 灵活可扩展:能够传输文本、图片、音视频等任意类型的数据。
 
HTTP报文
HTTP请求报文
 由起始行、请求头、空行和请求体组成。
请求行:
| 组成部分 | 详情 | 示例 | 
|---|---|---|
| 请求方法 | 规定客户端对服务器资源的操作类型 | GET、POST、PUT、DELETE 等 | 
| 请求路径 | 标识请求资源在服务器上的位置 | 绝对路径,末尾跟上一个’?'和查询字符串。是最常见的形式。例如:HEAD /test.html?query=alibaba HTTP/1.1一个完整的 URL,被称为绝对形式,主要在使用 GET 方法连接到代理时使用。例如:GET http://developer.mozilla.org/zh-CN/docs/Web/HTTP/Messages HTTP/1.1 | 
| HTTP 版本号 | 表明使用的 HTTP协议版本 | HTTP/1.1、HTTP/2 等 | 
请求行必须在HTTP请求格式的第一行
示例:
GET /background.png HTTP/1.0
请求头
包含关于客户端环境、请求的附加信息的一系列键值对。例如:
Host:指定服务器的域名。User-Agent:浏览器版本信息。服务器通过这个请求头判断用户的软件的应用类型、操作系统、软件开发商以及版本号、浏览器内核信息等; 风控系统、反作弊系统、反爬虫系统等基本会采集这类信息做参考。Connection:一般设置为keep-alive,表示开启 HTTP 持久连接Accept:告知服务器客户端可以处理的内容类型。比如text/html,application/json等。Content-Type:请求体的数据类型(如application/json)。post 提交时才需要设置
请求体
可选部分,通常在POST、PUT等方法中,用于携带要提交的数据(如表单数据、JSON数据等)。
请求体和请求头之间有一行空行,容易被忽略,但必不可少。
HTTP响应报文
服务器处理完请求后,会返回一个HTTP响应报文。它包含以下部分:
- 状态行:包含HTTP版本、状态码和状态描述。例如 
HTTP/1.1 200 OK。 - 响应头:包含服务器返回的关于响应的附加信息。常见的有:
Content-Type:响应体的数据类型(如text/html; charset=utf-8)。Content-Length:响应体的长度。Set-Cookie:设置Cookie。 - 响应体:服务器返回的实际数据,如网页的
HTML代码、图片数据等 
HTTP核心机制
常见的HTTP请求方法
| 方法 | 描述 | 典型应用 | 
|---|---|---|
| GET | 获取指定的资源。 | 访问网页,查询数据。 | 
| POST | 提交数据,用于创建新资源或处理数据。 | 提交表单,用户登录。 | 
| PUT | 更新服务器上已存在的资源(全部更新)。 | 修改用户信息。 | 
| PATCH | 部分更新服务器上的资源。 | 只修改用户的昵称。 | 
| DELETE | 删除指定的资源。 | 删除一篇文章。 | 
| HEAD | 与GET类似,但只获取响应头,不返回实际内容。 | 检查资源是否存在或是否更新。 | 
GET与POST的主要区别
- 参数位置:GET参数附在
URL后(如?name=value),POST参数放在请求体中。 - 安全性:GET参数暴露在地址栏,相对不安全,不适合传递密码。POST相对安全。
 - 数据长度:GET有长度限制(因浏览器而异),POST理论无限制。
 - 幂等性:GET是幂等的(多次执行结果相同),通常可缓存。POST是非幂等的(多次提交可能产生不同结果),不可缓存。
 
重要的HTTP状态码
状态码主要表示请求的结果如何,分为5类:
| 分类 | 说明 | 常见状态码 | 
|---|---|---|
| 1xx | 信息性状态码 | 表示请求已被接受,需要继续处理。(较少见) | 
| 2xx | 成功 | 200 OK:请求成功。 201 Created:资源创建成功。  | 
| 3xx | 重定向 | 301 Moved Permanently:资源已永久迁移。 302 Found:资源临时重定向。 304 Not Modified:资源未修改,可使用本地缓存。  | 
| 4xx | 客户端错误 | 400 Bad Request:请求语法错误。 401 Unauthorized:需要身份验证。 403 Forbidden:服务器拒绝执行(权限不足)。 404 Not Found:请求的资源未找到。  | 
| 5xx | 服务器错误 | 500 Internal Server Error:服务器内部错误。 502 Bad Gateway:网关错误。 503 Service Unavailable:服务暂时不可用。  | 
连接管理
- 短连接(HTTP/1.0默认):每次请求-响应都需建立新的TCP连接,完成后立即关闭。性能差。
 - 长连接(HTTP/1.1默认):通过
Connection: keep-alive实现,允许在同一TCP连接上发送多个HTTP请求,减少了建立和关闭连接的开销。 - 管道化:允许客户端在同一个连接上连续发送多个请求而无需等待响应,但服务器必须按请求顺序返回响应。
 - 多路复用(HTTP/2):是管道化的真正实现,多个请求和响应可以同时在一个连接上混杂传输,互不阻塞,彻底解决了队头阻塞问题。
 
HTTPS协议
由于HTTP是明文传输的,存在窃听、篡改和身份伪装三大风险。因此,HTTPS应运而生。
HTTPS = HTTP + SSL/TLS加密层。它通过以下方式保障安全:
- 加密:对传输的数据进行加密,防止被窃听。
 - 认证:通过证书验证服务器身份,防止钓鱼网站。
 - 完整性保护:验证数据在传输过程中未被篡改。
 
HTTPS的核心其实是在HTTP协议之下,TCP协议之上加了一层SSL/TLS加密层。
TLS握手
当首次访问一个HTTPS网站时,浏览器和服务器之间会进行一次关键的 TLS 握手。以目前主流的 TLS 1.2 为例,其核心过程可被概括为“四次握手”:
- Client Hello(客户端问候):你的浏览器向服务器发送信息,包括:支持的 TLS 版本、支持的加密套件列表、一个客户端随机数。
 - Server Hello(服务器问候):服务器从客户端提供的列表中选择一个 TLS 版本和加密套件,并返回:选定的 TLS 版本和加密套件、一个服务器随机数、它的 SSL 证书(其中包含服务器的公钥)。
 - 密钥交换与验证:你的浏览器验证服务器证书的有效性。验证通过后,浏览器会生成一个预主密钥,并使用服务器证书中的公钥对其加密,然后发送给服务器。服务器用自己的私钥解密,得到预主密钥。
 - 完成握手:此时,客户端和服务器双方都拥有了三个值:客户端随机数、服务器随机数和预主密钥。它们利用这三个值独立计算出本次会话所需的会话密钥。随后双方交换一条加密的“完成”消息,确认握手成功。此后,双方的所有应用数据(即HTTP请求和响应)都将使用这个会话密钥进行高效的对称加密传输
 
TLS 1.3 版本对此过程做了大幅简化,将握手所需的时间(往返延迟,RTT)减少到了一次,甚至在某些情况下可以实现 0-RTT,显著提升了连接速度。
