前端八股网络浏览器---输入 URL 到页面呈现

目录

一、完整流程图

二、详细步骤解析

[1. 处理 URL](#1. 处理 URL)

[2. DNS 域名解析(域名 → IP)](#2. DNS 域名解析(域名 → IP))

[3. 建立 TCP 连接(三次握手)](#3. 建立 TCP 连接(三次握手))

[4. HTTPS 建立 TLS 加密(HTTPS 才走这步)](#4. HTTPS 建立 TLS 加密(HTTPS 才走这步))

[5. 发送 HTTP 请求](#5. 发送 HTTP 请求)

[6. 服务器处理请求](#6. 服务器处理请求)

[7. 服务器返回 HTTP 响应](#7. 服务器返回 HTTP 响应)

[8. 关闭 TCP 连接(四次挥手)](#8. 关闭 TCP 连接(四次挥手))

[9. 浏览器解析 HTML,构建 DOM 树](#9. 浏览器解析 HTML,构建 DOM 树)

[10. 解析 CSS,生成 CSSOM 树](#10. 解析 CSS,生成 CSSOM 树)

[11. 生成渲染树 Render Tree](#11. 生成渲染树 Render Tree)

[12. 布局 Layout(回流/重排)](#12. 布局 Layout(回流/重排))

[13. 绘制 Paint(重绘)](#13. 绘制 Paint(重绘))

[14. 合成 Composite Layers](#14. 合成 Composite Layers)

[15. 加载其他资源](#15. 加载其他资源)

[16. 页面加载完成](#16. 页面加载完成)

三、三次握手(建立连接)

[3.1 作用](#3.1 作用)

[3.2 图解](#3.2 图解)

[3.3 通俗解释](#3.3 通俗解释)

[3.4 为什么是三次不是两次?](#3.4 为什么是三次不是两次?)

四、四次挥手(断开连接)

[4.1 作用](#4.1 作用)

[4.2 图解](#4.2 图解)

[3.3 通俗解释](#3.3 通俗解释)

[3.4 为什么是四次不是三次?](#3.4 为什么是四次不是三次?)

五、问答

[Q1: 输入url浏览器会发生什么](#Q1: 输入url浏览器会发生什么)

Q2:为什么握手是三次,挥手是四次?

[Q3:为什么客户端最后要等 2MSL?](#Q3:为什么客户端最后要等 2MSL?)

[Q4:TCP 和 UDP 的区别?](#Q4:TCP 和 UDP 的区别?)

[Q5:说说 TCP 的三次握手和四次挥手?](#Q5:说说 TCP 的三次握手和四次挥手?)


一、完整流程图

复制代码
┌─────────────────────────────────────────────────────────────────────┐
│                         输入 URL 到页面呈现                           │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  1. 处理 URL ──→ 2. DNS 解析 ──→ 3. TCP 三次握手 ──→ 4. TLS 握手    │
│                                                                     │
│  5. 发送请求 ──→ 6. 服务器处理 ──→ 7. 返回响应 ──→ 8. 四次挥手       │
│                                                                     │
│  9. 解析 HTML → DOM 树                                              │
│  10. 解析 CSS → CSSOM 树                                            │
│  11. 合并 → 渲染树                                                   │
│  12. 布局(回流)                                                    │
│  13. 绘制(重绘)                                                    │
│  14. 合成                                                           │
│  15. 加载资源 + 执行 JS                                              │
│  16. 页面加载完成                                                     │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

二、详细步骤解析

1. 处理 URL

浏览器判断是搜索关键字还是 URL,补全协议(默认 HTTP/HTTPS)

复制代码
最终格式:协议 + 域名 + 端口 + 路径 + 参数
https://www.example.com:443/path?id=123

2. DNS 域名解析(域名 → IP)

浏览器要找到服务器在哪,必须把域名转成 IP。

查找顺序(从上到下):

  1. 浏览器 DNS 缓存

  2. 操作系统 hosts 文件 / 系统缓存

  3. 路由器缓存

  4. ISP 运营商 DNS 服务器

  5. 根域名服务器 → 顶级域名服务器 → 权威 DNS

3. 建立 TCP 连接(三次握手)

浏览器与服务器建立可靠传输通道。

复制代码
客户端 ──SYN──→ 服务器
客户端 ←─SYN+ACK─ 服务器
客户端 ──ACK──→ 服务器

4. HTTPS 建立 TLS 加密(HTTPS 才走这步)

  • 交换加密套件

  • 服务器出示证书

  • 客户端验证证书合法性

  • 生成会话密钥

5. 发送 HTTP 请求

复制代码
请求行:GET /path HTTP/1.1
请求头:User-Agent、Cookie、Host、Connection
请求体:POST 才有(表单、JSON)

6. 服务器处理请求

  • 反向代理(Nginx)接收请求

  • 负载均衡分发

  • 后台应用处理

  • 查询数据库

  • 生成响应内容

7. 服务器返回 HTTP 响应

复制代码
状态行:HTTP/1.1 200 OK
响应头:Content-Type、Cache-Control、Set-Cookie
响应体:HTML、CSS、JS、图片

8. 关闭 TCP 连接(四次挥手)

复制代码
客户端 ──FIN──→ 服务器
客户端 ←─ACK─── 服务器
客户端 ←─FIN─── 服务器
客户端 ──ACK──→ 服务器

9. 浏览器解析 HTML,构建 DOM 树

  • 从上到下解析标签

  • 遇到 <link CSS>:异步加载,不阻塞 HTML 解析

  • 遇到 <script JS>:默认阻塞解析,等 JS 下载执行完再继续(加 defer/async 可改变行为)

10. 解析 CSS,生成 CSSOM 树

  • 把所有样式(外链、内联、默认样式)合并

  • CSSOM 会阻塞渲染,但不阻塞 HTML 解析

11. 生成渲染树 Render Tree

  • DOM + CSSOM 结合

  • 只保留可见节点(display:none 不进渲染树)

12. 布局 Layout(回流/重排)

  • 计算每个元素的几何信息(位置、宽高、边距)

  • 布局改变会触发回流

13. 绘制 Paint(重绘)

  • 根据布局信息绘制像素(颜色、背景、阴影、文字)

  • 只变样式不变结构 → 重绘

14. 合成 Composite Layers

  • 将页面分成多个图层分别绘制

  • 合并图层,最终输出到屏幕

  • transform/opacity 只触发合成,性能最高

15. 加载其他资源

  • 图片、字体、视频在解析 HTML 时就开始加载

  • 不阻塞绘制,绘制完加载回来再补上

16. 页面加载完成

  • DOMContentLoaded:DOM 解析完成

  • load:所有资源加载完成


三、三次握手(建立连接)

3.1 作用

保证客户端和服务器双方发送、接收能力都正常,再开始传输数据。

3.2 图解

text

复制代码
客户端(Client)                    服务器(Server)
      │                                  │
      │  1. SYN(我要连接你)              │
      │ ─────────────────────────────→   │
      │                                  │
      │  2. SYN + ACK(可以,你能收到我吗?)│
      │ ←─────────────────────────────   │
      │                                  │
      │  3. ACK(收到了,连接建立)         │
      │ ─────────────────────────────→   │
      │                                  │
      │        开始传输数据                │

3.3 通俗解释

步骤 通俗说法 技术术语
第1次 客户端:在吗? SYN
第2次 服务器:在的,你能听到我吗? SYN + ACK
第3次 客户端:能听到,开始说话吧 ACK

3.4 为什么是三次不是两次?

复制代码
两次握手的问题:
客户端发送 SYN → 服务器回复 SYN+ACK
如果这个回复丢失了,客户端以为没连上,服务器以为连上了
→ 服务器白白等待,浪费资源

三次握手:
客户端最后再回复一次 ACK,双方都确认对方没问题
→ 可靠建立连接

四、四次挥手(断开连接)

4.1 作用

保证双方数据都发完、处理完,安全关闭连接,不丢数据。

4.2 图解

复制代码
客户端(Client)                    服务器(Server)
      │                                  │
      │  1. FIN(我数据发完了,准备关闭)    │
      │ ─────────────────────────────→   │
      │                                  │
      │  2. ACK(收到,等我处理完)        │
      │ ←─────────────────────────────   │
      │                                  │
      │        服务器继续发送剩余数据       │
      │                                  │
      │  3. FIN(我也发完了,可以关了)     │
      │ ←─────────────────────────────   │
      │                                  │
      │  4. ACK(收到,关闭连接)          │
      │ ─────────────────────────────→   │
      │                                  │
      │           连接关闭                 │

3.3 通俗解释

步骤 通俗说法 技术术语
第1次 客户端:我说完了,想挂电话了 FIN
第2次 服务器:知道了,等我把我这边说完 ACK
第3次 服务器:我也说完了,挂吧 FIN
第4次 客户端:好的,挂断 ACK

3.4 为什么是四次不是三次?

复制代码
为什么不能三次?
客户端发 FIN(我要关了)
服务器回 ACK(知道了)
服务器回 FIN(我也关了)
客户端回 ACK(好的)

问题:第2次和第3次不能合并吗?
不能!因为服务器收到 FIN 后,可能还有数据没发完
所以先回 ACK(收到请求),等数据发完再回 FIN(可以关了)

如果合并:服务器还没发完数据就关了 → 数据丢失

五、问答

Q1: 输入url浏览器会发生什么

  1. 输入 URL,浏览器解析 URL

  2. DNS 域名解析,将域名转为服务器 IP

  3. 进行 TCP 三次握手建立连接

  4. HTTPS 网站进行 TLS 握手加密

  5. 浏览器发送 HTTP 请求

  6. 服务器处理请求并返回 HTTP 响应

  7. TCP 四次挥手断开连接

  8. 浏览器解析 HTML 生成 DOM 树,解析 CSS 生成 CSSOM 树

  9. 结合生成渲染树,进行布局(回流)、绘制(重绘)、图层合成

  10. 加载资源、执行 JS,页面最终展示

Q2:为什么握手是三次,挥手是四次?

答:

  • 握手三次:因为双方需要确认彼此的发送和接收能力正常。客户端发 SYN,服务器回 SYN+ACK,客户端再回 ACK,三次就够了。

  • 挥手四次:因为断开时,双方可能还有数据没发完。客户端发 FIN 表示自己没数据了,服务器先回 ACK 表示收到,等自己的数据发完后再发 FIN,客户端最后回 ACK。所以比握手多一次。

Q3:为什么客户端最后要等 2MSL?

答:

2MSL(Maximum Segment Lifetime)是为了保证最后一个 ACK 能到达服务器。如果 ACK 丢失,服务器会重发 FIN,客户端在 2MSL 内还能响应。

Q4:TCP 和 UDP 的区别?

答:

对比 TCP UDP
连接 面向连接(三次握手) 无连接
可靠性 可靠(确认重传) 不可靠
速度
场景 HTTP、文件传输 视频通话、直播

Q5**:说说 TCP 的三次握手和四次挥手?**

答:

三次握手(建立连接)

  1. 客户端发 SYN,表示请求连接

  2. 服务器回 SYN+ACK,表示同意连接

  3. 客户端回 ACK,连接建立

四次挥手(断开连接)

  1. 客户端发 FIN,表示没数据要发了

  2. 服务器回 ACK,表示收到

  3. 服务器发 FIN,表示也没数据了

  4. 客户端回 ACK,连接关闭

为什么握手三次、挥手四次?

  • 握手时双方没有数据要发,三次就够了

  • 挥手时服务器可能还有数据没发完,所以 ACK 和 FIN 要分开发,需要四次

相关推荐
里晓山2 小时前
SOME/IP协议(上)
网络·网络协议·tcp/ip·车载系统
Hello--_--World2 小时前
Vue:虚拟Dom
前端·javascript·vue.js
vivo互联网技术2 小时前
下一代图片格式 AVIF 在 vivo 社区的落地实践
前端·性能优化·图片压缩·avif
咸鱼翻身更入味2 小时前
Vue创建一个简单的Agent聊天
前端
wangl_922 小时前
Modbus TCP/IP 地址完全解析手册
网络·tcp/ip·php·modbus·kepware·kepserverex
布局呆星2 小时前
Vue Router 核心知识点梳理
前端·javascript·vue.js
得物技术2 小时前
基于 Harness + SDD + 多仓管理模式的 AI 全栈开发实践|得物技术
前端·人工智能·后端
许泽宇的技术分享3 小时前
别再把 AI Agent 当“会聊天的脚本”:Hermes Agent 源码级拆解(架构、框架、实战、趋势,一文吃透)
java·linux·网络