浏览器内核之资源加载与网络栈(上)

简介: 此文章是我最近在看的【WebKit 技术内幕】一书的一些理解和做的笔记。而【WebKit 技术内幕】是基于 WebKit 的 Chromium 项目的讲解。书接上文 浏览器内核之WebKit 架构与模块

前言


此文章是我最近在看的【WebKit 技术内幕】一书的一些理解和做的笔记。

而【WebKit 技术内幕】是基于 WebKit 的 Chromium 项目的讲解。

书接上文 浏览器内核之WebKit 架构与模块


1. Webkit 资源加载机制


网络和资源加载是网页的加载和渲染过程中的第一步,加载的资源包括以下内容:


微信图片_20220512134113.png


微信图片_20220512134125.png


在资源类的前面加上 “Cached” 字样,是因为效率问题而引入的缓存机制,所有对资源的请求都会先获取缓存中的信息, 以决定是否向服务器提出资源请求。


2. 资源缓存


资源的缓存机制是提高资源使用效率的有效方法。


它的基本思想是建立一个资源的缓存池。


当 WebKit 需要请求资源的时候,先从资源池中查找是否存在相应的资源。如果有,WebKit 则取出以便使用;如果没有,WebKit 创建一个新的 CachedResource 子类的对象,并发送真正的请求给服务器,WebKit 收到资源后将其设置到该资源类的对象中去,以便于缓存后下次使用。这里缓存指的是内存缓存,而不同于后面在网络栈部份的磁盘缓存。


微信图片_20220512134156.png


WebKit 从资源池中查找资源的关键字是 URL, 因为标记资源唯一的特征就是资源的 URL 。这也意味着,假如两个资源有不同的 URL ,但是它们的内容完全一样,也被认为是两个不同的资源。其实,上面是个简单的示意图,真实的过程比这里要复杂,这其中涉及到了资源的生命周期和失效机制。


3. 资源加载器


按照加载器的类型来分,WebKit 总共有三种类型的加载器。


微信图片_20220512134222.png


微信图片_20220512134235.png




微信图片_20220512134244.png


微信图片_20220512134256.png


由于从网络获取资源是一个非常耗时的过程,通常一些资源的加载是异步执行的,也就是说网络资源的获取和加载不会阻碍当前 WebKit 的渲染过程,例如图片、CSS 文件。


当然,网页也存在某些特别的资源会阻碍主线程的渲染过程,例如 Javascript 代码文件。这会严重影响 WebKit 下载资源的效率。因为主线程被阻碍了,后面的解析工作没有办法继续往下进行,所以对于 HTML 网页中后面使用的资源也没有办法知道并发送下载请求。


这时候,WebKit 会这样:当前的主线程被阻碍时,WebKit 会启动另外一个线程去遍历后面的 HTMl 网页,收集需要的资源 URL,然后发送请求,这样就可以避免被阻碍。与此同时,WebKit 能够并发下载这些资源,甚至并发下载 JavaScript 代码资源。这种机制对于网页的加载提速很是明显。


4. 资源的生命周期


资源池中的生命周期是什么呢?资源池不能无限大,必须要用相应的机制来替换其中的资源,从而加入新的资源。资源池使用的机制其实很简单,就是采用 LRU(Lease Recent Used 最近最少使用)算法。


另外一方面,当一个资源加载后,通常它会被放入资源池,以便之后使用。问题是,WebKit 如何判断下次使用的时候是否需要更新该资源从而对服务器重新请求?因为服务器可能在某段时间之后更新了该资源。


考虑这样的场景,当用户打开网页后,他想刷新当前的页面。这种情况下,资源池会出现怎样的情况呢?是清除所有的资源,重新获得?还是直接利用当前的资源?都不是。对于某些资源,WebKit 需要直接重新发送请求,要求服务器将内容重新发送过来。但对于很多资源,WebKit 则可以利用 HTTP 协议减少网络负载。在 HTTP 协议的规范中对此有规定,浏览器可以发送消息确认是否需要更新,如果有,浏览器则重新获取该资源;否则就需要利用该资源。


WebKit 的做法是,首先判断资源是否在资源池中,如果是,那么发送一个 HTTP 请求给服务器,说明该资源在本地的一些信息,例如该资源什么时间修改的,服务器则根据该信息作判断,如果没有更新,服务器则发送回状态码 304 ,表明无需更新,那么直接利用资源池中原来的资源;否则。WebKit 申请下载最新的资源内容。


5. Chromium 多进程资源加载


资源的实际加载在各个 WebKit 移植中有不同的实现。Chromium 采用的是多进程的资源加载机制。


微信图片_20220512134334.png


图4-11 描述了关于 Chromium 如何利用多进程架构来完成资源的加载,主要是多个 Render 进程和 Browser 进程之间的调用栈涉及的主要类。


Render 进程在网页的加载过程中需要获取资源,但是由于安全性(实际上,当沙箱模型打开的时候,Render 进程是没有权限去获取资源的)和效率上(资源共享等问题)的考虑,Render 进程的资源获取实际上是通过进程间通信将任务交给 Browser 进程来完成,Browser 进程有权限从网络或者本地获取资源。


在 Chromium 架构的 Renderer 进程中,ResourceHandleInternal 类通过 IPCResource-LoaderBridge 类同 Browser 进程通信。IPCResourceLoaderBridge 类继承自 ResourceLoaderBridge 类,其作用是负责发起请求的对象和回复结果的解释工作,实际消息的接收和派发交给 ResourceDispatcher 类来处理。


资源统一交由 Browser 进程来处理,这使得资源在不同网页间的共享变得很容易。因为每个 Renderer 进程某段时间内可能有多个请求,同时还有多个 Renderer 进程,Browser 进程需要处理大量的资源请求,这就需要一个处理这些请求的调度器,这就是 Chromium 中的 ResourceScheduler。


6. 网络栈


6.1 WebKit 的网络栈


微信图片_20220512134356.png


上图4-13 是 “ent” 所包括的主要子目录,也是 Chromium 网络栈的主要模块。这里面除了一些基础的部分,例如 HTTP 协议。NDS 解析等模块,还包含了 Chromium 为了减少网络时间 而引入的新技术,例如 SPDY 、QUIC 等


微信图片_20220512134411.png


图4-14 描述了从 URLRequest 类到 Socket 类之间的调用过程。以 HTTP 协议为例,图中列出了建立 TCP 的 socket 连接过程中涉及的类。


首先是 URLRequest 类被上层调用并启动请求的时候,它会根据 URL 的 “scheme” 来决定需要创建什么类型的请求。“scheme” 也就是 URL 的协议类型,例如 “http://”、“file://” ,也可以是自定义的 scheme ,例如 Android 系统的 “file://android_asset/”。 URLRequest 对创建的是一个 URLRequestJob 子类的一个对象,例如图中的 URLRequestJob 类。为了支持自定义的 scheme 处理方式, Chromium 使用工厂模式。


URLRequestJob 类和它的工厂类 URLRequestJobFactory 的管理工作都由 URLRequestJobManager 类负责。基本思路是,用户可以在该类中注册多个工厂,当有 URLRquest 请求时,先由工厂检查它是否需要处理该 “scheme” ,如果没有,工厂管理类继续交给下一个工厂类来处理。最后,如果没有任何工厂能够处理,Chromium 则交给内置的工厂来检查和处理是否为 “http://”、“ftp://”、或者 “file://” 等。

图 4-15 就是描述这些类的关系。


微信图片_20220512134434.png

相关文章
|
4月前
|
机器学习/深度学习 PyTorch 算法框架/工具
目标检测实战(一):CIFAR10结合神经网络加载、训练、测试完整步骤
这篇文章介绍了如何使用PyTorch框架,结合CIFAR-10数据集,通过定义神经网络、损失函数和优化器,进行模型的训练和测试。
264 2
目标检测实战(一):CIFAR10结合神经网络加载、训练、测试完整步骤
|
3月前
|
安全 网络安全 数据安全/隐私保护
访问控制列表(ACL)是网络安全中的一种重要机制,用于定义和管理对网络资源的访问权限
访问控制列表(ACL)是网络安全中的一种重要机制,用于定义和管理对网络资源的访问权限。它通过设置一系列规则,控制谁可以访问特定资源、在什么条件下访问以及可以执行哪些操作。ACL 可以应用于路由器、防火墙等设备,分为标准、扩展、基于时间和基于用户等多种类型,广泛用于企业网络和互联网中,以增强安全性和精细管理。
487 7
|
3月前
|
Java 程序员
JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
97 9
|
1月前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
111 15
|
3月前
|
缓存 监控 前端开发
在资源加载优化中,如何利用浏览器缓存提升性能?
通过以上这些方法,可以有效地利用浏览器缓存来提升资源加载的性能,减少网络请求次数,提高用户体验和应用的响应速度。同时,需要根据具体的应用场景和资源特点进行灵活调整和优化,以达到最佳的效果。此外,随着技术的不断发展和变化,还需要持续关注和学习新的缓存优化方法和策略。
116 53
|
3月前
|
网络协议
网络通信的基石:TCP/IP协议栈的层次结构解析
在现代网络通信中,TCP/IP协议栈是构建互联网的基础。它定义了数据如何在网络中传输,以及如何确保数据的完整性和可靠性。本文将深入探讨TCP/IP协议栈的层次结构,揭示每一层的功能和重要性。
120 5
|
3月前
|
安全 网络安全 数据安全/隐私保护
访问控制列表(ACL)是网络安全管理的重要工具,用于定义和管理网络资源的访问权限。
访问控制列表(ACL)是网络安全管理的重要工具,用于定义和管理网络资源的访问权限。ACL 可应用于路由器、防火墙等设备,通过设定规则控制访问。其类型包括标准、扩展、基于时间和基于用户的ACL,广泛用于企业网络和互联网安全中,以增强安全性、实现精细管理和灵活调整。然而,ACL 也存在管理复杂和可能影响性能的局限性。未来,ACL 将趋向智能化和自动化,与其他安全技术结合,提供更全面的安全保障。
217 4
|
3月前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
268 2
|
3月前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
92 13
|
4月前
|
Web App开发 安全 中间件
谷歌、火狐、Edge等浏览器如何使用ActiveX控件
allWebPlugin 是一款为用户提供安全、可靠且便捷的浏览器插件服务的中间件产品,支持 Chrome、Firefox、Edge 和 360 等浏览器。其 V2.0.0.20 版本支持一个页面加载多个插件,并解决了插件与浏览器之间的焦点问题。用户可通过“信息化系统 + allWebPlugin + 插件 + 浏览器”的解决方案实现 ActiveX 插件的无缝集成。下载地址见文末,安装包含详细说明。
1401 20

热门文章

最新文章