目前的多进程架构
最新的Chrome
浏览器包括:1个浏览器(Browser
)主进程、1个 GPU
进程、1个⽹络(NetWork
)进程、多个渲染进程和多个插件进程。
- 浏览器进程。主要负责界⾯显⽰、⽤⼾交互、⼦进程管理,同时提供存储等功能。
- 渲染进程。核⼼任务是将
HTML
、CSS
和JavaScript
转换为⽤⼾可以与之交互的⽹⻚,排版引擎Blink
和JavaScript
引擎V8
都是运⾏在该进程中,默认情况下,Chrome会为每个Tab标签创建⼀个渲染进程。出于安全考虑,渲染进程都是运⾏在沙箱模式下。 GPU
进程。其实,Chrome
刚开始发布的时候是没有GPU
进程的。⽽GPU
的使⽤初衷是为了实现3D CSS
的效果,只是随后⽹⻚、Chrome
的UI
界⾯都选择采⽤GPU来绘制,这使得GPU
成为浏览器普遍的需求。最
后,Chrome
在其多进程架构上也引⼊了GPU
进程。- ⽹络进程。主要负责⻚⾯的⽹络资源加载,之前是作为⼀个模块运⾏在浏览器进程⾥⾯的,直⾄最近才独
⽴出来,成为⼀个单独的进程。 - 插件进程。主要是负责插件的运⾏,因插件易崩溃,所以需要通过插件进程来隔离,以保证插件进程崩溃
不会对浏览器和⻚⾯造成影响。
如何保证页面文件被完整送达浏览器
IP:把数据包送达目标机
如果想把一个数据包从A送达到B,那么在传输之前数据包应附上主机B的IP信息和主机A的IP信息,为的是传输过程中能正确寻址和B可以回复给A。
UDP:把数据包传给应用程序
IP是非常底层的协议,只负责把数据传到对方电脑,而传到什么应用程序则需要IP之上的能与应用程序打交道的协议,最常⻅的是“用户数据包协议(User Datagram Protocol)”,简称UDP。
UDP中⼀个最重要的信息是端口号,端口号其实就是⼀个数字,每个想访问⽹络的程序都需要绑定⼀个端口
号。通过端口号UDP就能把指定的数据包发送给指定的程序了,所以IP通过IP地址信息把数据包发送给指定
的电脑,⽽UDP通过端口号把数据包分发给正确的程序。和IP头⼀样,端口号会被装进UDP头⾥⾯,UDP头
再和原始数据包合并组成新的UDP数据包。UDP头中除了目的端口,还有源端口号等信息。
TCP:把数据完整地送达应用程序
浏览器请求要求数据传输可靠性,如果使用UDP来传输会存在两个问题:
- 数据包在传输过程中容易丢失
- 大文件会被拆分成很多⼩的数据包来传输,这些小的数据包会经过不同的路由,并在不同的时间到达接收
端,而UDP协议并不知道如何组装这些数据包,从而把这些数据包还原成完整的⽂件。
基于上述两个问题,我们引入了TCP。TCP(Transmission Control Protocol,传输控制协议)是⼀种⾯向
连接的、可靠的、基于字节流的传输层通信协议。相对于UDP,TCP有下⾯两个特点:
- 对于数据包丢失的情况,TCP提供重传机制;
- TCP引⼊了数据包排序机制,⽤来保证把乱序的数据包组合成⼀个完整的⽂件。
浏览器发起HTTP请求流程
如果在浏览器地址栏中输入http://example.com/index.html
会发生什么事情呢
构建请求
构建请求行信息,准备发起网络请求
GET /index.html 1.1
查找缓存
在真正发起请求之前,浏览器会在浏览器缓存中查询是否有要请求的文件。当浏览器发现将要请求的文件存在于缓存中,它会拦截请求,返回该资源在缓存中的副本,并结束请求。如果缓存查询失败,则进入请求流程。
DNS解析
浏览器提供了DNS缓存服务,如果某个域名解析过了,则返回缓存解析的结果,拿到IP之后获取端口号。通常情况下,如果url没有指定端口,则HTTP默认80端口。
等待TCP队列
Chrome有个机制,同一个域名只能建立6个TCP连接。如果在同⼀个域名下同时有10个请求发⽣,那么其中4个请求会进⼊排队等待状态,直至进行中的请求完成。当然,如果当前请求数量少于6,会直接进入下一步,建立TCP连接。
建立TCP连接
排队等待结束之后,在HTTP⼯作开始之前,浏览器通过TCP与服务器建⽴连接。
发送HTTP请求
首先浏览器会向服务器发送请求行,它包括了请求⽅法、请求URI
(Uniform Resource Identifier)和HTTP
版本协议。在浏览器发送请求⾏命令之后,还要以请求头形式发送其他⼀些信息,把浏览器的⼀些基础信息告诉服务器。⽐如包含了浏览器所使⽤的操作系统、浏览器内核等信息,以及当前请求的域名信息、浏览器端的Cookie信息,等等。
服务器返回请求
⾸先服务器会返回响应⾏,包括协议版本和状态码。随后,正如浏览器会随同请求发送请求头⼀样,服务器也会随同响应向浏览器发送响应头。响应头包含了服
务器⾃⾝的⼀些信息,⽐如服务器⽣成返回数据的时间、返回的数据类型(JSON、HTML、流媒体等类
型),以及服务器要在客⼾端保存的Cookie等信息。发送完响应头后,服务器就可以继续发送响应体的数据,通常,响应体就包含了HTML的实际内容。以上这些就是服务器响应浏览器的具体过程。