当前位置: 首页 > news >正文

浏览器发送网页详细过程分解

好的,这是一个非常经典且重要的面试题和技术知识点。浏览器从发起 HTTP 请求到最终渲染出网页的过程,可以清晰地分为以下几个核心阶段。

为了更直观地理解,你可以将整个过程想象成寄送和组装一个乐高包裹

  1. DNS 解析:查收件人(服务器)的确切地址。
  2. 建立 TCP 连接:开车到收件地址,敲开门并建立联系。
  3. 发送 HTTP 请求:把想要的乐高套装型号(请求信息)告诉收件人。
  4. 服务器处理请求并返回 HTTP 响应:收件人找到对应的乐高盒子(资源),打包好给你。
  5. 浏览器解析和渲染页面:你收到包裹,打开盒子,按照说明书一步步拼装乐高。
  6. 连接结束:完成后,你们互相道别(关闭连接)。

详细过程分解

阶段一:DNS 解析 (Domain Name System)
  • 目的:将人类可读的域名 (如 www.google.com) 转换为机器可读的 IP 地址 (如 142.251.42.206)。
  • 过程
    1. 浏览器缓存:浏览器首先检查自身缓存中是否有该域名的 IP。
    2. 系统缓存:如果浏览器没有,检查操作系统的 hosts 文件和缓存。
    3. 路由器缓存:查询路由器缓存。
    4. ISP DNS 服务器:向互联网服务提供商 (ISP) 的 DNS 服务器发起查询。
    5. 递归/迭代查询:如果 ISP 的服务器也没有,它会从 DNS 根服务器开始,依次向顶级域服务器(.com)、权威域服务器(google.com)进行迭代查询,最终找到正确的 IP。
  • 结果:拿到目标服务器的 IP 地址。
阶段二:建立 TCP 连接 (三次握手)
  • 目的:在浏览器和服务器之间建立一个可靠的、面向连接的通信通道。HTTP 协议依赖于 TCP 协议来传输数据。
  • 过程 (三次握手)
    1. SYN:浏览器向服务器发送一个 SYN (Synchronize Sequence Numbers) 包,请求建立连接。
    2. SYN-ACK:服务器收到后,如果同意连接,会回复一个 SYN-ACK 包作为应答。
    3. ACK:浏览器收到 SYN-ACK 后,再向服务器发送一个 ACK (Acknowledgment) 包确认。连接至此建立。
  • 如果使用 HTTPS:在 TCP 连接建立后,还会进行 TLS 握手,交换密钥、验证证书,建立一个安全的加密通道。这通常需要额外的往返。
阶段三:浏览器发送 HTTP 请求
  • 目的:告诉服务器客户端需要什么资源。
  • 内容:一个标准的 HTTP 请求报文,通过已建立的 TCP 连接发送出去。报文主要包括:
    • 请求行:包含方法 (GET, POST 等)、请求的 URL 路径、HTTP 版本。
    • 请求头 (Headers):包含大量元信息,如:
      • Host: 目标域名
      • User-Agent: 浏览器身份标识
      • Accept: 客户端能处理的内容类型 (如 text/html)
      • Cookie: 携带本地cookie信息
    • 请求体 (Body):主要存在于 POST、PUT 等方法中,包含要提交的数据 (如表单数据、JSON 等)。GET 请求没有请求体。
阶段四:服务器处理请求并返回 HTTP 响应
  • 目的:处理请求并返回客户端所需的数据。
  • 服务器端过程
    1. 服务器(如 Nginx, Apache)接收请求。
    2. 可能将请求转发给后端应用服务器(如 Tomcat, Django, Node.js)。
    3. 后端程序处理业务逻辑(查询数据库、计算等)。
    4. 生成一个 HTTP 响应报文。
  • 响应报文
    • 状态行:包含 HTTP 版本、状态码 (如 200 OK, 404 Not Found) 和状态信息。
    • 响应头 (Headers):包含响应的元信息,如:
      • Content-Type: 响应体的数据类型 (如 text/html; charset=utf-8)
      • Content-Length: 响应体的长度
      • Set-Cookie: 设置 Cookie 到浏览器
    • 响应体 (Body):真正的请求资源内容,如 HTML 文档、图片数据、JSON 数据等。
阶段五:浏览器解析和渲染页面

这是最复杂的一步。浏览器拿到 HTML 响应后,开始解析和渲染:

  1. 解析 HTML,构建 DOM 树
    • 浏览器解析 HTML 字节流,将其转换为令牌 (Tokens),然后构建成DOM(文档对象模型)树。这是一个表示页面结构的树状结构。
  2. 解析 CSS,构建 CSSOM 树
    • 遇到 <link><style>标签时,开始解析 CSS,构建 CSSOM(CSS对象模型)树。它决定了每个节点的样式。
  3. 合并 DOM 和 CSSOM,构建渲染树 (Render Tree)
    • 将 DOM 树和 CSSOM 树合并,生成渲染树。渲染树只包含需要在屏幕上显示的元素(如不包含 display: none的元素)。
  4. 布局 (Layout / Reflow)
    • 计算渲染树中每个元素在设备视口 (viewport) 内的确切位置和大小。这个阶段就是“计算盒模型”。
  5. 绘制 (Painting)
    • 将布局计算后的每个节点,转换为屏幕上的实际像素。包括绘制文本、颜色、图像、边框、阴影等。
  6. 合成 (Compositing)
    • 将各层绘制内容合成为一个完整的页面显示到屏幕上。

注意:解析 HTML 时,如果遇到 <script>标签(尤其是没有 asyncdefer属性的),会停止 HTML 解析,先下载并执行 JavaScript。因为 JS 可能会修改 DOM 结构。

阶段六:断开连接 (四次挥手)
  • 目的:完成数据传输后,安全地关闭 TCP 连接,释放系统资源。
  • 过程 (四次挥手)
    1. FIN:浏览器(或服务器)发送 FIN 包,表示数据发送完毕,请求关闭连接。
    2. ACK:服务器收到 FIN 后,发送 ACK 包进行确认。
    3. FIN:服务器处理完所有数据后,也发送一个 FIN 包给浏览器。
    4. ACK:浏览器收到 FIN 后,发送最后的 ACK 包确认。等待一段时间后,连接正式关闭。

总结流程图

graph TDA[用户输入URL并回车] --> B[DNS解析]B --> C[获取服务器IP地址]C --> D[TCP三次握手]D --> E[发送HTTP请求]E --> F[服务器处理并返回响应]F --> G[浏览器解析渲染]subgraph G [浏览器解析渲染]G1[解析HTML构建DOM树]G2[解析CSS构建CSSOM树]G3[合并生成渲染树]G4[布局 Layout]G5[绘制 Painting]endG --> H[TCP四次挥手断开连接]H --> I[页面展示完成]
http://www.dtcms.com/a/348832.html

相关文章:

  • 释放工作精力:火语言 RPA 的实用功能与效率提升​
  • VMware centos磁盘容量扩容教程
  • 解决虚拟机network服务启动失败问题
  • Linux中的指令
  • 从字节码层面剖析以太坊智能合约创建原理
  • [OpenVela] 音乐播放器1.0
  • Latent Action在具身智能中的使用
  • C++——多态
  • 【ABAP4】基本语法1
  • 第4章栈和队列:队列基础知识
  • pom.xml 标签整理各个标签的用途和含义
  • 蓝凌EKP产品:从 XML 到 JSON ——表单存储的性能优化实践
  • 前端漏洞(上)- CSRF漏洞
  • 强光干扰下误检率↓79%!陌讯动态决策算法在安全带检测的实战优化
  • Redis详解--基本篇
  • Linux 的 TCP 网络编程常用API
  • 网络流量分析——使用捕获和显示过滤器查询网络流量
  • 每天自动备份oracle
  • 关于熵减 - 力学单位和来源
  • 安装gitlab
  • C++ AOV 拓扑排序
  • pyecharts可视化图表-scatter:从入门到精通
  • 2020/12 JLPT听力原文 问题二 5番
  • 【网络运维】Shell 脚本编程:case 条件语句
  • 【大语言模型 18】Vision Transformer革命解析:图像理解的范式突破与架构创新
  • VsCode使用SFTP连接Linux
  • 油雾干扰下误报率↓76%!陌讯动态感知算法在卸油作业安全识别中的实战突破
  • Java:HashSet的使用
  • 【MySQL】CRUD基础详解
  • 基于 Redis + JWT 的跨系统身份共享方案