计算机网络 浏览器中输入 url 回车后的过程【超全!详细!一步步解析!】
当你在浏览器中输入 URL(比如 https://www.example.com)并按下回车后,一个复杂的、高度优化的连锁反应就开始了。以下是详细的步骤说明:
🌐 1. URL 解析
- 浏览器 首先解析你输入的URL。
- 协议:
https://(告诉浏览器使用 HTTP Secure 协议)。 - 域名:
www.example.com(目标服务器的地址)。 - 可能的路径:
/path/to/resource(服务器上特定的资源位置)。 - 可能的查询参数:
?key=value(传递给服务器的额外信息)。 - 可能的锚点:
#section(页面内部的片段标识符,由浏览器处理,不发送到服务器)。
- 协议:
- 如果输入的不是完整的URL(例如只是一个搜索词),浏览器会使用其默认搜索引擎进行搜索。
🧠 2. 检查缓存(本地查找)
- 浏览器缓存: 浏览器先查询自己的本地缓存(HSTS 缓存等),看看是否最近访问过该网站,是否有指令强制使用 HTTPS(HSTS)。
- Hosts 文件: 操作系统会检查本地的
hosts文件,看是否有手动指定的域名到 IP 地址的映射。
📡 3. DNS 查询(域名解析)
- 浏览器需要找到
www.example.com对应的真实 IP 地址(例如93.184.216.34)。 - 过程如下(通常毫秒级完成):
- 浏览器缓存: 先检查浏览器自己的 DNS 缓存。
- 操作系统缓存: 再检查操作系统的 DNS 缓存(如 Windows 的 DNS Client 服务缓存)。
- 路由器缓存: 请求发送到本地网络的路由器/网关,检查其 DNS 缓存。
- ISP 的 DNS 服务器:
- 如果缓存都没有,浏览器会向你的互联网服务提供商(ISP) 的 递归 DNS 解析器 发送一个 DNS 查询请求。
- 递归解析器负责“跑腿”,它会依次查询 根 DNS 服务器(告诉它 .com 的顶级域服务器地址) --> .com 顶级域 DNS 服务器(告诉它 example.com 的权威 DNS 服务器地址) --> example.com 的权威 DNS 服务器(最终返回
www.example.com的 IP 地址)。 - 递归解析器将这个 IP 地址返回给你的浏览器,并且通常会缓存一段时间(遵循 TTL)。
- 结果: 浏览器最终获得了目标服务器的 IP 地址 (
93.184.216.34)。🖥️
🔒 4. 建立 TCP 连接(传输层)
- 浏览器使用获得的 IP 地址和端口号(HTTP 默认端口 80, HTTPS 默认端口 443)与目标服务器建立可靠的 TCP(传输控制协议)连接。
- 核心过程: TCP 三次握手(Three-way Handshake) 👋
- SYN: 你的浏览器向服务器发送一个
SYN(同步)包,说“我想和你通信”。 - SYN-ACK: 服务器收到
SYN后,如果同意连接,会发送一个SYN-ACK(同步-确认)包,表示“我收到了你的请求,我也准备好连接了”。 - ACK: 你的浏览器收到
SYN-ACK后,再向服务器发送一个ACK(确认)包,说“好,我们开始吧”。
- SYN: 你的浏览器向服务器发送一个
- 完成这三次握手后,一个双向通信的可靠 TCP 连接就建立起来了。
🔐 5. TLS/SSL 握手(安全性 - HTTPS)
- 如果 URL 使用的是
https://(现在绝大多数网站都是),在 TCP 连接建立之后,浏览器还需要和服务器进行 TLS(传输层安全,通常指 SSL)握手 来建立一个安全的加密通道。🔐 - 关键步骤:
- Client Hello: 浏览器告诉服务器它支持的 TLS 版本、加密套件列表等信息。
- Server Hello: 服务器选择它支持的 TLS 版本、加密套件,并发送其 SSL/TLS 证书(包含其域名、公钥、颁发机构等信息)。
- 证书验证: 浏览器根据内置的根证书颁发机构(CA) 列表验证服务器证书的有效性、合法性和是否过期。
- 生成密钥:
- 浏览器(客户端)生成一个随机的 会话密钥(Session Key)。
- 使用服务器的公钥(从证书中获得)来加密这个会话密钥,发送给服务器。
- 服务器用自己的私钥解密获得会话密钥。
- 完成握手: 双方使用协商好的加密套件和这个共享的会话密钥进行后续通信的加密和解密。
- 结果: 在 TCP 之上,建立起一个加密的、安全的 TLS 隧道,所有后续通信都被加密保护。
✉️ 6. 发送 HTTP(S) 请求
- 现在,浏览器可以通过安全(HTTPS)或不安全(HTTP)的连接,向服务器发送一个 HTTP 请求报文 了。这是获取网页内容的核心指令。
- 请求报文主要包含:
- 请求行: 请求方法(最常用的是
GET用于获取资源,也可能是POST提交表单数据等)、资源路径(/表示根目录或默认页)、HTTP 版本。 - 请求头(Request Headers): 附加信息,如:
Host: www.example.com(目标主机)User-Agent: Mozilla/5.0 ...(浏览器类型和版本)Accept: text/html, ...(浏览器能接受的响应内容类型)Accept-Language: en-US,en;q=0.9(浏览器偏好的语言)Cookie: name=value(之前存储的 cookie)- (还有其他很多头,如
Connection: keep-alive表示希望保持连接复用)
- 请求体(Request Body): 对于
POST、PUT等方法,这里会包含发送给服务器的数据(如表单内容、上传的文件等)。GET请求通常没有请求体。
- 请求行: 请求方法(最常用的是
💌 7. 服务器处理请求
- Web 服务器(如 Apache, Nginx, IIS)接收到请求报文。
- 处理过程:
- 路由: 根据请求的方法和路径 (
GET /index.html),将请求分发给负责处理该路径的后端程序(如 PHP, Python, Node.js, Java servlet)。 - 后端处理: 后端程序执行业务逻辑(可能涉及数据库查询、计算等)。
- 生成响应: 后端程序准备好要返回的数据(通常是 HTML、JSON、图片等),并将结果交给 Web 服务器。
- 路由: 根据请求的方法和路径 (
📦 8. 服务器返回 HTTP(S) 响应
- Web 服务器后端构建一个 HTTP 响应报文,并通过之前建立的连接发送回浏览器。
- 响应报文主要包含:
- 状态行: HTTP 版本、状态码(关键!如
200 OK表示成功,404 Not Found表示资源不存在,302 Found表示重定向,500 Internal Server Error表示服务器内部错误)。 - 响应头(Response Headers): 附加信息,如:
Content-Type: text/html; charset=UTF-8(告知浏览器内容是 HTML 文本)Content-Length: 1234(内容大小)Set-Cookie: name=value; options(要求浏览器存储 cookie)Cache-Control: max-age=3600(告诉浏览器如何缓存该资源)Location: https://new-url.com(用于重定向,状态码通常是 3xx)- (还有其他很多头)
- 响应体(Response Body): 这是服务器返回的实际内容,通常是用户请求的 HTML 文档、图片、JSON 数据、文件等。
- 状态行: HTTP 版本、状态码(关键!如
🧩 9. 浏览器解析响应并渲染页面
- 浏览器接收到响应报文,特别是读取到状态码
200 OK和Content-Type: text/html,就知道这是一个 HTML 页面。 - 关键步骤:
- 解析 HTML:
- 浏览器开始逐行解析收到的 HTML 内容。
- 构建 DOM(文档对象模型)树 - 这是一个将 HTML 标签结构映射成的、供 JavaScript 操作的内存中的树状结构。
- 构建 CSSOM:
- 在解析 HTML 的过程中遇到
<link>标签引入外部 CSS 或内部的<style>标签时,浏览器会下载(如果是外部)并解析 CSS。 - 构建 CSSOM(CSS 对象模型)树 - 这是一组 CSS 规则的树形表示,决定了每个 DOM 节点应如何被样式化。
- 在解析 HTML 的过程中遇到
- 组合: 渲染树(Render Tree)
- 将 DOM 树和 CSSOM 树合并成一个 渲染树(Render Tree)。渲染树只包含需要在屏幕上显示的元素(隐藏元素如
display: none的 DOM 节点不会包含在内)。渲染树是最终绘制的依据。
- 将 DOM 树和 CSSOM 树合并成一个 渲染树(Render Tree)。渲染树只包含需要在屏幕上显示的元素(隐藏元素如
- 布局(Layout / Reflow):
- 计算渲染树中每个元素在屏幕视口(Viewport)内的确切位置和大小(尺寸)。这是一个计算量很大的过程。
- 绘制(Paint):
- 将布局计算好的渲染树元素转换成屏幕上的实际像素。这包括填充颜色、绘制边框、文本、图片等。
- 合成(Composite) (可选优化):
- 现代浏览器会对页面分层(Layers),分别绘制,然后进行合成(Compositing)。这能提高性能和实现某些动画效果(如只重绘变化的层)。
- 执行 JavaScript:
- 在解析 HTML 时,如果遇到
<script>标签(无论是内部的还是外部的),HTML 解析器会暂停解析 HTML,加载(如果是外部)并立即执行 JavaScript 代码。🤖 - 注意: JavaScript 可以访问和修改 DOM 树和 CSSOM。因此如果脚本修改了 DOM 或样式,很可能会触发重新布局和重绘(即 Reflow 和 Repaint),这是一个潜在的性能瓶颈点。
- 在解析 HTML 时,如果遇到
- 解析 HTML:
- 重要事件触发:
**DOMContentLoaded**** 事件:** 当初始的 HTML 文档被完全加载和解析完成(不等待外部资源如图片、子帧加载完成)后触发。表示 DOM 树已经构建好,JS 可以安全操作 DOM。**load**** 事件:** 当整个页面及其所有依赖资源(如样式表、脚本、图片、子框架等)都已完成加载时触发。
🔁 10. 加载其他资源
- 在解析 HTML 和构建渲染树的过程中,浏览器会遇到需要加载的外部资源:
- 图片:
<img src="..."> - 样式表:
<link rel="stylesheet" href="..."> - 字体:
@font-face - 脚本:
<script src="..."></script> - Iframes:
<iframe src="...">
- 图片:
- 对于这些资源,浏览器会:
- 为每个资源发起新的 HTTP(S) 请求(可能是同一个域名,也可能不同域名,涉及跨域问题)。这个过程和之前的步骤类似(需要建立 TCP 连接等,但因为同一个服务器,可能复用已有的连接),但通常要快得多。
- 获取响应并解析这些资源。
- 根据资源类型处理:
- 图片: 解码并绘制到屏幕上(可能引起重绘)。
- CSS: 应用到对应的 DOM 节点(可能引起重新布局 Reflow 和重绘 Repaint)。
- JS: 立即执行(可能阻塞渲染和引发布局/绘制变动)。
- 字体: 下载完成后会触发文字的重绘。
⚡ 11. 页面交互
- 一旦页面渲染完成,浏览器会持续:
- 执行 JavaScript: 处理用户事件(点击、滚动、按键等)、执行定时器、发起 Ajax/Fetch 请求以动态获取数据、更新页面内容(Single Page Application / SPA 的核心机制)。
- 重绘与重排: 响应用户交互或 JS 导致的 DOM/CSS 变化,可能触发局部或全局的布局计算(Reflow)和重绘(Repaint)操作,以更新屏幕显示。
📌 总结关键点
- DNS 解析: 将人类可读的域名转换为机器 IP 地址。
- TCP 握手: 建立可靠的端到端连接基础。
- TLS 握手: 为 HTTPS 连接建立加密通道。
- HTTP 请求/响应: 客户端请求资源,服务器返回数据。
- 浏览器引擎处理: 解析、构建 DOM/CSSOM 树、创建渲染树、布局、绘制。
- JavaScript 引擎处理: 执行 JS 代码,可与 DOM/CSSOM 交互。
- 资源加载: 并行加载图片、CSS、JS、字体等外部资源。
- 事件驱动:
DOMContentLoaded和load事件标志着重要里程碑。 - 页面渲染与交互: 最终的视觉呈现和响应用户操作。
整个流程涉及硬件、操作系统、网络基础设施、HTTP 协议、浏览器引擎等多个层面。理解这个流程是理解 Web 工作原理和进行性能优化的关键基础!💡
本文来自博客园,作者:NeoLshu,转载请注明原文链接:https://www.cnblogs.com/neolshu/p/19120475

浙公网安备 33010602011771号