铬网络
我们的iOS应用程序的网络堆栈最近已切换为Chromium网络堆栈。
其背后的关键原因是我们希望在iOS和Android之间共享代码。
其他 主要原因包括:
- 可以访问较低级别的网络堆栈以进行优化和报告,并避免系统库中的错误
- 能够打开/关闭功能。
- SDCH / Brotli / SPDY / H2 / QUIC / IPv6支持。
- 同步和异步联网API。
集成新网络堆栈的最简单方法是拦截NSURLProtocol并通过Chromium堆栈处理请求。 在理想的情况下,我们希望抽象出NSURLSession层并轻松切换到Chromium网络堆栈。
需要注意的 几点 :
- 框架大小。 该框架需要仔细剥离以减小二进制大小。 (例如,由于H2不在,因此无需支持SPDY)
- 守卫。 获取门禁的请求应通过原始网络堆栈。
- 关闭URLCache。
- 禁用内部cookie处理,以使cookie具有与其他堆栈/ webview同步的统一存储。
Chromium网络堆栈设计文档
下面是一个简短的摘要:
主要接口是URLRequest
和URLRequestContext
,前者表示URL,后者包含满足URL请求的上下文,包括cookie,主机解析器,代理解析器,http缓存等。
网络请求 剖析
启动URLRequest时,首先决定要创建哪种URLRequestJob
。 您可以通过URLRequest::Interceptor
和URLRequest::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缓存命中
- 响应缓存命中