在说这个问题之前,先说一些专用技术、软件、数据库等
前端 SPA 应用的含义和工作原理
一、前端 SPA 应用的含义
前端 SPA 应用 (Single-Page Application,单页应用)是一种现代前端开发架构,其核心特点是整个应用仅加载一个主 HTML 页面 ,后续的页面交互、内容更新都通过动态加载数据和修改 DOM实现,而无需重新请求和加载新的完整 HTML 页面。
简单来说,SPA 就像一个 "本地应用":打开后页面不会整体刷新,所有操作都在同一个窗口内完成,仅更新需要变化的部分内容。
二、SPA 的工作原理(以 "页面切换" 为例)
- 首次加载 :用户访问
https://example.com
时,服务器返回唯一的index.html
,以及依赖的 JS/CSS 资源。浏览器加载后执行 JS,渲染出初始页面(如 "首页")。 - 路由监听 :前端路由(如 Vue Router)监听 URL 的变化。当用户点击 "关于我们" 按钮时,JS 会修改 URL(如改为
https://example.com/#/about
或https://example.com/about
,后者依赖 History API),但不会向服务器发送请求。 - 数据请求 :路由匹配到 "关于我们" 视图后,前端通过 AJAX/Fetch 调用 API(如
https://example.com/api/about
),从服务器获取 "关于我们" 的文本、图片等数据。 - 视图更新:前端框架(如 Vue、React)利用虚拟 DOM 技术,仅更新页面中 "关于我们" 对应的 DOM 区域,而不刷新整个页面,实现无缝的内容切换。
URL的含义与基本结构
一、URL的含义
URL(Uniform Resource Locator,统一资源定位符)是互联网上用于标识和定位资源的字符串,通俗来说就是我们常说的 "网址"。它的核心作用是告诉浏览器(或其他客户端):"如何获取" 以及 "去哪里获取" 某个资源(如网页、图片、视频、API 接口等)。
二、URL 的基本结构
一个完整的 URL 由多个部分组成,格式通常为:
协议://域名[:端口]/路径[?查询参数][#片段标识符]
以下是各部分的详细说明(以示例 https://www.example.com:8080/path/to/page?name=test&id=1#section1
为例):
1. 协议(Scheme)
- 作用:规定客户端与服务器之间的通信规则(如何传输数据)。
- 示例 :
https
(超文本传输安全协议) - 常见协议 :
http
:超文本传输协议(不加密,安全性低)。https
:基于 SSL/TLS 的加密版 HTTP(主流,保护数据传输安全)。ftp
/ftps
:文件传输协议(用于传输文件)。mailto
:用于发送邮件(如mailto:user@example.com
)。file
:访问本地文件(如file:///C:/document.txt
)。
2. 域名(Domain Name)
- 作用:标识服务器的网络地址(替代难记的 IP 地址)。
- 示例 :
www.example.com
- 组成 :通常由 "主机名"+"域名" 构成,如
www
是主机名(服务器的具体名称),example.com
是注册的域名。 - 注意 :域名需通过 DNS 解析为 IP 地址(如
www.example.com
解析为192.168.1.1
),客户端才能与服务器通信。
3. 端口(Port)
- 作用:标识服务器上的具体 "服务端口"(一台服务器可同时运行多个服务,通过端口区分)。
- 示例 :
8080
(非默认端口,需显式指定) - 默认端口 :协议通常有默认端口,可省略不写:
http
默认端口:80
(如http://example.com
等价于http://example.com:80
)。https
默认端口:443
(如https://example.com
等价于https://example.com:443
)。
4. 路径(Path)
- 作用:指定服务器上资源的具体位置(类似文件系统的文件夹 / 文件路径)。
- 示例 :
/path/to/page
(表示服务器上path
文件夹下to
子文件夹中的page
资源)。 - 注意 :路径以
/
开头,可包含多个层级(如/api/user/list
表示 API 接口的路径)。
5. 查询参数(Query Parameters)
- 作用:向服务器传递额外的 "键值对" 信息(如筛选条件、分页参数等)。
- 示例 :
?name=test&id=1
- 规则 :
- 以
?
开头,多个参数用&
分隔(如?page=1&size=10
)。 - 参数格式为
键=值
(如name=test
表示 "名称为 test")。 - 特殊字符(如空格、中文)需编码(如空格编码为
%20
或+
,中文你好
编码为%E4%BD%A0%E5%A5%BD
)。
- 以
6. 片段标识符(Fragment)
- 作用:定位页面内的具体位置(如某个章节、锚点),仅在客户端生效(不会发送到服务器)。
- 示例 :
#section1
- 效果 :浏览器加载页面后,会自动滚动到页面中
id="section1"
的元素位置(如<div id="section1">...</div>
)。
web 网页通信过程
Web 网页的通信过程是指从用户在浏览器输入 URL(或点击链接)到页面最终显示在屏幕上的整个交互流程,涉及浏览器、DNS 服务器、Web 服务器 等多个角色,以及DNS 解析、TCP 连接、HTTP 请求 / 响应等多个协议的协作。
一、核心流程概览
整个过程可简化为以下步骤:
用户输入URL → 浏览器解析URL → DNS域名解析 → 建立TCP连接 → 发送HTTP请求 → 服务器处理请求 → 返回HTTP响应 → 浏览器渲染页面 → 关闭连接
二、详细步骤解析
1. 用户输入 URL 并触发请求
用户在浏览器地址栏输入 URL(如https://www.example.com/path
),或点击页面中的链接,浏览器首先判断这是一个网页请求,开始处理。
2. 浏览器解析 URL
URL(统一资源定位符)是访问资源的地址,浏览器需要解析出其中的关键信息:
- 协议 :如
http
(超文本传输协议)或https
(加密的 HTTP,基于 TLS/SSL)。 - 域名 :如
www.example.com
(服务器的 "网络名字")。 - 端口:协议默认端口(HTTP 默认 80,HTTPS 默认 443,若 URL 中未指定则使用默认)。
- 路径 :如
/path
(服务器上资源的具体位置)。 - 查询参数 :如
?id=1&name=test
(向服务器传递的额外信息)。
3. DNS 域名解析:将域名转换为 IP 地址
计算机之间通过IP 地址 (如192.168.1.1
)通信,但用户记忆的是域名(如www.example.com
),因此需要通过DNS(域名系统) 将域名解析为 IP 地址。
解析过程(类似 "查通讯录"):
- 浏览器缓存:先检查浏览器本地缓存(近期解析过的域名),若有直接使用。
- 操作系统缓存:若浏览器缓存无结果,检查操作系统 hosts 文件或系统缓存。
- 本地 DNS 服务器:若前两步无结果,向用户配置的本地 DNS 服务器(如运营商提供的 DNS)请求解析。
- 根域名服务器 :本地 DNS 服务器若自身无缓存,会向根域名服务器(全球共 13 组)查询,根服务器返回顶级域名服务器(如
.com
服务器)的地址。 - 顶级域名服务器 :本地 DNS 向
.com
服务器查询,得到example.com
域名服务器的地址。 - 权威域名服务器 :本地 DNS 向
example.com
的权威服务器查询,最终得到www.example.com
对应的 IP 地址(如104.21.88.96
)。
解析结果会被缓存(浏览器、本地 DNS 等),减少后续重复解析。
4. 建立 TCP 连接(三次握手)
得到服务器 IP 地址后,浏览器需要与服务器建立TCP 连接(HTTP/HTTPS 基于 TCP 协议传输数据),通过 "三次握手" 确保连接可靠:
- 第一次握手:浏览器(客户端)向服务器发送 "连接请求" 报文(SYN=1, seq=x)。
- 第二次握手:服务器收到请求后,返回 "同意连接" 报文(SYN=1,ACK=1, seq=y, ack=x+1)。
- 第三次握手:浏览器收到后,再向服务器发送 "确认连接" 报文(ACK=1, ack=y+1)。
三次握手完成后,TCP 连接建立,双方可开始传输数据。
5. (HTTPS 专属)TLS 握手:建立加密连接
若使用https
协议,在 TCP 连接建立后,还需进行TLS/SSL 握手,确保数据传输加密:
- 浏览器向服务器请求 SSL 证书(包含服务器公钥)。
- 浏览器验证证书有效性(如是否由可信机构颁发)。
- 浏览器生成随机对称密钥,用服务器公钥加密后发送给服务器。
- 服务器用私钥解密得到对称密钥,双方后续用该密钥加密通信(对称加密效率更高)。
6. 浏览器发送 HTTP 请求
连接建立后,浏览器向服务器发送HTTP 请求报文,包含以下部分:
-
请求行 :如
GET /path HTTP/1.1
(请求方法、资源路径、HTTP 版本)。- 常见请求方法:
GET
(获取资源)、POST
(提交数据)、PUT
(修改资源)、DELETE
(删除资源)等。
- 常见请求方法:
-
请求头 :键值对形式,包含浏览器信息、请求参数等,如:
plaintext
Host: www.example.com # 目标服务器域名 User-Agent: Chrome/100.0.0.0 # 浏览器类型 Accept: text/html,application/json # 浏览器可接受的响应格式 Cookie: uid=123 # 客户端存储的Cookie信息
-
请求体 :仅
POST
等方法需要,存放提交的数据(如表单内容、JSON 数据)。
7. 服务器处理请求并返回响应
服务器(如 Nginx、Apache、Node.js 服务器)接收 HTTP 请求后,按以下流程处理:
- 解析请求行、请求头、请求体,确定客户端需要的资源(如
/path
对应的 HTML 文件)。 - 执行业务逻辑(如查询数据库、处理数据)。
- 生成HTTP 响应报文 ,返回给浏览器,响应包含:
-
状态行 :如
HTTP/1.1 200 OK
(HTTP 版本、状态码、状态描述)。- 常见状态码:
200
(成功)、301
(永久重定向)、404
(资源不存在)、500
(服务器错误)。
- 常见状态码:
-
响应头 :如:
plaintext
Content-Type: text/html; charset=utf-8 # 响应内容类型(HTML、JSON等) Content-Length: 1024 # 响应体长度 Set-Cookie: sid=456 # 服务器向客户端设置Cookie Cache-Control: max-age=3600 # 缓存控制(资源有效期1小时)
-
响应体:实际的资源内容(如 HTML 代码、CSS、JS、图片二进制数据等)。
-
8. 浏览器接收响应并渲染页面
浏览器接收到响应后,主要做两件事:
- 处理响应头:如存储 Cookie、解析缓存策略(决定是否缓存资源)。
- 渲染响应体 (若响应是 HTML 页面):
- 解析 HTML:生成 DOM 树(文档对象模型,描述页面结构)。
- 解析 CSS:生成 CSSOM 树(CSS 对象模型,描述样式规则)。
- 构建渲染树:结合 DOM 树和 CSSOM 树,只包含需要显示的节点和样式。
- 布局(Layout):计算渲染树中每个节点的位置和大小。
- 绘制(Paint):根据布局结果,将节点绘制到屏幕(像素级渲染)。
- 合成(Composite):将页面分层绘制(如文字层、图片层),最终合并为完整页面。
期间若 HTML 中包含script
标签(JavaScript 代码),浏览器会暂停 HTML 解析,先执行 JS(因为 JS 可能修改 DOM/CSS),执行完成后再继续渲染。
9. 关闭 TCP 连接(四次挥手)
页面渲染完成后,若不再需要通信,TCP 连接通过 "四次挥手" 关闭:
- 第一次挥手:浏览器发送 "断开连接" 报文(FIN=1, seq=u)。
- 第二次挥手:服务器返回 "确认断开" 报文(ACK=1, ack=u+1),此时服务器仍可发送剩余数据。
- 第三次挥手:服务器数据发送完毕,发送 "断开连接" 报文(FIN=1, seq=v)。
- 第四次挥手:浏览器返回 "确认断开" 报文(ACK=1, ack=v+1),连接彻底关闭。