首页 > 其他分享 >浏览器工作的宏观流程

浏览器工作的宏观流程

时间:2022-12-05 11:12:11浏览次数:65  
标签:浏览器 渲染 流程 宏观 TCP 进程 http 页面

浏览器架构发展

  1. 单进程
    早期的浏览器是单进程的,任务的处理都在一个进程上,进程上有可能有网络线程,页面线程等用以进行网络操作和页面渲染,但中间若是有任务出错就容易导致浏览器的奔溃。

  2. 多进程(早期)
    由于单进程可能导致的不稳定和不安全,然后就出现了多进程的架构,如早期的Chrome的架构,页面有单独的渲染进程,这样即使一个页面奔溃了也不会影响到别的页面,浏览器主进程等。而进程间可以通过IPC(进程间通信)进行信息的传递。
    image
    image

  3. 多进程(当前)
    现在Chrom的架构虽是多进程的,但和早期的架构比也有改进,将浏览器主进程的网络抽出了网络进程,还有对GPU支持的进程。
    image
    image
    我们在Chrome中‘设置’->'任务管理'也能看到:
    image

补充:进程(process)与线程(threads)的区别?
感觉看英文的话就一下就区分了,而单看中文就有点像。

  • 一个进程就是一个程序运行的实列。进程启动,系统会为期分配内存供其使用。
  • 而线程是依托与进程的,由进程启动和管理。
    image

数据是如何传输到浏览器的?

  1. 首先思考下,数据是如何在计算间传输的呢?
    都知道数据是通过网络在计算机中传输的,那具体些是怎么传输的呢?比如说,服务器和浏览是如何传输数据的呢?
    这时又该回想起《计算机网络原理》的内容了,回顾下TCP/IP四层模型
    image

  2. 两个主机间要传送数据,那就得有相互的地址(比如说:ip),那它发送的数据,把目标IP,自己IP地址等加上组成了IP报文。通过IP协议,它们就能通过网络层进行连接了。但此时数据只知道在那些地址传,但还不知道去哪个应用。

  3. 应用要连接网络那它机占用端口,所以此时相同的道理,把应用端口号,目标应用端口等加上,通过UDP协议,主机间的应用就能通信了。但是UDP"管杀不管埋",数据发出去它就不过管了。数据不可靠,但速度快。为了数据可靠,所以就有了TCP。

  4. TCP为了保证数据的可靠的传输,在传输开始通过“三次握手”建立传输,收到数据,还会对数据确认,发送确认数据包给发送端,发送端没收到就回触发重发机制等。然后传输完成后,还会“四次挥手”断开连接。
    image

浏览器如何发起HTTP请求

在浏览器地址栏中输入一个http网址,它是如何请求的呢?

  1. 在发送请求前,浏览器会先构建请求行。
  2. 基于上面TCP的内容,建立TCP连接,过程是“获取IP&端口” -> "等待TCP队列" -> "建立TCP连接"。(Chrome 有个机制,同一个域名同时最多只能建立 6 个 TCP 连接,所以同域名下超过6个要等待)
    image
  3. 建立HTTP连接,发送请求,主要包括请求行,请求头,请求体。我们可以随便抓个http的包看下:
    image
    image
  4. 服务器处理请求并响应请求,可以看下响应举例如下:image
    这里可能会遇到重定向的情况,就是状态码是300系列的,比如输入是http://xxx.xxx浏览器打开的却是https://xxx.xxx,输入http:baidu.com打开的却是http://www.baidu.com等都是因为重定向了。重定向的响应中会有Location字段,浏览器就会取该字段信息去访问它了。
  5. 当再次打开同一个链接的时候,它可能会使用缓存来帮助更快的页面加载,其过程如下:
    image

有几个字段可以注意下:

字段 作用
Connection:Keep-Alive 浏览器或者服务器在其头信息有该字段,则 TCP 连接在发送后将仍然保持打开状态
Location: https://www.baidu.com 状态码是要重定向的,浏览器获取 Location 字段中的地址,并使用该地址重新导航
Cache-Control:Max-age=2000 设置http缓存能使用的时长
Expires: Tue, 28 Feb 2022 22:22:22 GMT 设置http缓存过期的时间点
Content-Type: text/html 服务端返回指定文件的类型,如html文件若是text/html,它则会被解析渲染成页面,若是application/octet-stream,则就作文件下载了

浏览器的请求流程

在之前浏览器架构中我们可以知道,浏览主要有:

  • 浏览主进程(负责用户交互,界面显示,子进程管理等)。
  • 网络进程(主要负责网络资源的加载)
  • 渲染进程 (主要是将 HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页)
  • GUP进程
  • 插件进程

用户在浏览地址栏输入地址后,这些进程是如何配合的呢?注:导航,用户发出URL到浏览器解析的过程。
image
具体分析下:

  1. 用户在地址栏输入非URL就会更据设置的默认搜索引擎拼凑得到搜索的URL,是URL就直接按URL处理,就是通过IPC将其发送给网络进程,页面开始加载。
  2. 网络进程中,会先做如下处理,然后等服务器返回信息:
    image
    网络进程收到服务器的响应,会进行判断
    • 若是服务返回的是一个重定向的响应,则浏览器进程根据location重新导航。
    • 判断返回的Content-Type,若是text/html则会将数据传递给创建的渲染进程进行渲染。
  3. 渲染进程拿到的数据都是文本,会通过一步步转换变为浏览器能识别使用的数据。
    image
  4. 在之前的布局过程中,已经获得了一个布局树,也知道每个元素的位置信息了。然后就要进行分层的操作了,比如dom节点中有z-index设置的,有裁剪的如overflow: scroll隐藏了部分的都会分层。分层好层了,才开始图层的绘制。
    分层
  5. 分层的好了,就开始栅格化,也就是将这些数据交给渲染进程中的合成线程开始真正的渲染了。栅格化的时候它不会把整个页面都一次给它处理掉,而是会把页面按视口的大小分成图块(tile),然后视口中,和视口附近的图块就会优先处理,合成线程发送绘制图块命令DrawQuad给浏览器进程。浏览器进程根据 DrawQuad 消息生成页面,并显示到显示器上。image

当页面中的元素发生改变的时候,还会涉及到重排和重绘。如果发生了重排就会重新走一次完整的流程,如果是重绘的话,就不会有布局和分层的流程了,效率就会更高。

此文章主要作为浏览器工作原理与实践的相关笔记

  1. 浏览器工作原理与实践: https://time.geekbang.org/column/intro/216
  2. The Chromium Projects - Multi-process Architecture:https://www.chromium.org/developers/design-documents/multi-process-architecture/
  3. Inside look at modern web browser (part 1):https://developer.chrome.com/blog/inside-browser-part1/#browser-architecture

标签:浏览器,渲染,流程,宏观,TCP,进程,http,页面
From: https://www.cnblogs.com/flytree/p/16943198.html

相关文章

  • IDEA本地项目启动成功,浏览器无法访问对应路径
    某次同时启动多个模块的时候,编译通过,但浏览器访问本地的模块路径时,发现第四个启动的模块端口访问不到,  解决方案是修改项目内存大小,或者少开几个模块   由原来......
  • 测试的具体工作流程是什么?
    软件测试是一个整体性的工作。从项目到手,到测试结果出来和调试,都需要多个层面的技术逐步递进。我们先来看下完整的软件测试流程:项目需求分析>制定测试计划>设计......
  • 苹果app开发流程详解​
    ​苹果AppStore上传应用流程详解,在向AppStore提交应用之前,开发者首先要成为苹果iOS开发者项目的成员,每年向苹果缴纳99美元或199美元的费用(具体申请方法后期更新)。​免688......
  • Http、Https简介和Session、token的请求流程
    Http    Http(超文本输出协议)是一种分布式、协作式和超媒体信息系统的应用层协议,它通常运行在TCP之上,因特网应用最广泛的便是Http协议,所有www都遵循这个标准。主......
  • 零基础学python 第三章 流程操作语句
    实例1判断输入的是不是黄蓉所说的数print("今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问几何?\n")number=int(input("请输入您认为符合条件的的数:"))ifn......
  • Android Studio 生成 keystore 签名文件及打包验证流程
    前言Android应用必须进行数字签名才可以发布,也就是我们平时所说的使用证书打包然后上传市场,其中数字证书的私钥由应用开发者持有。生成签名的方式有很多种,今天我们来讲......
  • (一)大白话MySQL执行SQL的流程
    ​​(一)大白话MySQL执行SQL的流程​​​​(二)大白话InnoDB存储引擎的架构设计​​​​(三)大白话MySQLBinlog是什么?​​​​(四)MySQL的BufferPool内存结构​​​​(五)MySQL的Buf......
  • 基于jenkins+kubernetes的cicd流程实践三:清除镜像定时任务
    6.定时清除历史镜像:万里长征的最后一步收尾工作,换一种更“原生”的玩法,找一找新感觉,手搓走起.....参考:https://github.com/kubernetes-sigs/cri-tools/blob/master/docs/......
  • 基于jenkins+kubernetes的cicd流程实践一:环境搭建及方案原理
    1.基础环境:Centos7.9,kubernetes:v1.21.5node-1@112(master):docker,containerd,harbornginx(80),git,etcdnode-2@109(master/worker):docker,containerd,ingress_nginx(80),etcd,glusterfs......
  • 基于jenkins+kubernetes的cicd流程实践二:微服务迁移脚本
    5.web层服务迁移:​ (1)项目启动脚本:start.sh#!/bin/bashsrv_name="goods_web_main"chmod+x./${srv_name}ifpgrep-x${srv_name};thenecho"${srv_name}isr......