一次 HTTP 的请求过程

一次完整的 HTTP 请求过程中,会涉及到多个步骤,从用户发起请求到接收响应,通常包括以下过程:

1. DNS 解析

  • 当用户在浏览器中输入一个 URL 或点击一个链接时,首先需要将域名解析为 IP 地址。浏览器会先查询本地缓存,如果没有找到,就会向 DNS 服务器发起查询请求,获取目标服务器的 IP 地址。

2. 建立 TCP 连接

  • 通过 DNS 解析到的 IP 地址,浏览器开始与目标服务器建立 TCP 连接。这个过程涉及 TCP 三次握手,以确保客户端和服务器之间的连接已经准备好进行数据传输。

3. 发送 HTTP 请求

  • 一旦 TCP 连接建立,浏览器会构建一个 HTTP 请求报文,包含请求方法(如 GET、POST)、请求 URL、HTTP 版本、请求头部信息(如 User-Agent、Cookie 等)以及请求体(通常用于 POST 请求)。
  • 浏览器将这个请求通过 TCP 连接发送到目标服务器。

4. 服务器处理请求

  • 服务器接收到 HTTP 请求后,首先解析请求报文,查看请求的资源和请求方法。
  • 服务器根据请求的 URL 和请求方法,调用相应的程序或服务来处理请求。这可能涉及查询数据库、调用后台服务、读取文件等操作。

5. 生成 HTTP 响应

  • 服务器处理完成后,生成一个 HTTP 响应报文,包含响应状态码(如 200 OK、404 Not Found)、响应头部信息(如 Content-Type、Content-Length)、以及响应体(通常是请求的网页、数据等)。
  • 服务器将这个响应报文通过 TCP 连接返回给客户端。

6. 浏览器接收响应

  • 浏览器接收到服务器的响应后,首先解析响应状态码,以确定请求是否成功。
  • 然后浏览器会根据响应头部的信息来处理响应体,例如解码压缩内容、处理 cookies 等。

7. 渲染页面

  • 如果响应体是 HTML 页面,浏览器会解析 HTML 内容,并发起额外的 HTTP 请求来获取页面中的资源(如图片、CSS 文件、JavaScript 文件等)。
  • 这些资源获取到后,浏览器会按照 HTML 文档的结构进行页面渲染,生成最终的用户界面。

8. 关闭连接

  • 在 HTTP/1.0 中,通常在请求完成后立即关闭 TCP 连接。
  • 在 HTTP/1.1 中,引入了 持久连接(Keep-Alive)机制,允许同一连接复用多个请求,以减少开销。

9. 后续操作

  • 用户可能会在页面上进行进一步操作,如点击按钮、填写表单等,这些操作会触发新的 HTTP 请求,重复以上过程。

总结

在一次 HTTP 请求过程中,从域名解析、建立连接、发送请求、服务器处理、接收响应到最终渲染页面,每一步都在后台进行一系列复杂的操作,确保最终用户能够看到并交互所请求的内容。