一、整体流程概述
HTTP请求过程从用户输入URL开始,到页面完成渲染结束,主要分为 DNS解析、建立连接、发送请求、处理响应、渲染页面、断开连接 六个核心阶段。
重要:
当用户输入URL后,浏览器首先解析域名,通过DNS查询获取服务器IP。接着通过三次握手建立TCP连接,如果是HTTPS还会进行TLS加密协商。然后浏览器发送HTTP请求,服务器处理后返回响应数据。浏览器解析HTML/CSS,构建DOM和渲染树,最终绘制页面。完成渲染后,通过四次挥手断开连接。整个过程涉及网络协议、服务器处理、浏览器渲染等多个环节,优化手段包括使用HTTP/2、CDN和缓存策略等。
二、分步骤详细说明
1、URL解析与DNS查询
(1)核心步骤:
- 浏览器解析URL,分离协议(HTTP/HTTPS)、域名(如
www.example.com
)、路径。- DNS查询:
检查浏览器缓存 → 系统缓存 → 路由器缓存 → 本地DNS服务器。
若缓存未命中,递归查询至根DNS → 顶级域DNS(如
.com
)→ 权威DNS,最终获取目标IP(如93.184.216.34
)。(2)示例:输入https://www.baidu.com,浏览器通过DNS解析获取服务器IP地址。
2、建立TCP连接(三次握手)
目的:确保可靠传输。
流程:
客户端发送 SYN包(序列号
x
),请求建立连接。服务器返回 SYN-ACK包(序列号
y
,确认号x+1
),确认客户端的连接请求。客户端发送 ACK包(确认号
y+1
),确认服务端的响应,双方正式建立连接。关键点:
三次握手确保双方确认彼此的收发能力,HTTP默认端口80,HTTPS为443。为什么需要三次握手?
防止历史重复连接的初始化,确保上方收发能力正常。
具体回答如下:
三次握手的核心目的是确保双方具备双向通信能力,并同步初始序列号。如果只有两次握手:
无法防止历史连接:网络延迟导致的旧SYN报文可能让服务器误建连接,浪费资源。
无法验证客户端接收能力:服务器无法确认客户端能否正常接收数据。
三次握手通过客户端对服务器SYN的确认(第三次ACK),既解决了历史连接问题,又验证了双向通信能力,是可靠性与效率的最佳平衡。
3、TLS握手(仅HTTPS)
流程:
客户端发送支持的加密套件列表。
服务器返回证书和选择的加密套件。
客户端验证证书(如CA机构颁发),生成对称密钥并用公钥加密发送。
双方切换至对称加密通信。
示例:
HTTPS通过TLS加密,防止中间人攻击,确保数据安全。
4、发送HTTP请求
请求结构:
请求行:方法(GET/POST)、路径(
/index.html
)、协议版本(HTTP/1.1)。请求头:
Host
(域名)、User-Agent
(客户端信息)、Cookie
(身份凭证)。请求体:POST/PUT方法时携带的表单数据。
示例:
http
GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Chrome/91.0
5、服务器处理与返回响应
服务器处理:
Web服务器(如Nginx)接收请求,转发至后端应用(如Node.js)。
应用执行业务逻辑(如查询数据库),生成响应内容(HTML/JSON)。
响应结构:
状态行:状态码(200 OK、404 Not Found)。
响应头:
Content-Type
(数据类型)、Cache-Control
(缓存策略)。响应体:HTML、图片等数据。
示例:
HTTP/1.1 200 OK Content-Type: text/html <html>...</html>
6、浏览器解析与渲染
关键步骤:
解析HTML构建DOM树:将HTML标签转换为树形结构。
解析CSS生成CSSOM树:确定样式规则。
合并渲染树:DOM + CSSOM → 确定可见元素。
布局(Layout):计算元素的位置和尺寸。
绘制(Paint):将像素输出到屏幕。
优化点:
“JS可能阻塞渲染,建议将脚本放在底部或使用async/defer
。”
7、断开连接(四次挥手)
流程:
客户端发送 FIN包,请求关闭(通知对方不要再发送数据,但可以接收数据)。
服务器返回 ACK包(确认收到关闭请求,但可能仍有数据需要发送)。
服务器发送 FIN包(通知对方自己已做好准备断开连接)。
客户端返回 ACK包,连接关闭(确保服务器收到最后的确认,防止旧数据干扰新连接)。
意义:
四次挥手确保双方数据完整传输,避免资源泄漏。为什么需要四次挥手?
TCP是全双工协议,双方需要独立关闭各自的发送通道。客户端发送
FIN
表示不再发送数据,但服务器可能仍有数据要传输,因此先回复ACK
确认,处理完数据后再发送自己的FIN
。若合并为三次挥手,可能导致数据未发送完毕就被强制关闭。四次挥手的设计确保了双向通道的可靠关闭,同时通过TIME-WAIT
状态解决网截断络延迟导致的报文冲突问题。
三、对比三次握手和四次挥手:
阶段 | 三次握手 | 四次挥手 |
目的 | 建立双向通信能力 | 关闭双向通信能力 |
报文合并 | SYN和ACK可合并(SYN-ACK) | ACK和FIN一般不能合并 |
关键原因 | 建立连接时无数据传输 | 断开连接时可能存在未发完的数据 |