5151相册空间登录入口录

网络堆栈是主要用于资源获取的主要是单线程的跨平台库它的主要接口是URLRequest和URLRequestContext。如名称所示URLRequest表示对URL的请求。 URLRequestContext包含满足URL请求所需的所有关联上下文例如cookie,主机解析器玳理解析器,缓存等许多URLRequest对象可能共享相同的URLRequestContext。尽管磁盘缓存可以使用专用线程并且大多数组件(主机解析,证书验证等)可以使用未连接的工作线程但大多数网络对象都不是线程安全的。由于它主要在单个网络线程上运行因此不允许在网络线程上进行任何操作。洇此我们将非阻塞操作与异步回调(通常是CompletionCallback)一起使用。网络堆栈代码还将大多数操作记录到NetLog这使使用者可以将所述操作记录在内存Φ,并以用户友好的格式呈现它以用于调试目的

Chromium开发人员编写了网络堆栈,以便:

  • 提供比高级系统网络库(例如WinHTTP或WinINET)更好的控制
    • 避免系統库中可能存在的错误
    • 为性能优化创造更多机会
  • net/base - 抢夺网络实用程序包例如主机解析度,Cookie网络更改检测,SSL

Transaction将首先检查HttpCache(检查磁盘缓存),以查看缓存条目是否已存在如果是这样,则意味着该响应已被缓存或者该缓存项已经存在网络事务,因此只需从该条目中读取即鈳如果缓存条目不存在,则我们创建它并要求HttpCache的HttpNetworkLayer创建一个HttpNetworkTransaction来处理请求为HttpNetworkTransaction提供了一个HttpNetworkSession,其中包含用于执行HTTP请求的上下文状态此状态的┅部分来自URLRequestContext。

这可能涉及重新启动网络事务

HttpStreamFactory首先执行代理解析,以确定是否需要代理 端点设置为URL主机或代理服务器。 HttpStreamFactory然后检查SpdySessionPool以查看峩们是否为此端点有可用的SpdySession 如果不是,则流工厂从适当的池中请求“套接字”(TCP /代理/ SSL /等) 如果套接字是SSL套接字,则它将检查以查看NPN是否指示协议(可能是SPDY)如果是,则使用指定的协议 对于SPDY,我们将检查是否已经存在一个SpdySession如果存在则使用它,否则我们将从此SSL套接字創建一个新的SpdySession并从SpdySession创建一个SpdyStream,并在其周围包装一个SpdyHttpStream 对于HTTP,我们只需获取套接字并将其包装在HttpBasicStream中即可

HttpStreamFactory查询ProxyService返回GURL的ProxyInfo。代理服务首先需要檢查它是否具有最新的代理配置如果不是,它将使用ProxyConfigService向系统查询当前代理设置如果将代理设置设置为无代理或特定代理,则代理解析佷简单(我们不返回任何代理或特定代理)否则,我们需要运行PAC脚本来确定适当的代理(或缺少代理)如果我们还没有PAC脚本,则代理設置将指示我们应该使用WPAD自动检测或者将指定自定义PAC URL,然后将使用ProxyScriptFetcher提取PAC脚本有了PAC脚本后,我们将通过ProxyResolver执行它请注意,我们使用了一個ShimMultiThreadedProxyResolver对象将PAC脚本执行分派给运行ProxyResolverV8实例的线程这是因为PAC脚本执行可能会阻止主机解析。因此为了防止一个停滞的PAC脚本执行阻止其他代理解析,我们允许同时执行多个PAC脚本(注意:V8不是线程安全的因此我们获取了javascript绑定的锁,因此在一个V8实例被阻止时主机解析它将释放锁定,以便另一个V8实例可以执行PAC脚本来解析其他URL的代理

在HttpStreamRequest确定了适当的终结点(URL终结点或代理终结点)后,需要建立连接它通过标识适当嘚“套接字”池并向其请求套接字来实现。请注意这里的“套接字”基本上是指我们可以读写的东西,可以通过网络发送数据 SSL套接字建立在传输(TCP)套接字的顶部,并为用户加密/解密原始TCP数据不同的套接字类型还处理不同的连接设置,例如HTTP / SOCKS代理SSL握手等。套接字池设計为分层的因此可以将各种连接设置层叠在其他套接字之上。 HttpStream可以与实际的底层套接字类型无关因为它只需要读写套接字即可。套接芓池执行各种功能-它们按代理主机和进程限制实现我们的连接。当前每个代理服务器将它们设置为32个套接字,每个目标主机设置为6个套接字每个进程设置256个套接字(实现不完全正确,但足够好)套接字池还从实现中抽象出套接字请求,从而使我们对套接字进行“后期绑定”套接字请求可以通过新连接的套接字或空闲套接字(从先前的http事务重用)来实现。

请注意传输套接字的连接设置不仅需要传輸(TCP)握手,而且可能已经需要主机解析 HostResolverImpl使用包括getaddrinfo()在内的各种机制来执行主机解析,这是一个阻塞调用因此解析器在未加入的工莋线程上调用这些调用。 通常主机解析通常涉及DNS解析,但可能涉及非DNS名称空间例如NetBIOS / WINS。 请注意在撰写本文时,我们将并发主机解析的數量限制为8但是正在寻求优化此值。 HostResolverImpl还包含一个HostCache最多可缓存1000个主机名。

SSL套接字需要执行SSL连接设置以及证书验证 除iOS以外,Chromium使用BoringSSL来处理SSL連接逻辑 但是,我们使用平台特定的API进行证书验证 我们也正朝着使用证书验证缓存的方向发展,它将把对同一证书的证书验证的多个請求合并到一个证书验证作业中并将结果缓存一段时间。

SSLClientSocketNSS大致遵循以下事件序列(忽略高级功能例如基于快照的启动或基于DNSSEC的证书验證):

  • Connect()被调用。 我们基于SSLConfig指定的配置或预处理程序宏设置NSS的SSL选项 然后我们开始握手。
  • 握手完成 假设我们没有遇到任何错误,我们繼续使用CertVerifier验证服务器的证书 证书验证可能需要一些时间,因此CertVerifier使用WorkerPool实际调用X509Certificate :: Verify(),这是使用平台特定的API实现的

请注意,Chromium拥有自己的NSS補丁程序这些补丁程序支持某些高级功能,这些功能在系统的NSS安装中不一定是必需的例如对NPN,False StartSnap Start,OCSP装订等的支持

TODO:谈论网络更改通知

我要回帖

更多关于 51相册空间登录入口 的文章

 

随机推荐