#从 url 开始的长篇大论

#浏览器启动五+个进程

Chrome 右上角三个点-更多工具-任务管理器 可以看到当前进程

现在浏览器是多进程架构,每个进程就是每个程序的实例,进程负责管理多个线程

进程中任意线程出错都会导致进程崩溃,所以浏览器插件单独一个进程

线程之间共享进程的公共数据,所以 js 是单线程,防止在处理 dom 渲染等情况时多线程操作混乱

进程关闭后运行内存会回收,其实就是 win 的任务管理器清任务

进程之间数据是隔离的,所以需要进程通信机制(IPC)来通信

主要有五个进程:

  • 浏览器进程:界面显示、用户交互、子进程管理,同时提供存储等功能
  • 渲染进程(沙箱模式下,每个 tab 有一个,但是同一站点共用一个进程):包括排版引擎 Blink 和 JavaScript 引擎 V8 ,可以将 HTML、CSS、JS 转换为页面
  • GPU 进程:3D CSS、Chrome UI、网页
  • 网络进程:网络资源加载
  • 扩展或插件进程(沙箱模式下,每个 扩展/插件 有一个):运行扩展/插件,因为扩展/插件容易崩溃所以分离为进程

还有新增的部分进程:

  • Storage
  • Audio
  • 备用渲染进程

同一站点不用于同源,仅是 根域名相同 和 协议相同 即可

#大致流程

  • 浏览器进程接收用户输入,将 URL 转发给网络进程

  • 网络进程开始 URL 请求

  • 网络进程接收响应数据,将响应头数据转发给浏览器进程

  • 浏览器进程接收响应头数据,将'准备渲染'消息发动到渲染进程

  • 渲染进程接收'准备渲染'消息,与网络进程建立 IPC 数据管道接收 HTML 数据,网络进程接收完响应体数据后开始渲染

  • 渲染进程发给浏览器进程'确认提交'表示已经渲染好

  • 浏览器进程接收'确认提交'消息,开始更新页面

  • 浏览器进程:处理用户输入,重定向,进程管理等

  • 网络进程:发起 URL 请求,读取响应头和响应体数据

  • 渲染进程:解析页面与资源

#具体流程

#

  • 浏览器进程用户输入,判断是搜索则拼接搜索 URL,不是则使用 URL 请求,如果是有域名的,则使用 HTTP,先尝试 HTTPS,则根据 HTTPS 的 的 ALPN 完成协议选择和判断版本,如果是 HTTP,则根据响应头。其他的还有用/访问 FILE 协议等等

参考下面修改

非常抱歉,我之前的回答可能有些误导。根据您提供的更详细的信息,我将为您提供更准确的解释。

当用户在浏览器中输入内容时,浏览器进程会根据输入的内容进行判断和处理。以下是一般情况下浏览器处理用户输入的过程:

  1. 如果用户输入的内容是搜索关键词或不包含域名的 URL,浏览器会将其视为搜索请求,并将搜索关键词拼接到搜索引擎的 URL 上,然后发送请求。

  2. 如果用户输入的内容是一个包含域名的 URL,浏览器会使用 HTTP 协议进行请求。在发送请求之前,浏览器会先尝试使用 HTTPS 协议来发送请求,以提供更安全的通信。浏览器会发送一个带有"ALPN"(Application-Layer Protocol Negotiation)扩展的 TLS 握手请求,该扩展用于协议选择和判断版本。

  3. 如果服务器支持 HTTPS,并且浏览器和服务器之间成功建立了 TLS 连接,浏览器将继续使用 HTTPS 协议进行通信,并根据服务器返回的响应头中的"HTTP"字段来判断 HTTP 版本。

  4. 如果服务器不支持 HTTPS 或者 TLS 连接失败,浏览器会回退到使用 HTTP 协议进行通信,并根据服务器返回的响应头中的"HTTP"字段来判断 HTTP 版本。

此外,您提到还有使用"file"协议访问文件等其他情况。当用户输入的内容以"file://"开头时,浏览器会将其视为对本地文件系统的访问请求,并使用"file"协议来处理。这种情况下,不涉及 HTTP 协议的版本判断。

总结起来,浏览器在处理用户输入时,会根据输入内容的类型判断是搜索还是 URL 请求,并根据是否有域名来选择使用 HTTP 或 HTTPS 协议。对于使用 HTTPS 协议的请求,浏览器会使用 ALPN 扩展进行协议选择和判断版本。对于使用 HTTP 协议的请求,浏览器会根据服务器返回的响应头中的"HTTP"字段来判断 HTTP 版本。同时,还存在使用"file"协议访问文件等其他情况,不涉及 HTTP 协议的版本判断。