铬网络

我们的iOS应用程序的网络堆栈最近已切换为Chromium网络堆栈。

其背后的关键原因是我们希望在iOS和Android之间共享代码。

其他 主要原因包括:

  1. 可以访问较低级别的网络堆栈以进行优化和报告,并避免系统库中的错误
  2. 能够打开/关闭功能。
  3. SDCH / Brotli / SPDY / H2 / QUIC / IPv6支持。
  4. 同步和异步联网API。

集成新网络堆栈的最简单方法是拦截NSURLProtocol并通过Chromium堆栈处理请求。 在理想的情况下,我们希望抽象出NSURLSession层并轻松切换到Chromium网络堆栈。

需要注意的 几点

  1. 框架大小。 该框架需要仔细剥离以减小二进制大小。 (例如,由于H2不在,因此无需支持SPDY)
  2. 守卫。 获取门禁的请求应通过原始网络堆栈。
  3. 关闭URLCache。
  4. 禁用内部cookie处理,以使cookie具有与其他堆栈/ webview同步的统一存储。

Chromium网络堆栈设计文档

下面是一个简短的摘要:

主要接口是URLRequestURLRequestContext ,前者表示URL,后者包含满足URL请求的上下文,包括cookie,主机解析器,代理解析器,http缓存等。

网络请求 剖析

启动URLRequest时,首先决定要创建哪种URLRequestJob 。 您可以通过URLRequest::InterceptorURLRequest::ProtocolFactory定制请求。

URLRequestHttpJob查询CookieMonster以标识cookie并随后创建一个HttpTransaction 。 该事务将首先检查HttpCache ,如果未命中,我们将创建一个HttpNetworkTransaction来处理请求。 事务被提供给HttpNetworkSession以包含执行HTTP请求的上下文状态。

HttpNetworkTransaction要求HttpStreamFactory创建HttpStream 。 工厂返回一个HttpStreamRequest并处理如何建立连接的所有逻辑。 建立连接后,将包装直接HttpStream与网络对话的HttpStream子类。

HttpStreamFactory进行代理解析,以确定是否需要代理。 端点将检查SpySession中是否有可用的SpdySessionPool.

连接管理

套接字池从实现中提取套接字请求,从而使我们对套接字进行“后期绑定”。 套接字请求可以通过新连接的套接字或空闲的套接字来实现(重用以前的http事务)

支持的仪器

时间指标:

  • 要求开始
  • Dns开始
  • Dns结束
  • 连接开始
  • 连接端
  • SSL启动
  • SSL结束
  • 发送开始
  • 发送端
  • 推动开始
  • 推动端
  • 响应接收开始
  • 请求结束
  • 到第一个字节的时间

尺寸指标:

  • 发送的总字节数
  • Recd总字节数

缓存指标:

  • 套接字重用
  • SSL会话缓存命中
  • DNS缓存命中
  • 响应缓存命中

Interesting Posts