这份文档概述了浏览器网络层的底层架构。
浏览器中的网络范围从高级的 Javascript API (如fetch())一直到在套接字上写入加密字节。
本文假定URL请求是通过浏览器的网络服务进行调解的,并专注于网络服务以下所有层的集成关键点。
这尤其是针对新手使用Chrome网络堆栈,但也应该对队伍中可能在某些堆栈部分是专家但在其他组件中大多不熟悉的成员有用。它从步行通过一个基本请求的过程开始,该请求由另一个进程发出,并逐步讨论各个组件的插件方式。
如果您在本文档中注意到任何不准确之处或感觉需要更好地解释某些内容,请不要犹豫提交补丁。
网络堆栈的解剖 网络堆栈位于 //net/ 位置,在 Chrome 存储库中使用名称空间 “net”。当此文档中的类名没有名称空间时,可以普遍认为它在/net/中,并且在网络名称空间中。
顶级网络堆栈对象是 URLRequestContext。上下文具有非所有指向所需对象的指针,以创建和发出URLRequest。上下文必须存活以容纳所有使用它的请求。创建上下文通常由URLRequestContextBuilder处理,这是一个相当复杂的过程。
URLRequestContext的主要用途是使用URLRequestContext :: CreateRequest()创建URLRequest对象。 URLRequest是直接消费网络堆栈的主要接口。它管理加载带有http、https、ws和wss方案的URL。其他方案的URL,如文件、文件系统、blob、chrome和数据,则完全在 //net/之外进行管理。每个URLRequest跟踪单个请求,直到发生错误、取消或收到最终响应为止,具有(可能为空的)正文。
HttpNetworkSession是另一个重要的网络堆栈对象。它拥有HttpStreamFactory、套接字池和HTTP / 2和QUIC会话池的所有权。它还具有与更直接处理套接字的网络堆栈对象的非所有指针。
本文不太提及这些对象,但在HttpStreamFactory上面的层中,对象通常从URLRequestContext获取其依赖项,而HttpStreamFactory及其以下层通常从HttpNetworkSession获取其依赖项。
有多少“