1. HTTP请求全流程深度解析
1.1 从输入URL到页面加载的完整旅程
当我们在浏览器地址栏输入一个网址时,背后其实经历了一场精密的"数字接力赛"。以访问https://www.example.com为例:
- DNS解析阶段(耗时约50-300ms):
- 浏览器首先检查自身缓存(chrome://net-internals/#dns)
- 接着查询操作系统缓存(Windows的
ipconfig /displaydns可查看) - 最后递归查询DNS服务器(通常由ISP提供)
实际场景中,现代浏览器会采用预解析技术(),在用户输入时就提前开始DNS查询。
-
TCP连接建立(耗时约100-500ms):
- 经典的三次握手过程:
- 客户端发送SYN=1, seq=x
- 服务端回复SYN=1, ACK=1, seq=y, ack=x+1
- 客户端发送ACK=1, seq=x+1, ack=y+1
- 如果启用HTTPS,还需要额外的TLS握手(2次RTT)
- 经典的三次握手过程:
-
HTTP请求/响应周期:
- 请求报文示例:
http复制GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 Accept: text/html,application/xhtml+xml Connection: keep-alive - 响应报文示例:
http复制HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Content-Length: 1256 Cache-Control: max-age=3600 <!DOCTYPE html><html>...
- 请求报文示例:
1.2 关键环节技术细节
连接复用机制
HTTP/1.1默认开启Keep-Alive,单个TCP连接可处理多个请求。但存在队头阻塞问题,因此浏览器会:
- 对同一域名建立6-8个并行连接(各浏览器策略不同)
- 采用域名分片技术(如static1.example.com, static2.example.com)
HTTP/2则通过:
- 二进制分帧层
- 多路复用(Stream ID标识)
- 头部压缩(HPACK算法)
- 服务器推送(Server Push)
资源加载优化
现代浏览器的渲染引擎工作流程:
- 构建DOM树(遇到