浏览器访问[http://www.taobao.com](http://www.taobao.com/),经历了怎样的过程。
浏览器访问 http://www.taobao.com
(实际会重定向到HTTPS,即 https://www.taobao.com
)的过程可分为以下核心步骤,涵盖域名解析、网络连接、请求发送、服务器处理、响应接收及页面渲染等环节:
一、域名解析(DNS查询)
- 浏览器缓存检查
首先查询浏览器本地缓存(存储最近访问过的域名-IP映射,通常有效期几分钟到几小时)。若存在www.taobao.com
的缓存记录,直接获取IP地址,跳过后续步骤;若无,则进入下一步。 - 系统缓存检查
若浏览器缓存未命中,操作系统会查询本地DNS缓存(如Windows的hosts
文件或DNS缓存表)。部分系统可能配置了静态DNS(如手动设置的114.114.114.114),也可能触发递归查询。 - 路由器缓存查询
若系统和浏览器缓存均未命中,请求被发送到家庭或办公网络的路由器。路由器会检查自身的DNS缓存,若有记录则直接返回IP,否则继续向上层查询。 - ISP DNS服务器查询
路由器将请求转发至互联网服务提供商(ISP)的DNS服务器(如电信、移动的DNS)。ISP服务器可能缓存常用域名解析结果,若命中则返回IP;若未命中,启动递归查询。 - 根域名服务器递归查询
ISP DNS向全球13台根域名服务器(逻辑上13台,物理上分布全球)发送请求,询问.com
顶级域名的权威DNS服务器地址(根服务器返回.com
的NS记录)。
接着向.com
顶级域名服务器查询taobao.com
的权威DNS服务器地址(返回taobao.com
的NS记录)。
最后向taobao.com
的权威DNS服务器请求www.taobao.com
的A记录(IPv4地址)或AAAA记录(IPv6地址)。
(注:实际中,权威DNS服务器可能通过任播技术部署多台物理服务器,确保快速响应。) - CDN节点调度(可选)
淘宝作为大型电商网站,会通过DNS解析结果将用户引导至最近的CDN(内容分发网络)节点,以减少延迟。CDN节点的IP地址可能通过DNS的地理定位或Anycast技术返回。
二、建立TCP连接(以HTTPS为例,实际淘宝强制HTTPS)
- HTTP重定向到HTTPS
若用户直接访问http://www.taobao.com
,服务器会返回 301/302重定向 状态码,引导浏览器切换到https://www.taobao.com
。 - TLS/SSL握手(HTTPS特有)
浏览器与服务器协商加密协议版本、交换密钥,建立安全通道(过程包括ClientHello、ServerHello、证书交换、密钥计算等,耗时通常几十毫秒)。 - TCP三次握手
通过TCP协议建立可靠连接:- 客户端发送SYN包(含初始序列号);
- 服务器返回SYN+ACK包(确认序列号并发送自己的序列号);
- 客户端发送ACK包,连接建立完成。
三、发送HTTP请求
- 构建请求报文
浏览器发送 GET请求(或HTTPS的CONNECT隧道请求),请求头包含:Host: www.taobao.com
(指定目标服务器);User-Agent
(浏览器标识,如Chrome/Firefox);Cookie
(存储用户登录状态、购物车信息等,如cna=XXXXX
);Accept
/Accept-Language
(声明可接受的响应格式和语言);Connection: keep-alive
(复用TCP连接,减少握手开销);- 若访问过且启用缓存,可能包含
If-None-Match
(ETag值)或If-Modified-Since
(上次修改时间),用于条件请求验证缓存。
- 请求发送
数据通过TCP连接分段传输,经路由器、ISP、骨干网最终到达淘宝的负载均衡服务器(如阿里云SLB)。
四、服务器处理请求
- 负载均衡与路由
请求首先到达阿里云的负载均衡集群,根据地理位置、服务器负载等因素,将请求转发至后端应用服务器(如Java/Node.js集群)或CDN边缘节点(若资源已缓存)。 - 业务逻辑处理
应用服务器解析请求,校验Cookie/Session,查询数据库(如用户信息、商品数据),生成动态内容(如个性化推荐、实时价格),或从缓存系统(如Redis/Tair)读取热点数据。 - 响应生成
服务器组装HTML、CSS、JavaScript等资源,生成HTTP响应报文:- 状态码:
200 OK
(成功)、304 Not Modified
(缓存命中)、404 Not Found
(页面不存在)等; - 响应头:
Content-Type: text/html
(声明内容类型)、Cache-Control
(缓存策略,如max-age=3600
)、ETag
(资源唯一标识); - 响应体:HTML文档(含页面结构、资源引用路径)。
- 状态码:
五、接收响应与浏览器处理
- 响应解析
浏览器接收响应后,先检查状态码:- 若为
304 Not Modified
,表示资源未更新,直接使用本地缓存,跳过渲染流程; - 若为
200 OK
,继续解析响应头和响应体。
- 若为
- 缓存处理
根据Cache-Control
和ETag
等头信息,决定将资源缓存至内存(临时)或磁盘(长期),以便下次快速访问。 - HTML解析与渲染
- 构建DOM树:解析HTML标签,生成文档对象模型(DOM);
- 构建CSSOM:解析CSS样式,生成CSS对象模型;
- 生成渲染树(Render Tree):合并DOM和CSSOM,排除不可见元素(如
<head>
); - 布局(Layout):计算元素尺寸和位置(流式布局或弹性布局);
- 绘制(Painting):将渲染树转换为屏幕像素(光栅化);
- 合成(Compositing):处理多层元素(如CSS3动画、视频),最终显示页面。
- 资源加载
解析HTML中的<img>
、<link>
、<script>
等标签,发起额外HTTP请求加载图片、CSS、JavaScript、字体等资源。这些请求复用TCP连接(若keep-alive
生效)或建立新连接,遵循浏览器并发连接限制(通常6-8个/域名)。 - JavaScript执行
加载JS文件后,按顺序执行(可能阻塞DOM渲染,除非声明async
/defer
),操作DOM、绑定事件,实现交互功能(如购物车动画、表单验证)。
六、连接关闭与页面完成
- TCP连接释放
若请求完成后未设置keep-alive
,浏览器发送FIN
包发起四次挥手,关闭连接;若启用keep-alive
,连接保持打开,供后续请求复用(减少握手延迟)。 - 页面交互准备
所有资源加载完成且DOM渲染结束后,标签页的加载动画(旋转圆圈)停止,页面变为可交互状态。此时JavaScript事件监听器生效,用户可与页面交互(如点击按钮、滚动列表)。
关键优化点(以淘宝为例)
- CDN加速:静态资源(图片、JS、CSS)通过CDN节点就近分发,降低延迟;
- HTTP/2多路复用:单个TCP连接承载多个请求,避免队头阻塞;
- 资源压缩:使用Gzip/Brotli压缩文本资源,减少传输体积;
- 缓存策略:对不常变动的资源(如字体、通用JS)设置长期缓存(
Cache-Control: max-age=31536000
); - 预加载与懒加载:提前加载关键资源(如首页商品图),延迟加载非视口内容(如底部导航)。
总结
一次看似简单的网页访问,背后涉及数十个网络节点协作、复杂的缓存机制和高效的渲染算法。从DNS解析到页面渲染,每个环节的优化(如CDN、HTTP/2、浏览器渲染引擎)都直接影响用户体验,而大型网站如淘宝正是通过全链路优化,实现了毫秒级的响应速度和流畅的交互体验。