当在浏览器的地址栏中输入 URL 并按下回车键后,会经历一系列复杂的过程,以下从 DNS 解析、TCP 连接、HTTP 请求、服务器处理请求、HTTP 响应、浏览器解析渲染页面几个方面详细介绍:
1. DNS 解析
- 概念:URL 中通常使用的是域名(如
www.example.com
),而计算机网络中通信需要使用 IP 地址,因此需要将域名转换为对应的 IP 地址,这个过程就是 DNS 解析。 - 解析过程
- 浏览器缓存:浏览器首先会检查自身的 DNS 缓存,看是否已经有该域名对应的 IP 地址。如果有且未过期,就直接使用该 IP 地址。
- 系统缓存:如果浏览器缓存中没有找到,浏览器会检查操作系统的 DNS 缓存(如在 Windows 系统中,可以通过
ipconfig /displaydns
命令查看)。 - 本地 DNS 服务器:若系统缓存中也没有,浏览器会向本地 DNS 服务器(通常由网络服务提供商配置)发送 DNS 查询请求。本地 DNS 服务器会先检查自己的缓存,如果有对应的记录,就直接返回 IP 地址;如果没有,会继续向其他 DNS 服务器查询。
- 根 DNS 服务器、顶级域名 DNS 服务器、权威 DNS 服务器:本地 DNS 服务器会依次向根 DNS 服务器、顶级域名 DNS 服务器和权威 DNS 服务器查询,最终获取到域名对应的 IP 地址,并将其返回给浏览器。
2. TCP 连接
- 概念:在获取到服务器的 IP 地址后,浏览器会通过 TCP 协议与服务器建立连接。TCP 是一种面向连接的、可靠的传输协议,它可以确保数据在传输过程中不会丢失、乱序。
- 连接过程:使用三次握手建立 TCP 连接。
- 客户端发送 SYN 包:客户端向服务器发送一个 SYN 包,包含客户端的初始序列号(ISN),表示请求建立连接。
- 服务器发送 SYN + ACK 包:服务器收到 SYN 包后,向客户端发送一个 SYN + ACK 包,包含服务器的初始序列号和对客户端 SYN 包的确认号。
- 客户端发送 ACK 包:客户端收到 SYN + ACK 包后,向服务器发送一个 ACK 包,表示确认连接建立。
3. HTTP 请求
- 概念:TCP 连接建立后,浏览器会根据 URL 中的信息构建 HTTP 请求消息,并发送给服务器。
- 请求消息结构:HTTP 请求消息由请求行、请求头和请求体组成。
- 请求行:包含请求方法(如 GET、POST 等)、请求的资源路径和 HTTP 协议版本。例如:
GET /index.html HTTP/1.1
- 请求头:包含一系列的键值对,用于传递请求的附加信息,如用户代理、请求的内容类型、缓存控制等。例如:
User - Agent: Mozilla/5.0
- 请求体:对于一些需要提交数据的请求(如 POST 请求),请求体中会包含要提交的数据。
- 请求行:包含请求方法(如 GET、POST 等)、请求的资源路径和 HTTP 协议版本。例如:
4. 服务器处理请求
- 接收请求:服务器接收到浏览器发送的 HTTP 请求消息后,会对请求进行解析,提取请求行、请求头和请求体中的信息。
- 处理请求:服务器根据请求的内容,调用相应的应用程序或服务来处理请求。例如,如果请求的是一个静态 HTML 文件,服务器会直接从文件系统中读取该文件;如果请求的是一个动态资源,服务器会调用相应的脚本或程序进行处理。
- 生成响应:服务器处理完请求后,会生成一个 HTTP 响应消息。
5. HTTP 响应
- 响应消息结构:HTTP 响应消息由状态行、响应头和响应体组成。
- 状态行:包含 HTTP 协议版本、状态码和状态描述。例如:
HTTP/1.1 200 OK
,其中200
表示请求成功。 - 响应头:包含一系列的键值对,用于传递响应的附加信息,如响应的内容类型、缓存控制、服务器信息等。例如:
Content - Type: text/html
- 响应体:包含服务器返回给客户端的数据,如 HTML 页面、JSON 数据等。
- 状态行:包含 HTTP 协议版本、状态码和状态描述。例如:
6. 浏览器解析渲染页面
- 解析 HTML:浏览器接收到服务器的 HTTP 响应后,会首先解析 HTML 文件,构建 DOM(文档对象模型)树。
- 解析 CSS:在解析 HTML 的过程中,如果遇到 CSS 链接,浏览器会请求并解析 CSS 文件,构建 CSSOM(CSS 对象模型)树。
- 合并渲染树:将 DOM 树和 CSSOM 树合并成渲染树,渲染树只包含需要显示的节点及其样式信息。
- 布局:根据渲染树中节点的样式信息,计算每个节点在页面中的位置和大小。
- 绘制:将布局好的节点绘制到屏幕上,最终显示出页面。
7. TCP 连接关闭
- 关闭过程:当浏览器完成页面的渲染后,会通过四次挥手关闭与服务器的 TCP 连接。
- 客户端发送 FIN 包:客户端向服务器发送一个 FIN 包,表示请求关闭连接。
- 服务器发送 ACK 包:服务器收到 FIN 包后,向客户端发送一个 ACK 包,表示确认收到关闭请求。
- 服务器发送 FIN 包:服务器处理完剩余的数据后,向客户端发送一个 FIN 包,表示请求关闭连接。
- 客户端发送 ACK 包:客户端收到 FIN 包后,向服务器发送一个 ACK 包,表示确认收到关闭请求,至此 TCP 连接关闭。