一句话总结:
从输入URL到显示主页,就像快递从下单到收货——查地址(DNS)、找路线(TCP)、打包发货(HTTP)、拆箱验货(渲染),一步都不能少!
一、整体流程概览
- 输入URL:用户输入网址(如
https://www.example.com)。 - DNS解析:将域名转换为IP地址(找快递地址)。
- 建立TCP连接:通过三次握手与服务端建立可靠连接(确认快递路线)。
- TLS握手(HTTPS) :加密通信通道(给快递加锁)。
- 发送HTTP请求:浏览器请求页面数据(下单)。
- 服务器处理请求:后端生成HTML(打包商品)。
- 接收HTTP响应:服务器返回数据(快递发货)。
- 浏览器解析渲染:构建DOM、CSSOM、渲染树,最终显示页面(拆箱验货)。
- 加载附加资源:图片、JS、CSS等(拆多个包裹)。
二、详细步骤拆解
1. DNS解析:查快递地址
- 浏览器缓存:先查本地是否有缓存(如
www.example.com→93.184.216.34)。 - 系统缓存:无缓存则查操作系统(
hosts文件)。 - 路由器缓存:继续向上查路由器DNS缓存。
- ISP DNS服务器:向网络服务商的DNS服务器查询。
- 递归查询:若ISP无记录,依次查询根域名 → .com域名 → 权威域名服务器。
示例:
输入 www.example.com → DNS解析 → 获得IP 93.184.216.34
2. 建立TCP连接:三次握手确认路线
- 第一次握手:客户端发送
SYN包(我要发快递)。 - 第二次握手:服务端回复
SYN-ACK包(我收到了,你能收到吗?)。 - 第三次握手:客户端发送
ACK包(能收到,开始发吧!)。
比喻:
- 客户:“我要发货”(SYN)。
- 快递站:“收到,请确认地址”(SYN-ACK)。
- 客户:“确认无误”(ACK)。
3. TLS握手(HTTPS):加密快递箱
- ClientHello:客户端支持的TLS版本、加密套件。
- ServerHello:服务端选择加密方式,发送证书(含公钥)。
- 验证证书:浏览器检查证书是否有效(是否由可信CA签发)。
- 密钥交换:客户端生成会话密钥,用公钥加密后发送。
- 加密通信:双方使用会话密钥加密数据。
关键点:确保传输过程防窃听、防篡改。
4. 发送HTTP请求:下单
GET / HTTP/1.1
Host: www.example.com
User-Agent: Chrome/120.0
Accept: text/html
Cookie: session_id=abc123
5. 服务器处理请求:打包商品
- Web服务器(如Nginx) :处理静态资源(HTML、CSS)。
- 应用服务器(如Tomcat) :执行业务逻辑(查询数据库)。
- 数据库(如MySQL) :返回查询结果(商品数据)。
6. 接收HTTP响应:快递发货
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
<!DOCTYPE html>
<html>...</html>
7. 浏览器解析渲染:拆箱验货
- 解析HTML:构建DOM树(网页结构)。
- 解析CSS:生成CSSOM树(样式规则)。
- 合并渲染树:DOM + CSSOM → 渲染树。
- 布局(Layout) :计算元素位置和大小。
- 绘制(Paint) :将像素输出到屏幕。
优化点:
- 异步加载JS:使用
async或defer避免阻塞DOM解析。 - 懒加载图片:仅加载可视区域内的图片。
8. 加载附加资源:拆多个包裹
- 并发请求:浏览器并行下载图片、JS、CSS(同一域名默认6个并发)。
- 缓存策略:检查
Cache-Control和ETag,复用本地缓存。
三、关键问题与解决方案
| 问题 | 解决方案 |
|---|---|
| DNS解析慢 | 使用DNS预解析 <link rel="dns-prefetch"> |
| TCP握手延迟 | 启用HTTP/2或HTTP/3(QUIC协议) |
| 渲染阻塞 | 内联关键CSS,异步加载JS |
| 资源过大 | 压缩文件(Gzip/Brotli),CDN加速 |
| HTTPS证书错误 | 检查证书有效期,更新为可信CA签发 |
四、总结口诀
“输入URL找IP,三次握手建连接。
HTTPS加个密,请求响应传数据。
解析渲染拼页面,资源加载别忘记。
缓存并发优化好,网页秒开用户喜!”