04从输入URL到页面展示经历了什么?

85 阅读12分钟

在URL输入到展示经历了什么?这是一道比较经典的面试题。

浏览器进程 用户输入->处理输入信息(如果是非URL会由内置的搜索引擎带上字符串,查询关键字)->如果是URL交给网络进程【0:切换到了网络进程】->【2:等待网络进程通知开启一个渲染进程】浏览器主进程等到RPC通知渲染进程准备环境提交文档

网络进程 【1:网络进程接收到RPC信号】浏览器构造的请求行->网络进程查看这个是否存在缓存->查找【ip 浏览器有DNS缓存 arp 也有缓存 端口 】->tcp等待 -> tcp链接->http传输->如果服务器header返回 301、302直接通知浏览器主进程重定向根据location进行重定向/如果是200带着content-type:text/html 通知浏览器主进程开始准备渲染进程->【2:】->【3:此时网络进程和渲染进程建立管道】

渲染进程 接收到提交文档【2:】->建立管道接收数据->【3:慢慢接收数据】接收完成 【确认提交这时候导航变了】->渲染页面和加载资源->提交给浏览器主进程完成了。

截屏2023-05-08 下午7.41.10.png

各个进程的职责

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

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

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

几个流程上的节点解释

1、首先,用戶从浏览器进程里输入请求信息输入请求信息 2、然后,网络进程发起URL请求发起URL 3、服务器响应URL请求之后,浏览器进程就又要开始准备渲染进程准备渲染进程了; 4、渲染进程准备好之后,需要先向渲染进程提交⻚面数据,我们称之为提交文档提交文档阶段; 5、渲染进程接收完文档信息之后,便开始解析⻚面和加载子资源解析⻚面和加载子资源,完成⻚面的渲染 6、从URL输入到确认文档 叫做导航

步骤上的处理 1、用户输入 如果是搜索内容,地址栏会使用浏览器默认的搜索引擎,来合成新的带搜索关键字的URL 2、如果判断输入内容符合URL规则那么地址栏会根据规则,把这段内容加上协议,合成为完整的URL 3、当浏览器刚开始加载一个地址之后,标签⻚上的图标便进入了加载状态。⻚面显示的依然是之前打开的⻚面内容,并没立即替的⻚面。因为需要等待提交文档阶段,⻚面内容才会被替换。 4、URL请求过程接下来,便进入了⻚面资源请求过程。这时,浏览器进程会通过进程间通信(IPC)把URL请求发送至网络进程,网络进程接收到URL请求后,会在这里发起真正的URL请求流程

首先,网络进程会查找本地缓存是否缓存了该资源。如果有缓存资源,那么直接返回资源给浏览器进程;如果在缓存中没有查找到资源,那么直接进入网络请求流程。这请求前的第一步是要进行DNS解析,以获取请求域名的服务器IP地址。如果请求协议是HTTPS,那么还需要建立TLS连接。
接下来就是利用IP地址和服务器建立TCP连接。连接建立之后,浏览器端会构建请求行、请求头等信息,并把和该域名相关的Cookie等数据附加到请求头中,然后向服务器发送构建的请求信息。
服务器接收到请求信息后,会根据请求信息生成响应数据(包括响应行、响应头和响应体等信息),并发给网络进程。等网络进程接收了响应行和响应头之后,就开始解析响应头的内容了。

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

响应数据类型处理如果是200并且带着Content-Type是HTTP头中一个非常重要的字段,它告诉浏览器服务器返回的响应体数据是什么类型体数据是什么类型 content-type 可以有很多种 比如 text/html html文档 application/octect-stream 资源文件 前者会通知主进程准备渲染进程 后者直接就开启了下载。 这里一定要确保content-type 的准确性 如果明明是text/html 而改成了 application/octect-stream 那么文件就变成了下载!!

Content-Type的后续处理流程也截然不同 下载类型,那么该请求会被提交给浏览器的下载管理器,同时该URL请求的导航流程就此结束型,那么该请求会被提交给浏览器的下载管理器,同时该URL请求的导航流程就此结束。但如果是HTML,HTML那么浏览器则会继续进行导航流程那么浏览器则会继续进行导航流程

准备渲染进程 Chrome会为每个⻚面分配一个渲染进程,也就是说,每打开一个新⻚面就会配套创建一个新的渲染进程。但是,也有一些例外,在某些情况下,浏览器会让多个⻚面直接运行在同一个渲染进程中。同一个站点的就会放到同一个渲染进程里面来,什么是同一站点?

同一站点:根域名+协议相同就是同一个站点 比如 a.baidu.com b.baidu.com:8080 根域名和协议是相同的可以认为是同一个站点, 如果在A站点打开一个标签还是A站点的就是在同一个渲染进程里面渲染。

Chrome的默认策略是,每个标签对应一个渲染进程。但如果从一个⻚面打开了另一个新⻚面,而新⻚面和如果从一个⻚面打开了另一个新⻚面,而新⻚面和当前⻚面属于同一站点的话,那么新⻚面会复用父⻚面的渲染进程当前⻚面属于同一站点的话,那么新⻚面会复用父⻚面的渲染进程。官方把这个默认策略叫process-per-site-instance。

如果不是一个站点的直接在开一个渲染进程。

提交文档 首先明白文档就是数据响应体 提交文档是浏览器发出来的 渲染进程接收到提交文档建立管道 开始接收数据接收完了确认提交 导航改变

等文档数据传输完成之后,渲染进程会返回“确认提交确认提交”的消息给浏览器进程。 浏览器进程在收到“确认提交”的消息后,会更新浏览器界面状态更新浏览器界面状态,包括了安全状态、地址栏的URL、前进后退的历史状态,并更新Web⻚面。

这也就解释了为什么在浏览器的地址栏里面输入了一个地址后,之前的⻚面没有立⻢消失,而是要加载一会 儿才会更新⻚面。到这里,一个完整的导航流程就“走”完了,这之后就要进入渲染阶段了。

一旦文档被提交,渲染进程便开始⻚面解析和子资源加载了,关于这个阶段的完整过程,我会在下一篇文章 中来专⻔介绍。这里你只需要先了解一旦⻚面生成完成,渲染进程会发送一个消息给浏览器进程,浏览器接 收到消息后,会停止标签图标上的加载动画。

总结 1.用戶输入URL,浏览器会根据用戶输入的信息判断是搜索还是网址,如果是搜索内容,就将搜索内容+ 默认搜索引擎合成新的URL;如果用戶输入的内容符合URL规则,浏览器就会根据URL协议,在这段内容 上加上协议合成合法的URL 2.用戶输入完内容,按下回⻋键,浏览器导航栏显示loading状态,但是⻚面还是呈现前一个⻚面,这是 因为新⻚面的响应数据还没有获得 3.浏览器进程浏览器构建请求行信息,会通过进程间通信(IPC)将URL请求发送给网络进程 GET/index.htmlHTTP1.1 4.网络进程获取到URL,先去本地缓存中查找是否有缓存文件,如果有,拦截请求,直接200返回;否则 ,进入网络请求过程 5.网络进程请求DNS返回域名对应的IP和端口号,如果之前DNS数据缓存服务缓存过当前域名信息,就会 直接返回缓存信息;否则,发起请求获取根据域名解析出来的IP和端口号,如果没有端口号,http默认80 ,https默认443。如果是https请求,还需要建立TLS连接。 6.Chrome有个机制,同一个域名同时最多只能建立6个TCP连接,如果在同一个域名下同时有10个请 求发生,那么其中4个请求会进入排队等待状态,直至进行中的请求完成。如果当前请求数量少于6个, 会直接建立TCP连接。 7.TCP三次握手建立连接,http请求加上TCP头部⸺包括源端口号、目的程序端口号和用于校验数据完 整性的序号,向下传输 8.网络层在数据包上加上IP头部⸺包括源IP地址和目的IP地址,继续向下传输到底层 9.底层通过物理网络传输给目的服务器主机 10.目的服务器主机网络层接收到数据包,解析出IP头部,识别出数据部分,将解开的数据包向上传输到 传输层 11.目的服务器主机传输层获取到数据包,解析出TCP头部,识别端口,将解开的数据包向上传输到应用 层 12.应用层HTTP解析请求头和请求体,如果需要重定向,HTTP直接返回HTTP响应数据的状态code301或 者302,同时在请求头的Location字段中附上重定向地址,浏览器会根据code和Location进行重定向操作 ;如果不是重定向,首先服务器会根据请求头中的If-None-Match的值来判断请求的资源是否被更新,如 果没有更新,就返回304状态码,相当于告诉浏览器之前的缓存还可以使用,就不返回新数据了;否则, 返回新数据,200的状态码,并且如果想要浏览器缓存数据的话,就在相应头中加入字段: Cache-Control:Max-age=2000 响应数据又顺着应用层⸺传输层⸺网络层⸺网络层⸺传输层⸺应用层的顺序返回到网络进程 13.数据传输完成,TCP四次挥手断开连接。如果,浏览器或者服务器在HTTP头部加上如下信息,TCP就 一直保持连接。保持TCP连接可以省下下次需要建立连接的时间,提示资源加载速度 Connection:Keep-Alive 14.网络进程将获取到的数据包进行解析,根据响应头中的Content-type来判断响应数据的类型,如果是 字节流类型,就将该请求交给下载管理器,该导航流程结束,不再进行;如果是text/html类型,就通知 浏览器进程获取到文档准备渲染 15.浏览器进程获取到通知,根据当前⻚面B是否是从⻚面A打开的并且和⻚面A是否是同一个站点(根域 名和协议一样就被认为是同一个站点),如果满足上述条件,就复用之前网⻚的进程,否则,新创建一个 单独的渲染进程 16.浏览器会发出“提交文档”的消息给渲染进程,渲染进程收到消息后,会和网络进程建立传输数据的 “管道”,文档数据传输完成后,渲染进程会返回“确认提交”的消息给浏览器进程 17.浏览器收到“确认提交”的消息后,会更新浏览器的⻚面状态,包括了安全状态、地址栏的URL、前 进后退的历史状态,并更新web⻚面,此时的web⻚面是空白⻚ 18.渲染进程对文档进行⻚面解析和子资源加载,HTML通过HTM解析器转成DOMTree(二叉树类似结 构的东西),CSS按照CSS规则和CSS解释器转成CSSOMTREE,两个tree结合,形成rendertree(不包 含HTML的具体元素和元素要画的具体位置),通过Layout可以计算出每个元素具体的宽高颜色位置,结 合起来,开始绘制,最后显示在屏幕中新⻚面显示出来.