1. 用户输入与本地预处理
- URL 解析:浏览器接收到 URL(www.baidu.com),会解析出协议(通常是 HTTPS)、域名、端口(默认 443 对于 HTTPS)和路径(主页通常为 "/")。
- 缓存检查:浏览器首先检查内部缓存、操作系统的 DNS 缓存和本地 Hosts 文件,看是否已有 www.baidu.com 的 IP 映射。
2. DNS 解析
如果本地没有缓存,浏览器会发起 DNS 查询:
-
向本地 DNS 解析器请求
浏览器通过操作系统将查询请求发送给配置的本地 DNS 解析器(通常由 ISP 或局域网提供)。 -
递归查询过程
- 根服务器查询:本地解析器先向 DNS 根服务器请求,根服务器返回负责 .com 顶级域的服务器地址。
- TLD 服务器查询:解析器再向 .com 的顶级域服务器请求,获取 baidu.com 的权威名称服务器地址。
- 权威服务器查询:最后,解析器向 baidu.com 的权威服务器发送查询请求,获得该域名对应的 A 记录(IPv4 地址)或 AAAA 记录(IPv6 地址)。
-
缓存与返回
查询结果被 DNS 解析器缓存(根据 TTL),并返回给操作系统,再传递给浏览器。
3. 建立 TCP/TLS 连接
假设 www.baidu.com 使用 HTTPS(实际情况如此):
-
TCP 连接建立
浏览器根据获得的 IP 地址和端口 443 建立 TCP 连接。该过程包括三次握手(SYN、SYN-ACK、ACK)。 -
TLS 握手
在 TCP 连接建立后,浏览器与服务器进行 TLS 握手,协商加密算法,验证服务器证书,生成会话密钥。只有握手成功后,数据才能通过加密通道传输。
4. 发送 HTTP 请求
在安全连接建立后,浏览器构造并发送 HTTP 请求:
- 请求报文:通常是 HTTP GET 请求,请求头中包含 User-Agent、Accept、Cookie、Host 等信息。
- 请求路径:一般为 "/"(主页),也可能携带查询参数。
5. 服务器处理请求
- 服务器接收请求
服务器(百度前端服务器)收到请求后,会进行负载均衡、身份验证等处理。 - 业务逻辑处理
根据请求信息,服务器从缓存或后端系统获取对应的 HTML、CSS、JavaScript 等资源。 - 构造响应
服务器将处理结果封装为 HTTP 响应,包含状态码(200 OK)、响应头和响应体(HTML 页面)。
6. 浏览器接收与渲染页面
-
接收响应
浏览器接收到响应后,首先读取 HTTP 头信息,检查状态码和内容类型。 -
缓存响应
根据响应头中的 Cache-Control、Expires 等信息,浏览器将部分资源缓存到本地。 -
HTML 解析与构建 DOM
浏览器解析 HTML 构建 DOM 树,同时解析 CSS 构建 CSSOM 树。 -
页面渲染
浏览器根据 DOM 和 CSSOM 树生成渲染树,然后进行布局和绘制,将页面显示在屏幕上。 -
加载附属资源
页面中引用的外部资源(如图片、脚本、样式表)会触发新的 HTTP 请求,异步加载后依次处理。 -
JavaScript 执行
如果页面包含 JavaScript,浏览器会解析并执行代码,这可能会引发 DOM 操作和页面更新。
7. 综合优化与缓存策略
- 全局缓存:DNS 缓存、浏览器缓存和 CDN 缓存都能大幅提高解析速度和页面加载性能。
- 持久连接:HTTP/2 协议支持多路复用和持久连接,减少建立连接的开销。
- 异步加载:现代页面通常采用异步加载脚本和懒加载图片,提升用户体验。
8. 总结
从用户输入 www.baidu.com 到浏览器显示主页,整个流程包含以下关键步骤:
- 浏览器解析 URL,检查本地缓存和 Hosts 文件。
- 通过 DNS 解析获取域名对应的 IP 地址。
- 建立 TCP 连接并完成 TLS 握手,确保安全传输。
- 发送 HTTP 请求,服务器处理并返回响应。
- 浏览器接收响应,解析 HTML、加载资源,并渲染最终页面。
这些环节各自涉及网络协议、缓存策略、安全验证和页面渲染技术,构成了现代 Web 应用高效且安全的基础。理解整个过程不仅有助于调试和优化网络性能,还能帮助开发者设计更优的前端架构。