从输入URL到页面呈现发生了什么?
发布日期:2021-11-21 16:35:24
浏览次数:10
分类:技术文章
本文共 1604 字,大约阅读时间需要 5 分钟。
浏览器端的网络请求过程:
首先,浏览器会构建请求,请求行包括请求方法、路径和HTTP协议版本。 然后查找强缓存,如果命中直接使用,否则进入下一步DNS解析过程。 由于我们输入的是域名,而数据包是通过IP地址传给对方的,因此我们需要得到域名对应的IP地址,这个过程需要依赖一个服务系统,这个系统将域名和 IP 一一映射,这个系统就叫做DNS(域名系统),得到具体 IP 的过程就是DNS解析,浏览器提供了DNS数据缓存功能,即如果一个域名已经解析过,那会把解析的结果缓存下来,下次处理直接走缓存,不需要经过 DNS解析,另外,如果不指定端口的话,默认采用对应的 IP 的 80 端口。 接着建立TCP连接,Chrome 在同一个域名下要求同时最多只能有 6 个 TCP 连接,超过 6 个的话剩下的请求就得等待。假设现在不需要等待,进入了 TCP 连接的建立阶段。TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。建立 TCP连接经历了下面三个阶段: (1)通过三次握手建立客户端和服务器之间的连接,总共发送3个数据包确认已经建立连接。 (2)然后进行数据传输。接收方在接收到数据包后必须要向发送方确认, 如果发送方没有接到这个确认的消息,就判定为数据包丢失,并重新发送该数据包。在发送的过程中还有一个优化策略,就是把大的数据包拆成一个个小包,依次传输到接收方,接收方按照这个小包的顺序把它们组装成完整数据包。 (3)数据传输完成后,通过四次挥手来断开连接。 TCP连接建立完成后,浏览器可以和服务器开始通信,开始发送 HTTP 请求。浏览器发 HTTP 请求包括:请求行、请求头和请求体。请求行由请求方法、请求URI和HTTP版本协议组成。Cache-Control、If-Modified-Since、If-None-Match都由可能被放入请求头中作为缓存的标识信息。请求体只有在POST方法下存在,常见的场景是表单提交。HTTP 请求到达服务器,服务器进行对应的处理。最后要把数据传给浏览器,也就是返回网络响应。网络响应具有三个部分:响应行、响应头和响应体。响应行由HTTP协议版本、状态码和状态描述组成。响应头包含了服务器及其返回数据的一些信息, 服务器生成数据的时间、返回的数据类型以及对即将写入的Cookie信息。响应完成之后,判断Connection字段, 如果请求头或响应头中包含Connection: Keep-Alive,表示建立了持久连接,这样TCP连接会一直保持,之后请求统一站点的资源会复用这个连接。否则断开TCP连接, 请求-响应流程结束。解析算法部分:
完成了网络请求和响应,如果响应头中Content-Type的值是text/html,浏览器就会进行解析和渲染。解析部分,主要分为构建 DOM树、样式计算以及生成布局树(Layout Tree)。 由于浏览器无法直接理解HTML字符串,因此将这一系列的字节流转换为DOM树的结构。DOM树本质上是一个以document为根节点的多叉树。 CSS样式,一般来源于link标签引用、style标签中的样式以及元素的内嵌style属性。浏览器是无法直接识别 CSS 样式文本的,因此渲染引擎接收到 CSS 文本之后会先将其转化为一个结构化的对象,即styleSheets。样式被格式化和标准化后,通过继承和层叠两个计算规则来计算每个节点的具体样式信息。 DOM树和DOM样式生成之后,通过浏览器的布局系统确定元素的位置,生成一棵布局树。这棵布局树值仅包含可见元素,对于 head标签和设置了display: none的元素,将不会被放入其中。渲染过程主要包括建立图层树(Layer Tree)、生成绘制列表、生成图块并栅格化、显示器显示内容。
转载地址:https://blog.csdn.net/yyychocolate/article/details/107846946 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2024年04月10日 07时10分20秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
经典面试题:如何保证缓存与数据库的双写一致性?
2019-04-29
一份来自亚马逊工程师的Google面试指南,GitHub收获9.8万星,已翻译成中文
2019-04-29
硬货 | Redis 性能问题分析
2019-04-29
Kafka为什么这么快?
2019-04-29
灵魂四连问:API 接口应该如何设计?如何保证安全?如何签名?如何防重?
2019-04-29
一个依赖搞定 Spring Boot 反爬虫,防止接口盗刷!
2019-04-29
酸爽!IDEA 中这么玩 MyBatis,让编码速度飞起!
2019-04-29
已拿 Offer!字节跳动面试经验分享
2019-04-29
Windows路由表透析
2019-04-29
Java LockSupport 实战
2019-04-29
线程面试题实战与分析——各种锁的灵活运用
2019-04-29
Java 生产者和消费者面试题
2019-04-29
生产者消费者问题
2019-04-29
哲学家就餐问题
2019-04-29
本机电脑连接虚拟机redis失败解决方法
2019-04-29
JAVA学习:将字符串转成数字
2019-04-29
webrtc 中的 Android 端 jni
2019-04-29
webrtc Android 端 video 软解码创建
2019-04-29
如何构建私有的智能视觉系统
2019-04-29
OpenNCC智能视觉系统-基于Paddle的OCR模型迁移训练(一)
2019-04-29