1. HTTP 请求的完整结构
一个完整的 HTTP 请求通常包含以下几个部分:
(1)请求行(Request Line)
格式:
php-template
复制编辑
<Method> <Path> <HTTP Version>
示例:
pgsql
复制编辑
GET /index.html HTTP/1.1
- Method:请求方法,如
GET、POST、PUT、DELETE等。 - Path:请求资源的路径,如
/index.html。 - HTTP Version:HTTP 协议版本,如
HTTP/1.1、HTTP/2。
(2)请求头(Headers)
请求头包含一些键值对,用于提供额外信息,例如:
pgsql
复制编辑
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml
Content-Type: application/json
Authorization: Bearer <token>
Host:指定服务器的域名(HTTP/1.1 必须要有)。User-Agent:浏览器或客户端的信息。Accept:客户端希望接收的响应格式。Content-Type:发送数据的格式(如application/json)。Authorization:身份验证信息(如Bearer Token)。
(3)请求体(Body,可选)
- 仅
POST、PUT、PATCH等方法才会有请求体,例如:
json
复制编辑
{
"username": "admin",
"password": "123456"
}
- 请求头
Content-Length指定请求体的长度。
2. HTTP 请求的完整流程
一个完整的 HTTP 请求流程包括:
-
DNS 解析:解析域名(如
www.example.com)到 IP 地址。 -
TCP 连接:通过
三次握手建立 TCP 连接(HTTP1.1 默认保持长连接)。 -
发送 HTTP 请求:
- 发送请求行、请求头、请求体。
-
服务器处理请求:
- 服务器解析 HTTP 请求,返回相应的数据(如 HTML、JSON)。
-
返回 HTTP 响应:
- 响应包含状态行、响应头、响应体。
-
TCP 连接管理:
Connection: keep-alive:保持连接,减少重复建立连接的开销。Connection: close:服务器主动关闭连接。
3. HTTPS 请求的完整流程
(1)HTTPS 与 HTTP 的区别
- HTTPS = HTTP + SSL/TLS 加密
- HTTPS 在 HTTP 之上增加了 SSL/TLS 加密,保证数据的机密性、完整性、身份认证。
(2)HTTPS 的完整流程
-
DNS 解析:解析域名到 IP 地址。
-
TCP 三次握手:客户端和服务器建立 TCP 连接。
-
TLS/SSL 握手(核心区别):
-
客户端发起握手:
复制编辑 ClientHello(支持的 TLS 版本、加密算法、随机数) -
服务器响应:
复制编辑 ServerHello(确认 TLS 版本、加密算法、服务器证书) -
证书验证:
- 客户端检查服务器的 SSL 证书 是否可信(CA 颁发)。
- 验证服务器公钥的合法性。
-
密钥交换:
- 客户端生成 对称密钥(会话密钥),用服务器的公钥加密并发送给服务器。
- 服务器用私钥解密,获取会话密钥。
-
握手完成:
- 之后所有 HTTP 数据用 对称加密 方式传输,提高效率。
-
-
发送 HTTPS 请求:
- 之后的 HTTP 请求和响应都在 TLS 加密通道中传输。
-
服务器处理请求:
- 解密请求数据,处理后返回加密的 HTTP 响应。
-
返回 HTTPS 响应:
- 服务器加密响应数据,客户端解密并解析。
-
TCP 连接管理:
- HTTPS 也支持 长连接,减少握手开销。
4. 示例对比:HTTP vs HTTPS
HTTP 请求示例
vbnet
复制编辑
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
📌 数据是明文传输的,容易被中间人攻击(MITM)。
HTTPS 请求示例
pgsql
复制编辑
GET /index.html HTTP/1.1 (加密)
📌 整个 HTTP 报文被 TLS 加密,在传输过程中不可被窃听。
TCP三次握手 (Three-way Handshake)
三次握手是建立一个 TCP 连接的过程,用于确保通信双方的可靠连接。具体步骤如下:
-
第一次握手 (SYN)
- 客户端向服务器发送一个 SYN 包,表示客户端希望建立连接,并附带一个初始化的序列号
ISN。
- 客户端向服务器发送一个 SYN 包,表示客户端希望建立连接,并附带一个初始化的序列号
-
第二次握手 (SYN-ACK)
- 服务器接收到客户端的 SYN 包后,回复一个 SYN-ACK 包,表示同意建立连接,同时服务器也会发送自己的序列号并确认客户端的序列号(
Ack = client_ISN + 1)。
- 服务器接收到客户端的 SYN 包后,回复一个 SYN-ACK 包,表示同意建立连接,同时服务器也会发送自己的序列号并确认客户端的序列号(
-
第三次握手 (ACK)
- 客户端接收到服务器的 SYN-ACK 包后,发送一个 ACK 包作为确认,确认收到服务器的 SYN 包(
Ack = server_ISN + 1)。
- 客户端接收到服务器的 SYN-ACK 包后,发送一个 ACK 包作为确认,确认收到服务器的 SYN 包(
完成三次握手后,客户端和服务器的 TCP 连接建立,双方可以开始数据传输。
TCP四次挥手 (Four-way Handshake)
四次挥手是断开一个 TCP 连接的过程,用于确保双方都完全关闭连接,确保数据已经全部传输完毕。具体步骤如下:
-
第一次挥手 (FIN)
- 客户端向服务器发送一个 FIN 包,表示客户端已经完成数据发送,请求关闭连接。此时客户端进入 FIN_WAIT_1 状态。
-
第二次挥手 (ACK)
- 服务器接收到客户端的 FIN 包后,回复一个 ACK 包,确认收到客户端的连接关闭请求。此时服务器进入 CLOSE_WAIT 状态,客户端进入 FIN_WAIT_2 状态。
-
第三次挥手 (FIN)
- 服务器发送一个 FIN 包,表示服务器已经完成数据发送,请求关闭连接。此时服务器进入 LAST_ACK 状态。
-
第四次挥手 (ACK)
- 客户端接收到服务器的 FIN 包后,回复一个 ACK 包,确认服务器的连接关闭请求。此时客户端进入 TIME_WAIT 状态,等待足够的时间确保服务器收到确认包,然后完全关闭连接。
区别:
| 过程 | 三次握手 | 四次挥手 |
|---|---|---|
| 目的 | 建立 TCP 连接,确保数据传输的可靠性。 | 关闭 TCP 连接,确保双方完全关闭连接,数据传输已完成。 |
| 步骤数 | 3 步:SYN -> SYN-ACK -> ACK | 4 步:FIN -> ACK -> FIN -> ACK |
| 客户端的角色 | 客户端发起连接请求,发送 SYN 包。 | 客户端发起关闭请求,发送 FIN 包。 |
| 服务器的角色 | 服务器响应客户端的连接请求,发送 SYN-ACK 包。 | 服务器响应客户端的关闭请求,发送 ACK 包,随后发送 FIN 包。 |
| 关闭连接方式 | 无需关闭连接。 | 需要逐步关闭连接,确保双方的数据已经全部传输完毕。 |
总结:
- 三次握手:用于建立连接,通过三步(SYN -> SYN-ACK -> ACK)确保连接双方可以可靠地交换数据。
- 四次挥手:用于断开连接,通过四步(FIN -> ACK -> FIN -> ACK)确保连接双方都完成了数据的发送,连接被安全关闭。