| 步骤 | 描述 |
|---|---|
| 发起请求的进程 | 请求数据从某个进程发起 |
| 浏览器进程 | 请求被传递到浏览器进程 |
| 网络服务 | 请求被传递到网络服务 |
| URLLoaderFactory | 在网络服务中创建URLLoaderFactory |
| URLLoader | URLLoader从URLLoaderFactory创建 |
| URLRequest | URLRequest由URLLoader创建 |
| 网络请求处理 | URLRequest处理网络请求 |
| 完成、失败或取消 | 请求完成、失败或被取消 |
URLRequest的生命周期从请求发起开始,经过URLRequest对象在网络堆栈中的处理,直到请求完成、失败或被取消。下面是一个简单的URLRequest的生命周期:
- 请求从某个进程发起,导致在网络服务中创建一个network::URLLoader。在桌面平台上,network服务通常在自己的进程中运行。
- URLLoader创建一个URLRequest来驱动网络请求。该URLRequest首先检查HTTP缓存,然后创建一个网络事务对象(如果必要)来实际获取数据。如果有可重用的连接,则尝试重用连接;否则,创建一个新连接。
- 一旦建立连接,HTTP请求被发送,响应被读取和解析,然后结果被返回到堆栈的上层,并发送给调用者。
当然,实际情况并不是这么简单的。考虑到一个简单的请求,由除了网络服务进程之外的某个其他进程发出。假设这是一个HTTP请求,响应是未压缩的,缓存中没有匹配的条目,并且在套接字池中没有与服务器连接的空闲套接字。
对于一个“简单”的URLRequest,以下是更详细的工作方式:
- 请求从某个(非网络)进程开始。
- 在浏览器进程中,使用network::mojom::NetworkContext接口创建network::mojom::URLLoaderFactory。
- 消费者(例如用于Blink的content::ResourceDispatcher,用于帧导航的content::NavigationURLLoaderImpl,或者一个network::SimpleURLLoader)通过将network::ResourceRequest对象和network::mojom::URLLoaderClient Mojo通道传递给network::mojom::URLLoaderFactory,并告诉它创建和启动network::mojom::URLLoader。
- Mojo将network::ResourceRequest通过IPC管道发送到网络服务中的network::URLLoaderFactory。
- Chrome有一个处理启动和配置其他进程、选项卡管理和导航等任务的单个浏览器进程,以及多个子进程,通常是沙箱化的,没有自己的网络访问权限,除了网络服务(它可以运行在自己的进程中,或者在浏览器进程中以节省RAM)。有多种类型的子进程(渲染器、GPU、插件、网络等)。渲染器进程是布局网页并运行HTML的进程。
浏览器进程创建顶级network::mojom::NetworkContext对象。NetworkContext接口是特权的,只能从浏览器进程访问。浏览器进程使用它来创建network::mojom::URLLoaderFactory,然后将其传递给较不特权的进程,以允许它们使用NetworkContext加载资源。要创建URLLoaderFactory,必须通过传递network::mojom::URLLoaderFactoryParams对象到NetworkContext来配置其他进程不信任设置的字段,以确保安全和隐私。其中一个字段是net::IsolationInfo字段,包括:
- net::NetworkIsolationKey,用于在网络堆栈中实施隐私沙盒,分隔不同站点使用的网络资源,以防止跨站跟踪用户。
- net::SiteForCookies,用于确定应将SameSite cookie发送到哪个站点。SameSite cookie通过只在站点为顶级站点时才可访问来防止跨站攻击。
- 如何在重定向期间更新这些值。
要进行网络请求的消费者,无论是在浏览器进程还是子进程中,都需要从浏览器进程中获取一个URLLoaderFactory,然后通过一些方式组装一个大的network::ResourceRequest对象,创建一个network::mojom::URLLoaderClient Mojo通道供network::mojom::URLLoader使用来回传消息,并将它们全部传递给URLLoaderFactory,后者返回一个URLLoader对象,用于管理网络请求。
URLLoaderFactory在网络服务中设置请求 总结:
- URLLoaderFactory创建一个URLLoader。
- URLLoader使用网络上下文的URLRequestContext来创建并启动一个URLRequest。
URLLoaderFactory以及所有的NetworkContext和大部分的网络堆栈都位于网络服务中的一个线程上。它从network::mojom::URLLoaderFactory Mojo管道中获取一个重构后的ResourceRequest对象,对其进行一些检查以确保能够服务该请求,如果可以,则创建一个URLLoader,并将请求和与URLLoaderFactory关联的NetworkContext传递给它。
然后,URLLoader调用NetworkContext的net::URLRequestContext来创建URLRequest。URLRequestContext有指向所有网络堆栈对象的指针,这些对象在网络上
下文中保存,并且网络上下文可以是多个网络堆栈的容器。
URLRequestContext创建URLRequest时会执行一些操作:
- 检查是否有适用的HTTP缓存条目。
- 如果请求的优先级是IDLE,看看是否可以重用一个闲置的连接。
- 如果请求的优先级是LOWEST,看看是否可以重用一个低优先级的连接。
- 创建一个新的net::URLRequest,然后将ResourceRequest对象中的字段复制到新创建的net::URLRequest中。 net::URLRequest是网络堆栈中的核心类,负责跟踪单个网络请求的生命周期,包括从创建到发送请求、接收响应、处理重定向、取消等。
- 一旦URLRequest被创建,就会开始处理请求。handleRequest()方法负责创建网络事务对象(如果需要的话),然后启动它。
总的来说,URLRequest的生命周期涉及多个组件,包括URLRequestFactory、URLLoaderFactory、NetworkContext和URLRequestContext,它们协作处理请求并在网络堆栈中执行必要的操作,直到请求完成、失败或被取消。