您的当前位置:首页>全部文章>文章详情

【网络】聊聊从输入URL到页面展示这中间发生了什么

CrazyPanda发表于:2024-06-19 10:59:02浏览:236次TAG:

原文地址https://zhuanlan.zhihu.com/p/600306778

1、解析URL:首先会对 URL 进行解析,分析所需要使用的传输协议和请求的资源的路径。如果输入的 URL 中的协议或者主机名不合法,将会把地址栏中输入的内容传递给搜索引擎。如果没有问题,浏览器会检查 URL 中是否出现了非法字符,如果存在非法字符,则对非法字符进行转义后再进行下一过程。

2、缓存判断:浏览器会判断所请求的资源是否在缓存里,如果请求的资源在缓存里并且没有失效,那么就直接使用,否则向服务器发起新的请求。

3、DNS解析: 首先需要获取的是输入的 URL 中的域名对应的 IP 地址,会先判断本地是否有该域名的 IP 地址的缓存,如果有则使用,如果没有则向本地 DNS 服务器发起请求。本地 DNS 服务器也会先检查是否存在缓存,如果没有就会先向根域名服务器发起请求,获得负责的顶级域名服务器的地址后,再向顶级域名服务器请求,然后获得负责的权威域名服务器的地址后,再向权威域名服务器发起请求,最终获得域名的 IP 地址后,本地 DNS 服务器再将这个 IP 地址返回给请求的用户。用户向本地 DNS 服务器发起请求属于递归请求,本地 DNS 服务器向各级域名服务器发起请求属于迭代请求。(具体可以参考昨天文章)

图1 来自《计算机网络(第7版)-谢希仁》

4、获取MAC地址: 当浏览器得到 IP 地址后,数据传输还需要知道目的主机 MAC 地址,因为应用层下发数据给传输层,TCP 协议会指定源端口号和目的端口号,然后下发给网络层。网络层会将本机地址作为源地址,获取的 IP 地址作为目的地址。然后将下发给数据链路层,数据链路层的发送需要加入通信双方的 MAC 地址,本机的 MAC 地址作为源 MAC 地址,目的 MAC 地址需要分情况处理。通过将 IP 地址与本机的子网掩码相与,可以判断是否与请求主机在同一个子网里,如果在同一个子网里,可以使用 APR 协议获取到目的主机的 MAC 地址,如果不在一个子网里,那么请求应该转发给网关,由它代为转发,此时同样可以通过 ARP 协议来获取网关的 MAC 地址,值得注意的是,此时目的主机的 MAC 地址应该为网关的地址。

5、TCP三次握手: 首先客户端向服务器发送一个 SYN 连接请求报文段和一个随机序号seq,服务端接收到请求后向客户端发送SYN,ACK报文段,确认连接请求,并且也向客户端发送一个同步报文段(SYN和随机序号seq)。客户端接收服务器的确认应答后,进入连接建立的状态,同时向服务器也发送一个ACK 确认报文段,服务器端接收到确认后,也进入连接建立状态,此时双方的连接就建立起来了。(这里有个有意思的点,其实TCP连接只是一次握手,广为流行的三次握手意思是在一次握手的过程中交换了三个报文,而非进行了三次握手,如同握一次手,热情地摇晃了三次,怪不得三次握手英译过来的handshake不是复数[哈哈]。计算机网络第7版5.9.1节对此有解释)

图2 来自《计算机网络(第7版)-谢希仁》

6、HTTPS握手: 如果使用的是 HTTPS 协议,在通信前还存在 TLS 的一个四次握手的过程。首先由客户端向服务器端发送使用的协议的版本号、一个随机数和可以使用的加密方法。服务器端收到后,确认加密的方法,也向客户端发送一个随机数和自己的数字证书。客户端收到后,首先检查数字证书是否有效,如果有效,则再生成一个随机数,并使用证书中的公钥对随机数加密,然后发送给服务器端,并且还会提供一个前面所有内容的 hash 值供服务器端检验。服务器端接收后,使用自己的私钥对数据解密,同时向客户端发送一个前面所有内容的 hash 值供客户端检验。这个时候双方都有了三个随机数,按照之前所约定的加密方法,使用这三个随机数生成一把秘钥,以后双方通信前,就使用这个秘钥对数据进行加密后再传输。 (对称加密+非对称加密一起上菜)

7、返回数据: 当页面请求发送到服务器端后,服务器端会返回一个 html 文件作为响应,浏览器接收到响应后,开始对 html 文件进行解析,开始页面的渲染过程。

8、页面渲染: 浏览器首先会根据 html 文件构建 DOM 树,根据解析到的 css 文件构建 CSSOM 树,如果遇到 script 标签,则判端是否含有 defer 或者 async 属性,要不然 script 的加载和执行会造成页面的渲染的阻塞。当 DOM 树和 CSSOM 树建立好后,根据它们来构建渲染树。渲染树构建好后,会根据渲染树来进行布局。布局完成后,最后使用浏览器的 UI 接口对页面进行绘制。这个时候整个页面就显示出来了。

9、TCP四次挥手: 最后一步是 TCP 断开连接的四次挥手过程。若客户端认为数据发送完成,则它需要向服务端发送连接释放请求。服务端收到连接释放请求后,会告诉应用层要释放 TCP 链接。然后会发送 ACK 包,并进入 CLOSE_WAIT 状态,此时表明客户端到服务端的连接已经释放,不再接收客户端发的数据了。但是因为 TCP 连接是双向的,所以服务端仍旧可以发送数据给客户端。服务端如果此时还有没发完的数据会继续发送,完毕后会向客户端发送连接释放请求,然后服务端便进入 LAST-ACK 状态。客户端收到释放请求后,向服务端发送确认应答,此时客户端进入 TIME-WAIT 状态。该状态会持续 2MSL(最大报文段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有服务端的重发请求的话,就进入 CLOSED 状态。当服务端收到确认应答后,也便进入 CLOSED 状态。

图3 来自《计算机网络(第7版)-谢希仁》

大抵上述内容已经回答差不多了。


下面从浏览器视角上(进程)看,更加页面化出来上面的一些内容,看完再去阅读以上的总结,会发现自己能补充进去的东西也可以挺多!

我们就一起来探索下这个流程,下图是“从输入URL到页面展示完整流程示意图”:

图4 来自极客时间

从图中可以看出,整个过程需要各个进程之间的配合,所以在开始正式流程之前,我们还是先来快速回顾下浏览器进程、渲染进程和网络进程的主要职责。

  • 浏览器进程主要负责用户交互、子进程管理和文件储存等功能。

  • 网络进程是面向渲染进程和浏览器进程等提供网络下载功能。

  • 渲染进程的主要职责是把从网络下载的HTML、JavaScript、CSS、图片等资源解析为可以显示和交互的页面。因为渲染进程所有的内容都是通过网络获取的,会存在一些恶意代码利用浏览器漏洞对系统进行攻击,所以运行在渲染进程里面的代码是不被信任的。这也是为什么Chrome会让渲染进程运行在安全沙箱里,就是为了保证系统的安全。

回顾了浏览器的进程架构后,我们再结合上图来看下这个完整的流程,可以看出,整个流程包含了许多步骤,这个过程可以大致描述为如下:

  • 首先,用户从浏览器进程里输入请求信息;

  • 然后,网络进程发起URL请求;

  • 服务器响应URL请求之后,浏览器进程就又要开始准备渲染进程了;

  • 渲染进程准备好之后,需要先向渲染进程提交页面数据,我们称之为提交文档阶段

  • 渲染进程接收完文档信息之后,便开始解析页面和加载子资源,完成页面的渲染。

这其中,用户发出URL请求到页面开始解析的这个过程,就叫做导航。下面我们来详细分析下这些步骤,同时也就解答了标题。

1.用户输入

当用户在地址栏中输入一个查询关键字时,地址栏会判断输入的关键字是搜索内容,还是请求的URL。

  • 如果是搜索内容,地址栏会使用浏览器默认的搜索引擎,来合成新的带搜索关键字的URL。

  • 如果判断输入内容符合URL规则,比如输入的是github.com,那么地址栏会根据规则,把这段内容加上协议,合成为完整的URL,如 https://github.com

当用户输入关键字并键入回车之后,浏览器便进入下图的状态:

图5 用户输入状态

从上图可以看出,当浏览器开始加载一个地址之后,标签页上的图标便进入了加载状态。但此时图中页面显示的依然是之前打开的页面内容,并没立即替换为github的页面。因为需要等待提交文档阶段,页面内容才会被替换。

2.URL请求过程

接下来,便进入页面资源请求过程,此时浏览器会通过进程间通信(IPC)把URL请求发送至网络进程,由网络进程去发起真正的URL请求流程,那么,下面涉及的一些步骤(HTTP请求,老朋友了):准备IP地址和端口(DNS解析),建立TCP连接(提前先看是否需要进入等待TCP队列),HTTP请求,服务器响应(发给客户端的网络进程)。具体地,可以看下Day04文章

2.1 重定向

在接收到服务器返回的响应头(这里将响应行+响应头一起称呼为响应头,后面同)后,网络进程开始解析响应头,如果发现返回的状态码是301或者302,那么说明服务器需要浏览器重定向到其他URL。这时网络进程会从响应头的Location字段里面读取重定向的地址,然后再发起新的HTTP或者HTTPS请求,一切又重头开始了。

2.2 响应数据类型处理

在处理了跳转信息之后,我们继续导航流程的分析。我们知道,响应数据类型由Content-Type标识,这是HTTP头中一个非常重要的字段, 它告诉浏览器服务器返回的响应体数据是什么类型,然后浏览器会根据Content-Type的值来决定如何显示响应体的内容。

这里我们以极客时间为例,看看极客时间官网返回的Content-Type值是什么。在终端输入以下命令:

curl -I https://time.geekbang.org/
图6 来自极客时间

响应头中的Content-type字段的值是text/html,这就是告诉浏览器,服务器返回的数据是HTML格式。

接下来我们再来利用curl来请求极客时间安装包的地址,如下所示:

curl -I https://res001.geekbang.org/apps/geektime/android/2.3.1/official/geektime_2.3.1_20190527-2136_offical.apk
图7 来自极客时间

从返回的响应头信息来看,其Content-Type的值是application/octet-stream,显示数据是字节流类型的,通常情况下,浏览器会按照下载类型来处理该请求。

由此,我们学习两个不同的响应数据类型,可以较为清楚感受到,不同Content-Type的后续处理流程也截然不同。如果Content-Type字段的值被浏览器判断为下载类型,那么这个请求会被提交给浏览器的下载管理器,同时该URL请求的导航流程就此结束。但如果是HTML,那么浏览器则会继续进行导航流程。由于Chrome的页面渲染是运行在渲染进程中的,所以接下来就需要准备渲染进程了。

3.准备渲染进程

默认情况下,Chrome为每个标签页分配一个渲染进程,即每打开一个新页面,就会配套创建一个新的渲染进程,但是,如果不同标签页属于同个站点,则会运行在同一个渲染进程中(新页面可能复用父页面的渲染进程,这个默认策略官方叫process-per-site-instance)。

同个站点:根域名(例如,geekbang.org)加上协议(例如,https:// 或者http://),还包含了该根域名下的所有子域名和不同的端口,比如下面这三个:

https://time.geekbang.org
https://www.geekbang.org
https://www.geekbang.org:8080

它们都是属于同一站点,因为它们的协议都是HTTPS,而且根域名也都是geekbang.org

因此,打开一个新页面采用的渲染进程策略就是:

  • 通常情况下,打开新的页面都会使用单独的渲染进程;

  • 如果从A页面打开B页面,且A和B都属于同一站点的话,那么B页面复用A页面的渲染进程;如果是其他情况,浏览器进程则会为B创建一个新的渲染进程。

渲染进程准备好之后,还不能立即进入文档解析状态,因为此时的文档数据还在网络进程中,并没有提交给渲染进程,所以下一步就进入了提交文档阶段。

4.提交文档

提交文档,这个“文档”指的是网络进程请求后得到的响应体数据。

  • “提交文档”的消息是由浏览器进程发出的,渲染进程接收到“提交文档”的消息后,会和网络进程建立传输数据的“管道”。

  • 等文档数据传输完成之后,渲染进程会返回“确认提交”的消息给浏览器进程。

  • 浏览器进程在收到“确认提交”的消息后,会更新浏览器界面状态,包括了安全状态、地址栏的URL、前进后退的历史状态,并更新Web页面。

更新内容如下图所示:

图8 来自极客时间

到这里,一个完整的导航流程就“走”完了,这之后就要进入渲染阶段了。

5.渲染阶段

一旦文档被提交,渲染进程便开始页面解析和子资源加载了,关于这个阶段的过程,我们明天再来学习下。

这里可以先了解的就是一旦页面生成完成,渲染进程会发送一个消息给浏览器进程,浏览器收到消息后,会停止标签图标上的加载动画。

参考

极客时间《浏览器工作原理与实践》学习笔记 Day 05

计算机网络(第7版)-谢希仁

猜你喜欢

【服务器】nginx面试题
目录什么是Nginx为什么要用Nginx为什么Nginx性能这么高Nginx怎么处理请求什么是正向代理和反向代理Nginx的优缺点Nginx应用场景Nginx的目录结构有哪些Nginx静态资源如何用Nginx解决前端跨域问题Nginx虚拟主机基于虚拟主机配置域名基于端口的虚拟主机location的作用是什么location的语法location正则示例限流怎么做的限流有三种:三种限流算法正常限制访问频率(正常流量)突发限制访问频率(突发流量)限制并发连接数漏桶算法令牌桶算法动静分离为什么要做动静
发表于:2024-07-17 浏览:248 TAG: #nginx
【网络】开源协议有哪些,都有什么差异
在IT行业中,开源协议是用来定义如何使用、修改、分享和分发软件的法律条款。不同的开源协议在保留版权、允许的使用方式、对衍生作品的要求以及对分发的限制等方面有所不同。以下是一些常用的开源协议及其主要特点:1. MIT License (MIT)特点:非常宽松,基本上允许任何形式的使用、修改和再分发,只要保留版权声明。适用场景:适合那些希望自己的代码被广泛使用,且不想对使用者施加太多限制的项目。2. GNU General Public License (GPL)特点:要求任何发布/分发的衍生作品也
发表于:2024-08-01 浏览:264 TAG:
【测试】软件测试岗位常见的七中测试方法
软件测试是保证软件质量的一个非常重要的环节,而软件测试方法有很多种,测试人员要根据实际需求和目标选择合适的测试方法,才能提高软件测试的效率和准确性,确保软件质量和可靠性。下面将介绍软件测试常见的七种测试方法。黑盒测试黑盒测试又称功能测试,该测试方法验证被测对象使用质量及外部质量表现。采用黑盒测试方法,测试工程师将测试对象看作一个黑盒子,完全不考虑程序内部逻辑结构和内部特性,只依据需求规格说明书、设计文档及其他需求描述文档,检查被测对象是否与期望需求一致。白盒测试白盒测试,又称结构测试、逻辑驱动测
发表于:2024-06-22 浏览:263 TAG:
【网络】国内十大API数据服务平台
一、数据宝 https://www.chinadatapay.com/数据宝是国内领先的国有数据资产代运营服务商,数据丰富多元,覆盖人、企、车、路、能源、环境等数百个数据因子维度,专注于为国有数据资源方提供数据治理、产品研发、交易流通、应用变现等数据增值代运营服务,是国内少数同时具备了“国资参股、政府监管扶持、市场化运作、大数据资产交易合法经营资质”属性的大数据“国家队”。二、天眼数聚 https://www.tianyandata.cn/天眼数聚是一家专注于大数据服务的技术
发表于:2024-08-08 浏览:290 TAG: #api
TIOBE 发布 5 月编程指数排行榜,Fortran 语言首次进入前 10 名
TIOBE 编程社区指数是一个衡量编程语言受欢迎程度的指标,评判的依据来自世界范围内的工程师、课程、供应商及搜索引擎,日前 TIOBE 官网公布了 2024 年 5 月的编程语言排行榜:Python 排名第一:占比 16.33%,本月上升 2.88%C 排行第二:占比 9.98%,本月下跌 3.37%C++ 排行第三:占比 9.53%,本月下跌 2.43%Java 排行第四:占比 8.69%,本月下跌 3.53%C# 排行第五:占比 6.49%,本月下跌 0.94%本月排行榜中,Fortran
发表于:2024-06-22 浏览:274 TAG: #TIOBE
【测试】AB测试总结
文章目录一、AB测试1.1 什么是AB测试1.2 AB测试的优缺点二、假设检验2.1 假设检验原理2.2 假设检验步骤:2.3 样本量的确定2.4 样本质的控制三、ABtest案例一、AB测试1.1 什么是AB测试在互联网中AB测试通常指:为web或者app界面、流程设定两个或多个版本,在同一时间维度下,分别让类似的客户群体来访问,收集各群主的用户体验数据和业务数据,最后根据显著性检验分析评估出最优的版本。1.2 AB测试的优缺点AB测试的优点:通过实验对比,建立数据驱动,不断优化产品,还能降低
发表于:2024-06-22 浏览:237 TAG:
【系统】系统架构概述
什么是系统架构  系统架构 (System Architecture )是系统的一种整体的高层次的结构表示, 是系统的骨架和根基,也决定 了系统的健壮性和生命周期的长短。什么系统架构设计师  系统架构设计师在整个项目研制中的主导地位愈加重要。可以说,系统架构师就是项目的总设计师,他是一个既需要掌控整体又需要洞悉局部瓶颈,并依据具体的业务场景给出解决方案的总体设计人员;他要确认和评估系统需求,给出开发规范,搭建系统实现的核心构架,并澄清技术细节、扫清主要难点的技术人员;他要掌握技术团队的能力需要,
发表于:2024-06-20 浏览:254 TAG:
【Docker】docker --restart=unless-stopped 和 --restart=always 的区别
Docker 容器的 --restart 标志用于定义容器的重启策略。--restart=unless-stopped 和 --restart=always 这两个选项有一些细微但重要的区别:--restart=always:容器将始终尝试重启,无论它是如何停止的。如果容器崩溃,它会自动重启。如果Docker守护进程重启,容器也会自动启动。即使容器被手动停止(如使用 docker stop 命令),当Docker守护进程重启时,它也会重新启动。--restart=unless-stopped:容
发表于:2024-08-09 浏览:261 TAG: #docker
【支付宝】手机浏览器跳转打开支付宝APP
手机浏览器跳转打开支付宝APP alipays://platformapi/startapp?appId=20000067&url= url后面跟上要跳转的链接
发表于:2024-02-27 浏览:270 TAG: #支付宝
【网络】聊聊从输入URL到页面展示这中间发生了什么
原文地址https://zhuanlan.zhihu.com/p/6003067781、解析URL:首先会对 URL 进行解析,分析所需要使用的传输协议和请求的资源的路径。如果输入的 URL 中的协议或者主机名不合法,将会把地址栏中输入的内容传递给搜索引擎。如果没有问题,浏览器会检查 URL 中是否出现了非法字符,如果存在非法字符,则对非法字符进行转义后再进行下一过程。2、缓存判断:浏览器会判断所请求的资源是否在缓存里,如果请求的资源在缓存里并且没有失效,那么就直接使用,否则向服务器发起新的请求
发表于:2024-06-19 浏览:237 TAG: