【面试】http请求

142 阅读5分钟

1. HTTP 请求的完整结构

一个完整的 HTTP 请求通常包含以下几个部分:

(1)请求行(Request Line)

格式:

php-template
复制编辑
<Method> <Path> <HTTP Version>

示例:

pgsql
复制编辑
GET /index.html HTTP/1.1
  • Method:请求方法,如 GETPOSTPUTDELETE 等。
  • Path:请求资源的路径,如 /index.html
  • HTTP Version:HTTP 协议版本,如 HTTP/1.1HTTP/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,可选)

  • POSTPUTPATCH 等方法才会有请求体,例如:
json
复制编辑
{
  "username": "admin",
  "password": "123456"
}
  • 请求头 Content-Length 指定请求体的长度。

2. HTTP 请求的完整流程

一个完整的 HTTP 请求流程包括:

  1. DNS 解析:解析域名(如 www.example.com)到 IP 地址。

  2. TCP 连接:通过 三次握手 建立 TCP 连接(HTTP1.1 默认保持长连接)。

  3. 发送 HTTP 请求

    • 发送请求行、请求头、请求体。
  4. 服务器处理请求

    • 服务器解析 HTTP 请求,返回相应的数据(如 HTML、JSON)。
  5. 返回 HTTP 响应

    • 响应包含状态行、响应头、响应体。
  6. TCP 连接管理

    • Connection: keep-alive:保持连接,减少重复建立连接的开销。
    • Connection: close:服务器主动关闭连接。

3. HTTPS 请求的完整流程

(1)HTTPS 与 HTTP 的区别

  • HTTPS = HTTP + SSL/TLS 加密
  • HTTPS 在 HTTP 之上增加了 SSL/TLS 加密,保证数据的机密性、完整性、身份认证

(2)HTTPS 的完整流程

  1. DNS 解析:解析域名到 IP 地址。

  2. TCP 三次握手:客户端和服务器建立 TCP 连接。

  3. TLS/SSL 握手(核心区别):

    • 客户端发起握手

      复制编辑
      ClientHello(支持的 TLS 版本、加密算法、随机数)
      
    • 服务器响应

      复制编辑
      ServerHello(确认 TLS 版本、加密算法、服务器证书)
      
    • 证书验证

      • 客户端检查服务器的 SSL 证书 是否可信(CA 颁发)。
      • 验证服务器公钥的合法性。
    • 密钥交换

      • 客户端生成 对称密钥(会话密钥),用服务器的公钥加密并发送给服务器。
      • 服务器用私钥解密,获取会话密钥。
    • 握手完成

      • 之后所有 HTTP 数据用 对称加密 方式传输,提高效率。
  4. 发送 HTTPS 请求

    • 之后的 HTTP 请求和响应都在 TLS 加密通道中传输。
  5. 服务器处理请求

    • 解密请求数据,处理后返回加密的 HTTP 响应。
  6. 返回 HTTPS 响应

    • 服务器加密响应数据,客户端解密并解析。
  7. 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 连接的过程,用于确保通信双方的可靠连接。具体步骤如下:

  1. 第一次握手 (SYN)

    • 客户端向服务器发送一个 SYN 包,表示客户端希望建立连接,并附带一个初始化的序列号 ISN
  2. 第二次握手 (SYN-ACK)

    • 服务器接收到客户端的 SYN 包后,回复一个 SYN-ACK 包,表示同意建立连接,同时服务器也会发送自己的序列号并确认客户端的序列号(Ack = client_ISN + 1)。
  3. 第三次握手 (ACK)

    • 客户端接收到服务器的 SYN-ACK 包后,发送一个 ACK 包作为确认,确认收到服务器的 SYN 包(Ack = server_ISN + 1)。

完成三次握手后,客户端和服务器的 TCP 连接建立,双方可以开始数据传输。

TCP四次挥手 (Four-way Handshake)

四次挥手是断开一个 TCP 连接的过程,用于确保双方都完全关闭连接,确保数据已经全部传输完毕。具体步骤如下:

  1. 第一次挥手 (FIN)

    • 客户端向服务器发送一个 FIN 包,表示客户端已经完成数据发送,请求关闭连接。此时客户端进入 FIN_WAIT_1 状态。
  2. 第二次挥手 (ACK)

    • 服务器接收到客户端的 FIN 包后,回复一个 ACK 包,确认收到客户端的连接关闭请求。此时服务器进入 CLOSE_WAIT 状态,客户端进入 FIN_WAIT_2 状态。
  3. 第三次挥手 (FIN)

    • 服务器发送一个 FIN 包,表示服务器已经完成数据发送,请求关闭连接。此时服务器进入 LAST_ACK 状态。
  4. 第四次挥手 (ACK)

    • 客户端接收到服务器的 FIN 包后,回复一个 ACK 包,确认服务器的连接关闭请求。此时客户端进入 TIME_WAIT 状态,等待足够的时间确保服务器收到确认包,然后完全关闭连接。

区别:

过程三次握手四次挥手
目的建立 TCP 连接,确保数据传输的可靠性。关闭 TCP 连接,确保双方完全关闭连接,数据传输已完成。
步骤数3 步:SYN -> SYN-ACK -> ACK4 步:FIN -> ACK -> FIN -> ACK
客户端的角色客户端发起连接请求,发送 SYN 包。客户端发起关闭请求,发送 FIN 包。
服务器的角色服务器响应客户端的连接请求,发送 SYN-ACK 包。服务器响应客户端的关闭请求,发送 ACK 包,随后发送 FIN 包。
关闭连接方式无需关闭连接。需要逐步关闭连接,确保双方的数据已经全部传输完毕。

总结:

  • 三次握手:用于建立连接,通过三步(SYN -> SYN-ACK -> ACK)确保连接双方可以可靠地交换数据。
  • 四次挥手:用于断开连接,通过四步(FIN -> ACK -> FIN -> ACK)确保连接双方都完成了数据的发送,连接被安全关闭。