理解WebKit和Chromium: Chromium网络栈
转载请注明原文地址:http://blog.csdn.net/milado_nju
## 概述
前面讲到Chromium的资源加载机制,在调用栈上,提到URLRequest之后就戛然而止,在这之下就是Chromium的网络模块部分,它是在Browser进程中工作的,这部分其实包含很多内容,例如调用栈,Cookie,磁盘缓存,域名解析,网络协议,代理,安全机制等。它们的主要作用是使用网络来下载各种类型的资源,当然网络部分的内容远不只这些 ,它还需要支持最新的HTML5功能-WebSockets 。更具创新的是,为了高效的网络机制,Chromium使用了预DNS解析和资源预取等技术,极大的减少了用户等待时间。要是你以为这就是全部,那就错了,Chromium又引入了SPDY和QUIC等新网络协议,用于减少网络传输时间。
要一一解释这所有的部分其实并不容易,本节试图通过介绍网络栈的基础部分和SPDY技术,跟你一起一窥其中的一些秘密,对于更多的内容,希望以后可以逐一介绍它们。
## 调用栈
下面来了解Chromium的网络调用过程剖析。读者可以先查看一下“net”目录下的子目录,大致了解主要的子模块。下图描述了URLRequest到Socket之间的调用过程,下面逐步来分析它们。以HTTP协议为例,在建立TCP的socket连接过程中涉及的类。
首先是URLRequest被上层调用启动请求的时候,它会根据URL的scheme来决定需要创建什么类型的请求。“scheme”也就是URL的类型,例如“http://”,“file://“。还可以是自定义的scheme,例如Android系统的file://assets/。URLRequest创建的是一个URLRequestJob子类的一个对象,例如图中URLRequestHttpJob。为了支持自定义的scheme处理方式,它是利用工厂模式。对于URLRequestJob和它的工厂URLRequestJobFactory的管理工作都是URLRequestJobManager负责。基本的思路是,用户可以在该类中注册多个工厂,当有URLRequest请求时候,先有工厂检查它是否需要处理该scheme,如果没有,继续交由下一个工厂类。最后,如果没有任何工厂能够处理的话,则交给内置的工厂来检查和处理是否是http://,ftp://或者file://等。
其次,当URLRequestHttpJob被创建后,它首先从Cookie管理器中获取跟该URL相关联的信息。之后,它同样借助于HttpTransactionFactory创建一个HttpTransaction类的对象来表示开启一个HTTP连接的事务(当然这里的概念不同于数据库中的事务概念)。通常情况下,HttpTransactionFactory对应的是一个它的子类HttpCache的实例。HttpCache类使用本地磁盘缓存机制(稍后会介绍),如果该请求对应的回复已经在磁盘缓存中,那么无需再建立HttpTransaction来发起连接,直接从磁盘中获取即可。如果磁盘中没有,同时如果目前该URL请求对应的HttpTransaction已经建立,那么只要等待它的回复即可。这些条件都不满足后,实际上才会真正创建HttpTransaction。
再次,HttpNetworkTransaction使用HttpNetworkSession来管理连接会话。HttpNetworkSession通过它的成员HttpStreamFactory来建立TCP Socket连接,之后创建HttpStream对象。HttpStreamFactory将和网络之间的数据读写交给自己新创建的一个HttpStream(其实是它的子类)对象来处理。
最后,是套接字的建立。Chromium中的跟服务器建立连接的套接字是StreamSocket,它是一个抽象类,在POSIX和Windows上有分别不同的实现。同时,为了支持SSL机制,它还有一个子类就是SSLSocket。
## SPDY
HTTP管线化技术有很大的限制和缺陷,那么如何解决这些问题呢?在SPDY协议之前,同很多成功案例背后有众多的失败实验一样,也尝试了一些部分解决方案,例如SCTP,SST,MUX等等,它们主要作用在传输层或者会话层上。但是,它们只是解决了部分问题,但是HTTP相关问题依然没有解决(例如压缩等),而且在传输层上的协议很难实施。Chromium引入了新的机制-SPDY。SPDY就是为了解决网络延迟和安全性问题。根据Google的官方数据,使用SPDY协议的服务器和客户端可以将网络加载的时间减少64%。在HTTP2.0的草案中引入SPDY协议作为基础来编写。
SPDY协议是一种新的会话层协议,它定义在HTTP协议和TCP协议之间,下图描述了这些协议之间的层次关系。
SPDY协议的核心思想是多路复用,仅使用一个连接来传输一个网页中的众多资源。从上图中读者也可以看到,它本上并没有改变HTTP协议,只是将HTTP协议头通过SPDY来封装和传输。其传输方式也没有发生变化,然后使用TCP/IP协议。所以,它相对比较容易的布置,服务器只需要插入SPDY协议的解释层,从SPDY的消息头中获取各个资源的HTTP头即可。其次是,SPDY协议必须建立在SSL层之上,这是一个比较大的限制,因为有很多网站不一定希望支持HTTPS。
SPDY的工作方式有以下四个特征:
第一,利用一个TCP连接来传输不限个数的资源请求的读写流,这与之前的为每个资源请求都建立一个TCP连接大大不同,这明显提高了TCP连接的利用率,减少TCP连接的维护成本。前面我们也说出,建立一个TCP连接的时间在几十毫秒到几秒甚至更长,这显然能够减少时间。
第二,根据资源请求的特性和优先级,SPDY可以调整它们的请求这些资源的优先级,例如对JavaScript资源的优先级很高,服务器优先传输回复该类型的请求。在网络带宽不是很理想的情况下,这是一种折中。
第三,就是对这些请求使用压缩技术,大大减少需要传送的字节数。这一思想已广泛应用于各种浏览器中。
第四,当用户需要浏览某个网页的时候,支持SPDY协议的服务器在发送网页内容时候可以尝试发送一些信息给浏览器,告诉后面可能需要哪些资源,浏览器可以提前知道并决定是否需要下载。更极端的情况是,服务器可以主动发送资源。
## 参考资料
1. http://www.chromium.org/developers/design-documents/network-stack
by yongsheng@chromium.org
理解WebKit和Chromium: Chromium网络栈的更多相关文章
- 浏览器-09 javascript引擎和Chromium网络栈
语言的运行 C/C++语言 使用编译器直接将它们编译成本地代码(机器指令),这是由开发人员在代码编写完成之后实施; 用户只是使用这些编译好的本地代码,这些本地代码被系统的加载器加载执行,由操作系统调度 ...
- 理解WebKit和Chromium(电子书)
前言 基础篇 WebKit, WebKit2, Chromium和Chrome介绍 WebKit和Blink WebKit和Chromium代码目录结构介绍 WebKit和Chromium功能模块 ...
- 理解WebKit和Chromium: Chromium的多进程资源加载机制
转载请注明原文地址:http://blog.csdn.net/milado_nju ##概述 前面介绍了WebKit中的资源加载机制,其实它只是一个框架性的东西,实际的资源加载依赖于各个WebKit移 ...
- 理解 Linux 网络栈(2):非虚拟化Linux 环境中的 Segmentation Offloading 技术
本系列文章总结 Linux 网络栈,包括: (1)Linux 网络协议栈总结 (2)非虚拟化Linux环境中的网络分段卸载技术 GSO/TSO/UFO/LRO/GRO (3)QEMU/KVM + Vx ...
- 理解 Linux 网络栈(3):QEMU/KVM + VxLAN 环境下的 Segmentation Offloading 技术(发送端)
本系列文章总结 Linux 网络栈,包括: (1)Linux 网络协议栈总结 (2)非虚拟化Linux环境中的网络分段卸载技术 GSO/TSO/UFO/LRO/GRO (3)QEMU/KVM + Vx ...
- 理解 Linux 网络栈(1):Linux 网络协议栈简单总结
本系列文章总结 Linux 网络栈,包括: (1)Linux 网络协议栈总结 (2)非虚拟化Linux环境中的网络分段卸载技术 GSO/TSO/UFO/LRO/GRO (3)QEMU/KVM + Vx ...
- Linux网络栈下两层实现
http://www.cnblogs.com/zmkeil/archive/2013/04/18/3029339.html 1.1简介 VLAN是网络栈的一个附加功能,且位于下两层.首先来学习Linu ...
- 【Linux 内核网络协议栈源码剖析】网络栈主要结构介绍(socket、sock、sk_buff,etc)
原文:http://blog.csdn.net/wenqian1991/article/details/46700177 通过前面的分析,可以发现,网络协议栈中的数据处理,都是基于各类结构体,所有有关 ...
- Linux网络栈
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11394930.html OSI模型 OSI 模型把网络互联的框架分为应用层.表示层.会话层.传输层.网 ...
随机推荐
- C# 定积分求周长&面积原理 代码实现
前言: 前些日子,因为工作原因,接触到了求解曲线周长,真的是搞了很久,学生时代真的很简单,但是如今的我来说,忘记了....很多人跟我应该一样. 所以来巩固加强一下记忆.一开始的时候,求周长嘛,找公式呗 ...
- 安卓高级EventBus使用详解
我本来想写但是在网上看了下感觉写得不如此作者写得好:http://www.jianshu.com/p/da9e193e8b03 前言:EventBus出来已经有一段时间了,github上面也有很多开源 ...
- Java面向对象要点
面向对象: 一.基本概念 类与对象的基本概念: 1.void类型是不需要返回值的,其他类型全部都需要返回值. public void tell(){ ...
- Swift基础之两指拉动图片变大变小
我们在使用APP的时候,有时会发现有些图片可以通过两指进行放大.缩小,今天就实现这样的一种效果,比较简单,不喜勿喷.... var imageVi:UIImageView! = nil var ...
- 剑指Offer——知识点储备-设计模式
剑指Offer--知识点储备-设计模式 设计模式 设计模式的六大原则 (1)单一职责原则(有且仅有一个原因引起类的变化): (2)里氏替换(任何父类出现的地方子类都可以替换): (3)依赖倒置(依赖抽 ...
- TV Metro界面(仿泰捷视频TV版)源码解析
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52822499 前言:上一篇介绍了 ...
- 关于ListView中包含EditText数据复用引起异常的解决方案
概述 前几天测试提了一个bug,在ListView中添加留言信息,导致错乱的问题.实际上就是ListView需要添加一个EditText,复用导致错乱的问题,这个问题以前也遇到过.诸如,ListVie ...
- 全废话SQL Server统计信息(1)——统计信息简介
当心空无一物,它便无边无涯.树在.山在.大地在.岁月在.我在.你还要怎样更好的世界?--张晓风<我在> 为什么要写这个内容? 随着工作经历的积累,越来越感觉到,大量的关系型数据库的性能问题 ...
- pdflush的工作原理
大家知道,在linux操作系统中,写操作是异步的,即写操作返回的时候数据并没有真正写到磁盘上,而是先写到了系统cache里,随后由pdflush内核线程将系统中的脏页写到磁盘上,在下面几种情况下,系统 ...
- EBS开发性能优化之查找需要优化的程序
1.登陆数据库LINUX环境 使用 top 命令查看进程状况 [oratest@ebsdb~]$top top - 15:58:59 up 8 days, 22:04, 1 user, load ...