浏览器输入url到页面展示出来的全过程

文章详细阐述了从用户在浏览器输入URL开始,经过DNS解析、TCP连接建立、HTTP交互直到页面渲染的全过程。讨论了TCP的三次握手和四次挥手,以及浏览器如何构建DOMTree和RenderTree,同时强调了回流和重绘的概念以及如何优化代码以减少它们的影响。此外,还提到了性能优化策略,包括HTML加载速度提升、CSS编写注意事项和JS脚本的处理方法。

基本流程:

1、用户在浏览器中输入url地址

2、浏览器解析域名得到服务器ip地址

浏览器会首先从缓存中找是否存在域名,如果存在就直接取出对应的ip地址,如果没有就开启一个DNS域名解析器。DNS域名解析器会首先访问顶级域名服务器,将对应的ip发给客户端;然后访问根域名解析器,将对应的ip发给客户端;最后访问本地域名服务器,得到最终的ip地址。

3、TCP三次握手建立客户端和服务器的连接

因为HTTP是基于TCP的可靠传输,所以在发送http数据报之前,需要先进行TCP的三次握手建立连接。三次握手过程如下:

第一次握手:客户端--->服务端 ack=1,seq=x(x随机生成)

第二次握手:服务端--->客户端 ACK=1,ack=x+1,seq=y(y随机生成)

第三次握手:客户端--->服务端 ACK=1,ack=y+1,seq=x+1

完成第三次握手时,实际上客户端已经与服务器建立了连接,所以第三次握手的报文已经可以携带数据了。

4、客户端发送HTTP请求获取服务器端的静态资源

5、服务器发送HTTP响应报文给客户端,客户端获取到页面静态资源

6、TCP四次挥手关闭客户端和服务器的连接

数据传输完毕后,TCP会进行四次挥手断开连接,释放资源。四次挥手过程如下:

第一次挥手:客户端--->服务器 FIN=1,ack=1,seq=u 客户端状态变为FIN_WAIT_1

第二次挥手:服务器--->客户端 ACK=1,ack=u+1,seq=v 服务器状态变为CLOSE_WAIT,TCP进入半关闭状态

第三次挥手:服务器--->客户端 FIN=1,ACK=1,ack=u+1,seq=w 服务器状态变为LAST_ACK

第四次挥手:客户端--->服务器 ACK=1,ack=w+1,seq=u+1 客户端状态变为TIME_WAIT,此时TCP未释放,需要等待计时器计时完成后,客户端状态变为CLOSED

7、浏览器解析文档资源并渲染页面

浏览器解析文档资源并渲染页面流程:

(1)解析html资源,构建DOM Tree

(2)解析css资源,构建CSS Rule Tree

(3)JS通过DOM API和CSS OM API来操作DOM Tree和CSS Tree

(4)解析完成后综合DOM Tree和CSS Tree会生成Render Tree,计算每个元素的位置,这个过程就是回流(layout or reflow)

(5)调用操作系统Native GUI的绘制

(6)页面绘制完成

涉及到的其他知识点:

1、Render Tree的生成

DOM Tree和CSS Tree结合会生成Render Tree,是由可视化元素按照其顺序生成的树形结构,非可视化元素是不会出现到渲染树中的。

非可视化元素:head、display:none;(注意:visibility:hidden的元素会出现在渲染树中)

2、回流和重绘

回流(reflow,也叫重排、布局):某部分的变化影响了布局,浏览器需要重新渲染。(如元素大小、位置的改变)

重绘(repaint):元素的某一部分发生改变,尺寸、位置没有改变。(字体颜色、背景颜色的改变)

引起回流的几个主要原因:

(1)网页初始化

(2)JS操作DOM树(增加、删除元素等)

(3)某些元素的尺寸改变

(4)CSS属性的改变

浏览器的“dirty”系统:

为了避免页面细小的改变就引起回流和重绘,“dirty”系统会将这些改变操作积攒一批再进行操作,这又叫异步reflow或者增量异步reflow。有些特殊情况不会这么做:resize窗口、改变了页面默认的字体等,这些操作会直接触发回流。

编写代码时如何减少回流和重绘:

(1)修改样式不要逐条修改,定义CSS样式的class,直接修改元素的className

(2)不要将DOM节点的属性值放在循环中当成循环的变量

(3)为动画的HTML元素使用fixed或absolute的position属性,修改它们的CSS就不会触发reflow

(4)把DOM离线后修改,设置display:none或者clone元素到内存中,修改完成再显示回页面

(5)不要使用table布局,一个微小的改变就可能引起整个table的重新布局

3、性能优化

(1)提升HTML的加载速度

- 页面精简,删除不必要的内容,将内嵌的JS和CSS移至外部文件,使用压缩工具等

- 减少文件数量,合并文件,减少请求次数

- 减少域名查询,外部引入的资源尽量少使用不同的域名

- 使用缓存,重用数据

- 优化页面元素的加载顺序

- 使用合法的标签

- 根据浏览器类型选择合适的策略

(2)编写合理的CSS

- DOM的深度尽量浅

- 使用合法的CSS属性

- 不要为ID选择器指定类名或标签名

- 避免使用后代选择器,尽量使用子选择器

- 避免使用通配符

(3)关于JS标签

js标签的加载和执行特点:载入后立即执行,执行时会阻塞页面后续内容

- 将所有的js标签放在页面底部,保证脚本执行前已完成DOM渲染

- 尽可能合并脚本

- 减少内联js的使用

- 注意多个js标签的引入顺序

- 使用defer属性,该属性可以使脚本在文档完全呈现以后再执行

- 使用async属性,可以使当前脚本不必等待其他脚本的执行,也不必阻塞文档的呈现

在用户输入 URL页面加载完成的整个过程中,涉及多个层次的技术细节,包括网络通信、浏览器解析与渲染、资源加载等多个阶段。以下是整个流程的详细解析: ### 1. 用户输入 URL 用户在浏览器地址栏输入一个 URL(例如 `https://www.example.com`),浏览器会首先解析该 URL,提取出协议(如 HTTPS)、主机名(如 `www.example.com`)、路径(如 `/index.html`)等信息。 ### 2. DNS 解析 浏览器需要将域名解析为对应的 IP 地址。此过程通常包括以下步骤: - **本地 DNS 缓存查询**:浏览器首先检查自身的 DNS 缓存,看是否已经缓存了该域名的 IP 地址。 - **操作系统 DNS 缓存查询**:如果浏览器缓存中没有,则查询操作系统级别的 DNS 缓存。 - **向 DNS 服务器发起请求**:如果缓存中没有,则操作系统会向配置的 DNS 服务器发起查询请求,获取目标服务器的 IP 地址[^1]。 ### 3. 建立 TCP 连接 在获得服务器 IP 地址后,浏览器会通过 TCP 协议与服务器建立连接。通常使用 **三次握手** 机制完成连接建立: 1. 客户端发送 SYN 报文。 2. 服务器回应 SYN-ACK。 3. 客户端发送 ACK 确认。 若使用 HTTPS 协议,还需在此基础上进行 TLS 握手,协商加密密钥[^1]。 ### 4. 发送 HTTP 请求 建立连接后,浏览器发送 HTTP 请求报文。请求报文通常包含请求方法(如 GET)、请求路径、HTTP 协议版本、请求头(Headers)等信息。例如: ```http GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 Accept: text/html,application/xhtml+xml Accept-Encoding: gzip, deflate Connection: keep-alive ``` ### 5. 服务器处理请求并返回响应 服务器接收到请求后,根据请求内容生成响应。响应报文包括状态码(如 200 表示成功)、响应头(Headers)和响应体(Body)。例如: ```http HTTP/1.1 200 OK Content-Type: text/html Content-Length: 1234 Date: Mon, 01 Jan 2024 00:00:00 GMT <!DOCTYPE html> <html> <head>...</head> <body>...</body> </html> ``` ### 6. 浏览器解析与渲染 浏览器接收到响应后,开始解析 HTML 文档,并逐步构建 DOM 树和 CSSOM 树,最终生成渲染树。在此过程中: - **HTML 解析器** 会解析 HTML 标签,并构建 DOM 树。 - **CSS 解析器** 会解析样式表,构建 CSSOM 树。 - **JavaScript 执行** 可能会修改 DOM 和 CSSOM,影响渲染流程。 - **渲染引擎** 会根据渲染树计算布局(Layout),绘制页面内容(Paint),并最终将页面呈现在用户面前[^2]。 ### 7. 加载其他资源 HTML 文档中通常包含对其他资源的引用,如图片、CSS、JavaScript 文件等。浏览器会根据这些引用再次发起 HTTP 请求,加载这些资源,并重复解析、渲染流程,直到所有资源加载完成。 ### 8. 断开 TCP 连接 当所有数据交换完成后,浏览器服务器之间的 TCP 连接可以通过 **四次挥手** 断开连接: 1. 客户端发送 FIN 报文。 2. 服务器回应 ACK。 3. 服务器发送 FIN 报文。 4. 客户端回应 ACK。 若使用 HTTP/1.1 的 `keep-alive` 机制,连接可能保持一段时间以复用[^2]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值