访问网站时HTTP具体经历了哪些步骤?http协议工作原理详解
- 云服务器
- 2026-07-10
- 9
当用户在浏览器地址栏输入一个网址并按下回车键后,浏览器与服务器之间会经历一系列复杂而精密的交互过程,这个过程不仅仅是简单的“请求-响应”,而是涉及域名解析、TCP连接建立、HTTP协议交互以及数据传输等多个层面,以下将详细拆解这一全过程。
域名解析(DNS Resolution)
浏览器在发起网络请求之前,首先需要知道目标服务器的IP地址,由于人类记忆的是域名(如 www.example.com),而计算机通信依赖的是IP地址(如 0.2.1),因此第一步是将域名转换为IP地址。
- 浏览器缓存检查:浏览器首先检查自身缓存中是否有该域名的记录。
- 系统缓存检查:若浏览器无缓存,则查询操作系统的DNS缓存(如Windows的hosts文件或macOS/Linux的nscd)。
- 递归查询:若本地无记录,操作系统会向配置的DNS递归解析器(通常由ISP提供或公共DNS如8.8.8.8)发起查询。
- 迭代查询:递归解析器依次向根域名服务器、顶级域名服务器(TLD,如.com)、权威域名服务器查询,最终获取目标域名的IP地址。
- 缓存记录:获取IP后,浏览器、操作系统和DNS解析器都会将该记录缓存一段时间(TTL),以便下次快速访问。
TCP连接建立(三次握手)
获得IP地址后,浏览器需要通过TCP协议与服务器建立可靠的连接,TCP是面向连接的协议,确保数据能准确无误地传输。
- 第一次握手:客户端(浏览器)向服务器发送一个SYN(同步序列编号)包,进入SYN_SENT状态,等待服务器确认。
- 第二次握手:服务器收到SYN包后,必须确认客户的SYN(ACK),同时自己也发送一个SYN包(即SYN+ACK包),此时服务器进入SYN_RECV状态。
- 第三次握手:客户端收到服务器的SYN+ACK包后,向服务器发送确认包ACK(ACK包是将服务器的SEQ值+1),此时双方都进入ESTABLISHED状态,连接建立成功。
注意:如果是HTTPS网站,在TCP握手之后,还需要进行TLS/SSL握手以建立加密通道,但这属于应用层之前的安全层,此处主要讨论HTTP访问的基础流程。
发送HTTP请求
连接建立后,浏览器构造HTTP请求报文并发送给服务器,请求报文主要由三部分组成:

| 组成部分 | 说明 | 示例 |
|---|---|---|
| 请求行 | 包含请求方法、请求URL和HTTP协议版本 | GET /index.html HTTP/1.1 |
| 请求头 | 包含客户端信息、缓存控制、Cookie等元数据 | Host: www.example.com User-Agent: Mozilla/5.0... Accept: text/html |
| 请求体 | 仅POST/PUT等方法携带,包含提交的数据 | username=admin&password=123 |
常见的请求方法包括:
- GET:请求获取指定资源,数据附加在URL中。
- POST:向指定资源提交数据进行处理请求(如提交表单),数据在请求体中。
服务器处理请求
服务器收到HTTP请求后,Web服务器软件(如Nginx, Apache)或后端应用服务器(如Tomcat, Node.js)会对请求进行处理:
- 路由匹配:根据URL路径和方法,找到对应的处理程序或控制器。
- 业务逻辑处理:执行必要的计算、数据库查询、文件读取等操作。
- 生成响应:根据处理结果,生成HTTP响应报文。
返回HTTP响应
服务器将构建好的HTTP响应报文发送回客户端,响应报文同样由三部分组成:
|
组成部分
| 说明 | 示例 |
|---|---|---|
| 状态行 | 包含HTTP协议版本、状态码和状态消息 | HTTP/1.1 200 OK |
| 响应头 | 包含服务器信息、内容类型、缓存策略等 | Content-Type: text/html; charset=utf-8 Set-Cookie: session_id=abc123 |
| 响应体 | 实际返回给客户端的内容,如HTML、JSON、图片等 | <html>...</html> |
常见状态码:
- 200 OK:请求成功。
- 301/302 Found:重定向,浏览器需访问新URL。
- 304 Not Modified:资源未修改,浏览器可使用本地缓存。
- 404 Not Found:资源未找到。
- 500 Internal Server Error:服务器内部错误。
浏览器渲染页面
浏览器收到响应体后,会根据内容类型进行相应处理:
- 如果是HTML:浏览器开始解析HTML,构建DOM树(Document Object Model)和CSSOM树(CSS Object Model),然后合并为渲染树(Render Tree),接着进行布局(Layout)和绘制(Paint),最终将页面展示给用户。
- 如果是其他资源(如JS、CSS、图片):浏览器会发起额外的HTTP请求下载这些资源,并执行或应用它们。
- 如果是JSON/API数据:前端JavaScript代码会接收数据,并通过DOM操作动态更新页面内容(SPA单页应用常见)。
连接关闭(四次挥手)
当数据传输完成后,TCP连接通常会被关闭以释放资源。
- 第一次挥手:客户端发送FIN(结束)包,表示不再发送数据。
- 第二次挥手:服务器收到FIN后,发送ACK确认,此时客户端进入

FIN_WAIT_1状态,服务器进入CLOSE_WAIT状态。
- 第三次挥手:服务器处理完剩余数据后,发送FIN包给客户端。
- 第四次挥手:客户端收到FIN后,发送ACK确认,进入TIME_WAIT状态,等待一段时间后彻底关闭连接;服务器收到ACK后立即关闭。
相关问题与解答
问题1:为什么HTTP请求中会有“Keep-Alive”机制?它如何影响访问速度?
解答:
在早期的HTTP/1.0中,每次请求都需要建立一次新的TCP连接,请求结束后立即关闭,这意味着加载一个包含多个资源(如图片、CSS、JS)的网页,需要多次执行“三次握手”和“四次挥手”,这带来了巨大的延迟开销。
HTTP/1.1引入了Keep-Alive(持久连接)机制,默认情况下,TCP连接在发送完响应后不会立即关闭,而是保持打开状态,允许在同一连接上发送多个HTTP请求,这显著减少了TCP握手和挥手的次数,降低了网络延迟,提高了页面加载速度,在HTTP/2中,多路复用技术进一步在此基础上优化了并发性能。
问题2:当浏览器输入URL并回车后,如果DNS解析失败,会发生什么?如果服务器返回404,浏览器会如何表现?
解答:
- DNS解析失败:如果DNS查询最终无法找到域名的IP地址(例如域名拼写错误或DNS服务器故障),浏览器会向用户显示一个错误页面,通常提示“无法连接到服务器”、“DNS_PROBE_FINISHED_NXDOMAIN”或“此网站无法提供安全连接”等,TCP连接甚至无法建立,因为目标地址未知。
- 服务器返回404:如果DNS解析成功,TCP连接建立成功,但服务器在路由匹配时找不到对应的资源(如文件被删除或URL错误),服务器会返回状态码404 Not Found,浏览器接收到响应后,通常会显示服务器自定义的404错误页面,或者浏览器自带的默认错误页面,告知用户请求的资源不存在,TCP连接可能会根据Connection头部的设置选择关闭或保持。
