【Chromium中文文档】多进程资源加载

背景知识

所有网络交流都是在主浏览器进程处理的。这样浏览器进程不仅可以控制每个渲染器的网络访问,还可以在进程间维持session状态一致性,像cookie和缓存数据。另一个重要的原因是,作为一个HTTP/1.1的用户代理,浏览器整体上在每个host上不能打开太多连接。

概述

我们的多进程应用程序可以从三个层面来看。在最底层是WebKit库,用来渲染页面。在它上面是渲染器进程(简单地,每个标签页对应一个进程),每个进程包含一个WebKit实例。管理所有渲染器的是浏览器进程,控制所有的网络访问。

Blink(刷新器)

Blink有一个ResourceLoader对象,负责获取数据。每个加载器有一个WebURLLoader以展现真实的请求。这个实例的头文件在Blink仓库中。

ResourceLoader实现了WebURLLoaderClient接口。这是渲染器使用的回调接口,用以获取数据和其他刷新用的事件。

测试shell使用一个不同的资源加载器,提供了不同的实现,即,一个非IPC版本的ResourceLoaderBridge,位于webkit/tools/test_shell/simple_resource_loader_bridge。

渲染器

渲染器对WebURLLoader的实现,成为WebURLLoaderImplementation,位于content/child。它使用全局的ResourceDispatcher单例对象(每个渲染器内部单例),来创建一个唯一的request ID,通过IPC转发这个request给浏览器。浏览器的响应会引用这个request ID,将其转换后,通过资源分发起返回给RequestPeer对象(WebURLRequestImpl)。

浏览器

浏览器中的RenderProcessHost对象从每个渲染器接收IPC请求。使用指向渲染进程host的指针(尤其是,ResourceDispatcherHost::Receiver),转发这些请求给全局的ResourceDispatcherHost,并且用渲染器生成的request ID唯一标识这些请求。

然后,每个请求会被转换成一个URLRequest对象,反过来将其转发给它内部的URLRequestJob(它实现了需要的特殊协议).当URLRequest生成通知时,它的ResourceDispatcherHost::Receiver和request ID会被用于将通知发送给正确的RenderProcessHost,以将其发回给渲染器。因为渲染器生成的ID被保留,将所有的响应与一个特定的一开始由WebKit生成的请求关联起来成为可能。

Cookies

所有的cookies由我们的CookieMonster对象处理,位于/net/base中。我们不会与WinInet共享cookie。这个浏览进程中的CookieMonster处理所有的网络请求,因为所有标签页之间的cookie必须相同。

页面可以通过document.cookie为一个document请求cookie。这种情况下,我们从渲染器向李兰器发送一个同步消息来请求cookie。当浏览器在处理cookie时,WebKit的工作线程会挂起。当渲染器的I/O线程接受到浏览器的响应时,它会解除这个线程挂起,然后把结果传回给JavaScript引擎。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏散尽浮华

Saltstack自动化操作记录(2)-配置使用

之前梳理了Saltstack自动化操作记录(1)-环境部署,下面说说saltstack配置及模块使用: 为了试验效果,再追加一台被控制端minion机器192....

23711
来自专栏决胜机器学习

《Redis设计与实现》读书笔记(十三) ——Redis数据库其他内容与总结

《Redis设计与实现》读书笔记(十三) ——Redis数据库其他内容与总结 (原创内容,转载请注明来源,谢谢) 一、RDB、AOF、复制对过期键的处理 1、R...

3357
来自专栏技术之路

Http概述(一)

Http使用的是可靠的数据传输协议,因此即使数据来自地球的另一端,也能够确保数据在传输过程中不会被损坏或产生混乱。 这样用户在访问信息时就不用担心其完整性了。 ...

1855
来自专栏我的博客

express获取参数

ajax异步提交的数据,使用 bodyParser = require('body-parser'); //接收post app.us...

2574
来自专栏haifeiWu与他朋友们的专栏

测试环境服务器硬盘塞满问题排查

某天下午测试环境服务器出现tab无法补全命令,给出的提示大概意思就是说,无可用空间无法创建临时文件,不过这次跟上次出现的问题比较像,上次服务器出现的问题,因此楼...

501
来自专栏散尽浮华

nginx限制上传大小和超时时间设置说明/php限制上传大小

现象说明: 在服务器上部署了一套后台环境,使用的是nginx反向代理tomcat架构,在后台里上传一个70M的视频文件,上传到一半就失效了! 原因是nginx配...

3197
来自专栏散尽浮华

DNS之BIND使用小结(Forward转发)

之前详细介绍了DNS及其在linux下的部署过程,今天再说下DNS的BIND高级特性-forwarder转发功能。比如下面一个案例: 1)已经在测试环境下部署了...

1243
来自专栏信安之路

通过POC来学习漏洞的原理

本文介绍的是 easyFTPServer 1.7.0.2 ‘Http’ remote Buffer Overflow 的漏洞执行流程,通过已知的 POC 来推断...

1180
来自专栏流柯技术学院

【LoadRunner】OSGI性能测试实例

Ø  确定测试登录最大并发用户数; Ø  事务平均响应时间 (两个查询) 得到这个任务 如何展开测试工作呢? 一、WindowsResources 设置(其...

702
来自专栏前端达人

在 React 应用中获取数据

可以说 React 是构建 web 应用最流行的库。然而,它并不是全能的 web 框架。它只关注 MVC 中的 view 模块。

662

扫码关注云+社区