浏览器的网络原理涉及域名解析、连接建立、HTTP 请求与响应,以及页面解析和渲染。下面按一次典型导航展开;缓存命中、已有连接复用及协议版本会影响实际经历的步骤。
浏览器网络连接过程
当你在浏览器中输入一个域名并按下回车键后,会发生一系列步骤来将该域名解析为一个网页并显示在浏览器中。以下是这些步骤的详细过程:
1. DNS 解析
- 检查缓存:域名解析可能使用浏览器、操作系统或递归 DNS 解析器等环节的缓存;具体路径取决于系统与浏览器配置。缓存有效时,可以复用解析结果。
- DNS 查询:如果没有可用的缓存结果,浏览器或操作系统向配置的 DNS 解析服务发起查询。递归解析器会按需查询下列服务器;并非每次解析都需要走完整条链路。
- 根 DNS 服务器:如果本地 DNS 服务器没有缓存记录,它会查询根 DNS 服务器。
- 顶级域名(TLD)服务器:根 DNS 服务器会指向相应的 TLD 服务器(如
.com、.org)。 - 权威 DNS 服务器:TLD 服务器会指向具体的权威 DNS 服务器,该服务器包含域名的实际 IP 地址。
2. 建立 TCP 连接
三次握手:对于基于 TCP 的 HTTP/1.1、HTTP/2,在没有可复用连接、需要新建连接时,浏览器使用目标 IP 地址与服务器建立 TCP 连接。典型过程为三次握手:
- SYN:客户端发送一个 SYN(同步)包到服务器,表示请求建立连接。
- SYN-ACK:服务器收到 SYN 包后,回复一个 SYN-ACK(同步-确认)包,表示同意建立连接。
- ACK:客户端收到 SYN-ACK 包后,再发送一个 ACK(确认)包,表示连接建立完成。
HTTPS 还需要 TLS 提供传输加密、完整性和服务器身份验证。HTTP/3 使用基于 UDP 的 QUIC,并结合 TLS 1.3,不经过上述 TCP 三次握手。
3. 发送 HTTP/HTTPS 请求
- 构建请求:浏览器构建一个 HTTP 或 HTTPS 请求,包含请求方法(如 GET、POST)、请求头(如 User-Agent、Accept)和请求体(如果是 POST 请求)。
- 发送请求:浏览器通过已建立或复用的连接将请求发送到服务器;具体传输机制取决于使用的 HTTP 版本。
4. 服务器处理请求
- 接收请求:服务器接收到浏览器发送的 HTTP/HTTPS 请求。
- 处理请求:服务器根据请求的内容进行处理,可能涉及读取文件、查询数据库、执行应用逻辑等。
- 生成响应:服务器生成一个 HTTP/HTTPS 响应,包含状态码(如 200、404)、响应头(如 Content-Type、Set-Cookie)和响应体(如 HTML、JSON)。
5. 发送响应
发送响应:服务器将生成的 HTTP/HTTPS 响应通过相应连接发送回浏览器。浏览器可以边接收 HTML 边解析,不必等待整个页面的所有资源下载完毕。
6. 浏览器渲染页面
- 接收响应:浏览器接收到服务器的响应。
- 解析 HTML:浏览器解析 HTML 文档,构建 DOM 树。
- 解析 CSS:浏览器解析 CSS 文件,构建 CSSOM 树。
- 解析 JavaScript:浏览器解析并执行 JavaScript 代码,可能会修改 DOM 树和 CSSOM 树。
- 构建渲染树:浏览器将 DOM 树和 CSSOM 树结合,构建渲染树。
- 布局:浏览器计算每个元素的布局信息(位置和大小)。
- 绘制:浏览器生成绘制结果,并通过合成等步骤显示到屏幕上。
以上是便于理解的阶段划分,实际加载、解析和资源请求可能交错进行。经典同步脚本可能阻塞 HTML 解析,async、defer 和 module 脚本有不同执行时机。后续 DOM 或样式变化也不一定重做全部渲染阶段。
7. 关闭连接
四次挥手:一个资源传输完成后,连接可以继续保留以供复用,不必立即关闭。确实需要正常关闭 TCP 连接时,典型过程如下;关闭可以由任一端发起,以下以客户端先发起为例,部分报文也可能合并:
- FIN:客户端发送一个 FIN(终止)包,表示请求关闭连接。
- ACK:服务器收到 FIN 包后,回复一个 ACK(确认)包。
- FIN:服务器发送一个 FIN 包,表示同意关闭连接。
- ACK:客户端收到 FIN 包后,再发送一个 ACK 包,随后进入 TIME-WAIT;等待相应时间后关闭。
总结
从输入域名到页面显示在浏览器中,通常涉及 DNS 解析、连接建立或复用、发送 HTTP/HTTPS 请求、服务器处理请求、发送响应及浏览器渲染页面。是否需要解析、新建连接或关闭连接,取决于缓存、连接状态和协议版本。