当前位置:首页 > 云服务器 > 正文

访问网站时HTTP具体经历了哪些步骤?http协议工作原理详解

当用户在浏览器地址栏输入一个网址并按下回车键后,浏览器与服务器之间会经历一系列复杂而精密的交互过程,这个过程不仅仅是简单的“请求-响应”,而是涉及域名解析、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请求报文并发送给服务器,请求报文主要由三部分组成:

访问网站时HTTP具体经历了哪些步骤?http协议工作原理详解 第1张

组成部分 说明 示例
请求行 包含请求方法、请求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)会对请求进行处理:

  1. 路由匹配:根据URL路径和方法,找到对应的处理程序或控制器。
  2. 业务逻辑处理:执行必要的计算、数据库查询、文件读取等操作。
  3. 生成响应:根据处理结果,生成HTTP响应报文。

返回HTTP响应

服务器将构建好的HTTP响应报文发送回客户端,响应报文同样由三部分组成:

组成部分

访问网站时HTTP具体经历了哪些步骤?http协议工作原理详解 第2张

说明 示例
状态行 包含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确认,此时客户端进入

    访问网站时HTTP具体经历了哪些步骤?http协议工作原理详解 第3张

    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头部的设置选择关闭或保持。

0