zoukankan      html  css  js  c++  java
  • 浏览器-浏览器运行原理

    浏览器概述

    1. 浏览器是指可以显示网页服务器或者文件系统的HTML文件(标准通用标记语言的一个应用)内容,并让用户与这些文件交互的一种软件。
    2. 浏览器的主要功能就是向服务器发出请求,在浏览器窗口中展示您选择的网络资源。
    3. 这里所说的资源一般是指 HTML 文档,也可以是 PDF、图片或其他的类型。资源的位置由用户使用URI(统一资源标符)指定。
    4. 多年以来,各浏览器都没有完全遵从这些规范,同时还在开发自己独有的扩展程序,这给网络开发人员带来了严重的兼容性问题。如今,大多数的浏览器都是或多或少地遵从规范。
    5. 目前使用的主流浏览器有五个:Internet Explorer、Firefox、Safari、Chrome 和 Opera。

    浏览器分类

    浏览器按照引擎分类:
    Trident引擎:Internet Explorer

    Webkit引擎:Chrome(28版本后基于blink,blink是webkit的一个分支)和Safari

    Gecko引擎:Firefox

    Presto引擎:早期Opera采用,后用webkit引擎

    浏览器的主要组件

    1. 用户界面 - 包括地址栏、前进/后退按钮、书签菜单等。除了浏览器主窗口显示的请求的页面外,其他显示的各个部分都属于用户界面。
    2. 浏览器引擎 - 在用户界面和呈现引擎之间传送指令。
    3. 渲染引擎 - 负责显示请求的内容。如果请求的内容是 HTML,它就负责解析 HTML 和 CSS 内容,并将解析后的内容显示在屏幕上。
    4. 网络 - 用于网络调用,如 HTTP 请求。其接口与平台无关,为所有平台提供底层实现。
    5. 用户界面后端 - 用于绘制基本的窗口小部件,比如组合框和窗口。其公开了与平台无关的通用接口,而在底层使用操作系统的用户界面方法。
    6. JavaScript解释器- 用于解析和执行 JavaScript 代码。
    7. 数据存储 - 这是持久层。浏览器需要在硬盘上保存各种数据,例如 Cookie。新的 HTML 规范 (HTML5) 定义了“网络数据库”,这是一个完整的浏览器内数据库。

    浏览器内核工作原理简介

    渲染引擎

    1. 渲染引擎在浏览器窗口中显示所请求的内容,浏览器内核分成两部分:渲染引擎和js引擎,由于js引擎越来越独立,内核就倾向于只指渲染引擎,所以渲染引擎也称为浏览器内核
    2. 渲染引擎一开始会从网络层获取请求文档的内容,通常以8K分块的方式完成。 获取了文档内容之后,渲染引擎开始正式工作,其基本流程如图所示
    3. 渲染引擎解析HTML文档,并将文档中的标签转化为DOM节点树,即”内容树”。同时,它也会解析外部CSS文件以及style标签中的样式数据。这些样式信息连同HTML中的”可见内容”一道,被用于构建另一棵树——”渲染树(Render树)”。渲染树构建完毕之后,将会进入”布局”处理阶段,即为每一个节点分配一个屏幕坐标。再下一步就是绘制(painting),即遍历render树,并使用UI后端层绘制每个节点。
    4. 注意:这个过程是逐步完成的,为了更好的用户体验,渲染引擎将会尽可能早的将内容呈现到屏幕上,并不会等到所有的html都解析完成之后再去构建和布局渲染树。它是解析完一部分内容就显示一部分内容,同时,可能还在通过网络下载其余内容。
    5. DOM:文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口。在网页上,组织页面(或文档)的对象被组织在一个树形结构中,用来表示文档中对象的标准模型就称为DOM。

    渲染引擎解析

    解析一个文档即将其转换为具有一定意义的结构——编码可以理解和使用的东西。解析的结果通常是表达文档结构的节点树,称为解析树或语法树。

    1. 与上下文无关的语法
      所有可以解析的格式都对应确定的语法(由词汇和语法规则构成),这称为与上下文无关的语法。这里先说要说明的是:CSS、JavaScript是与上下文无关的语法,而HTML不是与上下文无关的语法。
    2. 解析器
      解析的过程可以分成两个子过程:词法分析和语法分析。

    词法分析是将输入内容分割成大量标记的过程。标记是语言中的词汇,即构成内容的单位。

    语法分析是应用语言的语法规则的过程。

    解析是一个迭代的过程。通常,解析器会向词法分析器请求一个新标记,并尝试将其与某条语法规则进行匹配。如果发现了匹配规则,解析器会将一个对应于该标记的节点添加到解析树中,然后继续请求下一个标记。如果没有规则可以匹配,解析器就会将标记存储到内部,并继续请求标记,直至找到可与所有内部存储的标记匹配的规则。如果找不到任何匹配规则,解析器就会引发一个异常。这意味着文档无效,包含语法错误。

    HTML解析

    HTML 解析器的任务是将 HTML 标记解析成解析树。HTML 的词汇和语法在 W3C 组织创建的规范中进行了定义,html不能简单的用解析所需的上下文无关文法来定义。

    浏览器为html定制了专属的解析器。Html5规范中描述了这个解析算法,算法包括两个阶段——符号化和构建树,Html解析流程如图所示。

    符号化是词法分析的过程,将输入解析为符号,html的符号包括开始标签、结束标签、属性名及属性值。符号识别器识别出符号后,将其传递给树构建器,并读取下一个字符,以识别下一个符号,这样直到处理完所有输入。

    CSS解析

    css属于上下文无关文法,可以用前面所描述的解析器来解析。Css规范定义了css的词法及语法文法。每个符号都由正则表达式定义了词法(词汇表),语法用BNF(由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集)进行描述。

    Webkit使用Flex和Bison解析生成器从CSS语法文件中自动生成解析器。

    JS引擎

    JS引擎是一个专门处理JS脚本的虚拟机,专门设计来解释和执行的 JavaScript 代码。JS引擎会加载你的源代码,把它分解成字符串,把这些字符串转换成编译器可以理解的字节码,然后执行这些字节码。

    不同浏览器有不同的JS引擎:
    Browser, Headless Browser, or Runtime JavaScript Engine
    Mozilla Spidermonkey
    Chrome V8
    Safari JavaScriptCore
    IE and Edge Chakra
    HTML Unit Rhino
    Node.js V8

    浏览器兼容性原理

    浏览器兼容性问题:是指因为不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况。

    在版面设计中,产生浏览器兼容性问题的主要原因是不同浏览器内核和不同浏览器版本对网页代码解析不一致,例如浏览器对HTML、CSS属性的支持不一致;对脚本语言的支持不一致;网页设计人员编写规范存在问题,不符合W3C标准;以及用户使用的设备分辨率不一致,容易产生网页错位,元素显示不全,图片显示不一致等问题。

    CSShack:为了获得统一的页面效果,就需要针对不同的浏览器或不同版本写特定的CSS样式,把针对不同的浏览器/不同版本写相应的CSS code的过程,叫做CSS hack。

    由于Hack大部分针对IE不同版本兼容,而且只针对css(样式)兼容,不适于WFT本次兼容性,故本次没有采用CSS Hack写法。

    前端处理流程简介

    这个流程大家可以参考网上很多人总结的各个版本的从输入一个url到看到页面,发生了什么过程。在这里我用自己的话简单概括为以下几点(仅供参考,欢迎指正):

    1、输入url

    2、查看浏览器缓存,看是否有缓存,如果有缓存,继续查看缓存是否过期,如果没有过期,直接返回缓存页面,如果没有缓存或者缓存过期,发送一个请求。

    3、浏览器解析url地址,获取协议、主机名、端口号和路径。

    4、获取主机ip地址过程

    (1)浏览器缓存

    (2)主机缓存

    (3)hosts文件

    (4)路由器缓存

    (5)DNS缓存

    (6)DNS递归查询

    5、浏览器发起和服务器的TCP连接,执行三次握手(略)

    6、三次握手连接后,浏览器发送一个http请求(这部分是重点,请查询相关资料,详细了解http协议关于请求格式和重要的几个请求头字段含义)。

    7、服务器收到请求,转到相关的服务程序,期间可能需要连接并操作数据库(主要分get和post请求)。

    8、服务器看是否需要缓存,服务器处理完请求,发出一个响应(这部分也是重点,请查询资料了解http响应头各个字段的含义)

    9、服务器并根据请求头包含信息决定是否需要关闭TCP连接(如需关闭,则需要四次挥手过程)

    10、浏览器对接收到的响应进行解码

    11、浏览器解析收到的响应并根据响应的内容(假如是HTML文件)进行构建DOM树,构建render树,渲染render树等过程

    12、处理嵌入的其他资源如css文件、js文件、图片文件、音视频等文件,处理过程类似上面的步骤在此不详述。

    进程与线程

    • 进程是一个工厂,每个工厂有其独立的资源。

    - 线程是工厂中的工人,可能只有一个,可能有好多个。多个工人协同完成工作。工人共享工作资源。

    • 工厂的资源 -> 系统分配的内存。

    - 工厂之间相互独立 -> 进程之间相互独立,也即进程分配到的内存相互独立,无法读到对方内存中的数据。

    - 一个工厂有一个或多个工人 -> 一个线程中有一个或多个线程。

    - 多个工人协同完成工作 -> 进程中多个线程协同完成工作。即线程之间能互相发送请求与接收结果。

    - 工人共享工作资源 -> 进程中所有线程都能访问到相同一块内存,即信息是互通的。

    不过在这里要强调一点:一个软件不等于一个进程,一个软件可能包含有多个互相独立的进程。
     最后,再用官方的术语描述下进程与线程的差别

    • 进程是系统资源分配的最小单位(即系统以进程为最小单位分配内存空间,同时进程是能独立运行的最小单位)

    • 线程是系统调度的最小单位(即系统以线程为单位分配cpu中的核。)
       tips:

    • 进程之间也能互相通信,不过代价比较大。

  • 相关阅读:
    编写PHP规则
    phpmyadmin修改mysql数据库密码
    响应式设计:流式布局
    响应式设计:媒体查询
    html5、css3及响应式设计入门
    HTML5学习笔记五:html5表单
    HTML5学习笔记四:html5结构
    HTML5学习笔记三:aside元素,time元素与微格式
    css基础知识1——css基础语法、css选择器、css继承和层叠
    HTML基础知识5——<div>和<span>标签
  • 原文地址:https://www.cnblogs.com/ycyc123/p/14030562.html
Copyright © 2011-2022 走看看