这道题考察的不是背诵顺序,而是能否串联浏览器、网络协议、缓存、安全和渲染。回答时先讲主链路,再根据面试官追问展开。
浏览器解析协议、主机、端口、路径、查询参数和片段,并检查:
#fragment 通常只在客户端定位,不会发送给服务器。
浏览器需要把域名解析成 IP 地址。通常按以下层级查找:
真实系统可能使用 CDN DNS 调度、DoH/DoT 和 Happy Eyeballs,因此“严格逐级请求”只是基础模型。
通常先通过 TCP 三次握手建立可靠连接:
三次握手的目的不仅是确认双方可达,还要同步初始序列号,避免旧连接报文干扰新连接。
TCP 建连后进行 TLS 握手:协商协议和密码套件、验证证书、完成密钥交换,随后使用对称加密传输业务数据。
HTTP/3 基于 QUIC/UDP,把传输层和 TLS 1.3 握手结合起来,连接恢复时还可能使用 0-RTT。
请求包含:
Host、Accept、Cookie、缓存条件等请求头。请求可能先经过代理、负载均衡和 CDN,再到达网关及应用服务器。
可能出现的分支:
304 Not Modified。301、302、307 或 308 跳转,浏览器重新发起导航。浏览器根据状态码和响应头处理缓存、Cookie、内容类型、压缩和下载行为。HTML 可以边接收边解析,并非必须等待整个文件下载完成。
主要步骤:
defer 和 async 行为不同。首屏可见不等于页面完全可交互。还要关注 FCP、LCP、INP、CLS 以及框架水合完成时间。
DOMContentLoaded:DOM 解析完成,延迟脚本执行完成。load:页面依赖的图片、样式等资源基本加载完成。浏览器先解析 URL,并检查 HSTS、Service Worker 和缓存;没有命中时通过 DNS 获得 IP。HTTP/1.1 或 HTTP/2 通常先建立 TCP 连接,HTTPS 再完成 TLS 握手,HTTP/3 则基于 QUIC。请求经过 CDN、代理和服务端后返回响应。浏览器可以流式解析 HTML,构建 DOM 和 CSSOM,随后生成渲染树,经历布局、绘制与合成。过程中脚本、样式、缓存策略和框架水合都会影响首屏与可交互时间。
DOMContentLoaded 与 load 有什么区别?