【重排重绘】从输入url到浏览器展示页面发生了什么?

news2024/11/20 13:23:44

目录

      • 步骤如下:
            • 一、用户在浏览器搜索栏中输入`url`地址
            • 二、浏览器解析域名得到`服务器ip地址`
            • 浏览器解析域名得到服务器ip地址有哪些过程?
            • 三、TCP三次握手建立客户端和服务器的连接
            • 四、客户端发送HTTP请求获取服务器端的静态资源
            • 五、服务器发送HTTP响应报文给客户端,客户端获取到页面静态资源
            • 六、TCP四次挥手关闭客户端和服务器的连接
            • 七、浏览器解析文档资源并渲染页面
      • 其他细节知识补充:
            • 1、`Render Tree`的生成
            • 2、回流和重绘
            • 3、性能优化

步骤如下:

一、用户在浏览器搜索栏中输入url地址
二、浏览器解析域名得到服务器ip地址

在这里插入图片描述

浏览器解析域名得到服务器ip地址有哪些过程?

第一步:检查浏览器缓存中是否缓存过该域名对应的IP地址,如果没有找到继续下一步

第二步:如果在浏览器缓存中没有找到IP,那么将继续查找本机系统是否缓存过IP,如果没有找到继续下一步

第三步:向本地域名解析服务系统发起域名解析的请求

如果在本机上无法完成域名的解析,那么系统只能请求本地域名解析服务系统进行解析,本地域名系统一般都是本地区的域名服务器,比如你连接的校园网,那么域名解析系统就在你的校园机房里,如果你连接的是电信、移动或者联通的网络,那么本地域名解析服务器就在本地区,由各自的运营商来提供服务。

第四步:当本地的域名服务器收到请求后,就先查询本地的缓存,如果有该纪录项,则本地的域名服务器就直接把查询的结果返回。

第五步:如果本地的缓存中没有该纪录,则本地域名服务器就直接把请求发给根域名服务器,然后根域名服务器再返回给本地域名服务器一个所查询域(根的子域)的主域名服务器的地址。

第六步:本地服务器再向上一步返回的域名服务器发送请求,然后接受请求的服务器查询自己的缓存,如果没有该纪录,则返回相关的下级的域名服务器的地址。

第七步:重复第六步,直到找到正确的纪录。

第八步:本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时还将结果返回给客户机的客户端(浏览器)。

三、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

第一次
第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次
第二次握手:服务器收到syn包,必须确认客户端的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
第三次
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
在上述过程中,还有3个重要概念略微提及:

(1)未连接队列
(2)Backlog参数
(3)半连接存活时间

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

PS:TCP 为什么三次握手而不是两次握手,SYN/ACK/FIN是什么?
大小写的ack和ACK的区别:
在这里插入图片描述

四、客户端发送HTTP请求获取服务器端的静态资源
五、服务器发送HTTP响应报文给客户端,客户端获取到页面静态资源
六、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

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

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

(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 TreeCSS Tree结合会生成Render Tree,是由可视化元素按照其顺序生成的树形结构,非可视化元素是不会出现到渲染树中的。

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

2、回流和重绘

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

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

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

  1. 网页初始化
  2. JS操作DOM树(增加、删除元素等)
  3. 某些元素的尺寸改变
  4. CSS属性的改变

浏览器的“dirty”系统:

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

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

  • 修改样式不要逐条修改,定义CSS样式的class,直接修改元素的className
  • 不要将DOM节点的属性值放在循环中当成循环的变量
  • 为动画的HTML元素使用position属性的fixedabsolute,修改它们的CSS就不会触发reflow
  • 把DOM离线后修改,设置display:none或者clone元素到内存中,修改完成再显示回页面
  • 不使用table布局,一个微小的改变就可能引起整个table的重新布局
3、性能优化

(1)提升HTML的加载速度

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

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

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

  • 使用缓存,重用数据

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

  • 使用合法的标签

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

(2)编写合理的CSS

  • DOM的深度尽量浅

  • 使用合法的CSS属性

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

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

  • 避免使用通配符

(3)关于JS标签

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

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

  • 尽可能合并脚本

  • 减少内联js的使用

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/352345.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

程序员深度体验一周ChatGPT发现竟然....

程序员深度体验一周ChatGPT发现竟然… 周一打卡上班,老板凑到我跟前:“小李啊,这周有个新需求交给你做一下,给我们的API管理平台新增一个智能Mock的功能…”。我条件反射般的差点脱口而出:“这个需求做不了…”。不过…

【软件测试】资深测试总结的几个自动化测试点,提升跨越一大步......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 自动化的软件测试与…

PostgreSQL查询引擎——SELECT STATEMENTS SelectStmt

SelectStmt: select_no_parens %prec UMINUS| select_with_parens %prec UMINUS select_with_parens:( select_no_parens ) { $$ $2; }| ( select_with_parens ) { $$ $2; } 该规则返回单个SelectStmt节点或它们的树,表示集合操作树(set-operation tree…

JAVA线程池的使用

一、池化思想和JAVA线程池 池化是很重要的思想;池化的好处是提供缓冲和统一的管理。这个笔者在本人的数据库连接池的博客中已经提到过了(JAVA常用数据库连接池_王者之路001的博客-CSDN博客 )。 线程池是另一种池化思想的运用,把…

MySQL 派生表产生关联索引auto_key0导致SQL非常的慢

相同的SQL在maridb运行0.5秒,在MySQL8.0.26中运行要19秒 官方MySQL在处理子查时,优化器有个优化参数derived_merge,MySQL7开启添加,默认on.很多情况可以自动优化派生表,避免创建临时索引auto_key0和生成临时表数据做…

C++入门:函数重载

目录 一. 函数重载的概念和分类 1.1 什么是函数重载 1.2 函数重载的分类 1.3 关于函数重载的几点注意事项 二. C实现函数重载的底层逻辑(为什么C可以实现函数重载而C语言不能) 2.1 编译器编译程序的过程 2.2 为什么C可以实现函数重载而C语言不能 …

内网安装管家婆软件如何实现外网访问?内网穿透的几种方案教程

管家婆软件从网络架构上分两种版本:web(浏览器http端口)访问的版本和客户端(211固定端口sqlserver数据库)访问的版本。公司库管经常用仓库登录管家婆,一旦需要在公司外部登陆访问管家婆客户端,就…

微信中如何接入机器人才比较正常

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 前言 为什么会有这个话题?大家都知道最近有个AI机器人很火,那就是AI机器人,关于它的介绍,大家可以自行百度去,我这边就不多介绍了。 好多人嫌网页版玩的不过瘾,就把这个机器人接入到了QQ上,接入到了钉钉上,TG …

Go语言基础知识学习笔记

环境准备 下载安装Golang:https://golang.google.cn/dl/ 因为国外下载速度较慢,我们需要配置国内代理 # 开启包管理工具 go env -w GO111MODULEon # 设置代理 go env -w GOPROXYhttps://goproxy.cn,direct # 设置不走 proxy 的私有仓库,多…

Ajax?阿贾克斯?

一、Ajax简介 AJAX Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。 AJAX 不是新的编程语言,而是一种使用现有标准的创新方法。 AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网…

供应链挑战迎刃而解!桑迪亚国家实验室使出“量子杀手锏”

桑迪亚国家实验室的科学家Alicia Magann(右),Kenneth Rudinger(左上),Mohan Sarovar(左下)和Matthew Grace(未附图)开发了基于反馈的量子优化算法&#xff08…

“太极”如何利用混部资源,助力腾讯广告降本增效

编者按:近年来, 随着大模型在NLP领域横扫各种大数据磅单取得巨大成功之后,大数据加大模型成为了AI领域建模的标准范式。搜索、广告、推荐的建模也不例外,动辄千亿参数,上T大小的模型成为各大预估场景的标配&#xff0c…

人脸识别——景联文科技提供3D头模数据采集业务!

“拿起手机刷脸解锁、上下班考勤、支付订单,刷脸已极大地便利了我们的生活。清华大学新闻学院教授沈阳表示,中国人平均每天要暴露在各种摄像头下超过500次。人脸识别已成了我们生活中重要的一部分。由于2D人脸识别容易受到姿态、表情、光照等因素影响&am…

痛苦面具,140天备战阿里巴巴,一个疏忽让我前功尽弃...

面试是走的内推途径,因为内推的简历通过率远高于其他方式;我的内推的途径有:联系我在字节跳动工作的一个大学学长。 在线面试,有个线上文本编辑器,类似leetcode那种,可以在线编程。然而有点紧张,视频面试网…

C#开发的OpenRA游戏加载界面的实现

C#开发的OpenRA游戏加载界面的实现 游戏的UI是一个游戏必备, 但是游戏的UI都是自己处理的,不能使用像Windows自带的UI。 这样游戏的UI,其实也是使用游戏的方式来显示的, 只不过使用了低帧率的方式来显示。 比如OpenRA游戏界面,就会显示如下: 游戏的界面有很多,先从一个简…

2023美赛F题全部代码+数据+结果 数学建模

2023年美赛F题全部思路 数据代码都已完成 全部内容见链接:https://www.jdmm.cc/file/2708700/ 1.根据文献选的GGDP的指标,发现GGDP与水资源等有关,由此可以筛选出影响GGDP的所有因子,并可以用所有因子利用层次分析法建立评价体…

小白指南:手把手教你用低代码开发一个应用页面

一、什么是低代码开发 在了解低代码开发之前,我们先看看使用低代码开发的效果。 低代码开发效果示例 低代码开发是DevEco Studio为HarmonyOS开发者提供的可视化页面的开发方式,具备丰富的UI页面编辑能力,开发者可以在图形化的用户界面上自由拖…

项目质量要怎么保持? 如何借助系统软件进行管理

对于任何项目型的企业总是很关心项目成本的话题,但不知从什么时候开始,高质量等于高成本成了各个企业的一种潜意识。 如果交付的项目产品不符合质量标准,即使企业使用最好的项目管理工具或者每个里程碑都达到并在预算范围内完成项目&#xf…

基于springboot的餐饮管理系统

摘 要本设计以真实场景的菜品信息及相关餐桌预定为设计依据,结合了餐饮管理系统的需求及反映的问题,对系统做出合理的需求分析和界面设计。同时本系统使用了JAVA语言、Springboot框架以及MYSQL作为后台数据库进行开发。从系统描述、系统设计及系统实现等…

【Kubernetes】第二篇 - 购买阿里云 ECS 实例

一,前言 上一篇,简单介绍了 CI/CD 的概念以及 ECS 服务规划,搭建整套服务需要三台服务器,配置如下: ECS 配置启动服务说明2核4GJenkins Nexus Dockerci-server2核4GDocker Kubernetesk8s-master1核1GDocker Kube…