一、进程&线程
1.进程
进程可以理解为是一个运行环境。当启动程序时,系统会为这个程序开辟一块内存地址,用于给程序创建运行环境,内存地址中包含着:运行代码、程序所使用的数据、执行程序任务的主线程。
它是资源分配的最小单位
2.线程
线程是包含在进程中的一个子项,它是执行一个任务的具体流程,一个进程里可以有多个线程,也就是常说的“多线程”,可以提升程序运行效率
它是程序执行的最小单位
3.之间的关系
- 进程中任一线程执行出错,都会导致线程崩溃
- 线程之间共享进程中的数据(同在一块内存地址中,数据通过内存共享)
- 进程被关闭后,系统会将进程所占用的内存进行回收
- 进程与进程的内容相互隔离(通过
TCP/IP
进行数据传输)
4.拓展
Chrome目前的架构(多进程架构)
- 浏览器主进程
- 页面展示、用户交互、子进程管理
- GPU进程
- UI界面绘制
- 网络进程
- 网络资源加载
- 渲染进程(多个)
- 转换HTML、CSS、JavaScript为网页
- 运行排版引擎、V8引擎
- 默认会给每个Tab创建一个渲染进程
- 插件进程(多个)
- 运行浏览器插件
二、TCP/IP
目的:保证页面文件能被完成的送达浏览器
实现过程:
总体分为:一个基础,两种方式
基础:
IP头:保证数据包送达至目的主机
在所需要传输的数据包中附上IP头,里面包含双方主机的IP地址、IP版本;便于在传输过程中正确寻址
两种方式:
- UDP头:把数据包送达应用程序
光保证数据包传送至目的主机还不够,还需要知道是哪个应用程序需要这些数据包,于是就有了UDP的协议
它是通过增加端口号的方式,用于确认是哪个程序进行了请求;访问网络的程序都必须绑定一个端口号;接受数据时,IP能通过IP地址信息将数据发送给指定的主机,而主机又会通过解析数据中的UDP头,将数据包分发给对应的程序。
优点:
- 传输速度非常快
缺点:
- 不提供重发机制
- 无法跟踪数据是否传输成功
- TCP:把数据完整送达应用程序
TCP你补了UDP的缺陷,通过增加了三个机制,保证数据完整可靠的传输:
- 建立连接:三次握手
- 传输数据:收发确认
- 断开连接:四次挥手
优点:
- 提供重传机制
- 提供数据包排序机制
缺点:
- 传输速度相对较慢
二、HTTP
HTTP是建立在TCP协议上的一个允许浏览器向服务器获取资源的协议
浏览器发起HTTP请求流程
1.构建请求
构建一个请求行,里面包含着:
- 请求方式
- 请求路径
- HTTP协议版本
2.查找缓存
浏览器缓存可以帮助网页资源在第一次请求后,将资源缓存至本地中(内存或磁盘中),便于在第二次及之后的请求中能直接使用
对于get方式请求资源时,会优先查看浏览器的缓存,若浏览器中存在缓存,则会直接拦截请求,返回该资源的缓存数据。浏览器的缓存分为两种形式:
2.1强缓存
这是浏览器的默认缓存方案
当缓存数据未失效时(即Cache-Control的max-age没有过期或者Expires的缓存时间没有过期),浏览器将会直接使用该缓存数据,不会与服务器有任何请求交互。
优点:
- 页面加载速度最快,性能最好
缺点:
- 服务端资源修改后,页面无法更新(强制刷新)
补充:
对于Chrome来说,使用强缓存时,会根据资源更新频率,将资源以两种不同的情况进行缓存:
- from memory cache(更新频率高的js、图片、字体)
from disk cache(更新频率低的js、css资源)
2.2协商缓存
若第一次请求后响应头中没有Cache-Control和Expires或者Cache-Control和Expires过期还或者它的属性设置为no-cache时(即不走强缓存),第二次请求时,将会发送资源请求给服务端进行协商,判断资源是否进行了修改更新:
如果服务端资源没有修改,则会告知浏览器使用缓存中的数据;
- 如果服务端资源修改,则会返回更新后的资源,并刷新缓存
3.准备IP地址和端口
- 浏览器请求DNS返回域名对应的IP地址
- 获取端口号(默认为80)
4.等待TCP队列
TCP限制:HTTP/1.1版本中,同一个域名下最多建立6个TCP连接
拓展:(HTTP/2.0,同域名下可建立1个TCP持久连接)
5.建立TCP连接
三次握手步骤
6.发送HTTP请求
- 发送第一步中创建的请求行
- 若是POST请求,则会将需要发送的额外数据放在请求体中发送给服务端
- 浏览器的其他基础信息,将会放在请求头中发送给服务器
7.接收HTTP数据
- 收到基础的响应行,包括HTTP协议版本、状态码
- 服务器返回的额外浏览器数据,放在响应头中
- 返回包含额外数据的响应体
8.断开连接
四次握手关闭TCP连接
若请求或响应头中加入:Connection:Keep-Alive
,则不会关闭TCP连接
三、从输入URL到页面展示的流程
1.用户输入URL
2.URL请求
- 优先查找本地缓存(强缓存)
- 没有本地缓存就走网络请求
- DNS解析,获得请求的IP地址(如果是HTTPS,需要建立TLS连接)
- 利用IP建立TCP连接
- 浏览器构建请求信息,请求服务器
- 解析服务端返回的响应头
- 准备渲染进程(从一个页面打开了另一个新页面,而新页面和当前页面属于同一站点的话,那么新页面会复用父页面的渲染进程)
- 提交响应体数据给浏览器渲染进程
- 构建DOM树、CSSOM树