You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
(3)服务器收到请求时,根据传过来的If-Modified-Since和资源在服务器上的最后修改时间判断资源是否有变化,如果没有变化则返回304 Not Modified,但是服务器不会返回资源内容。当返回了304 Not Modified时,response中不会再添加Last-Modified,因为资源没有变化,Last-Modified也不会变化
进程和线程
进程是资源分配的最小单位,进程是程序的运行实例。进程中使用多线程并行处理可以提升运算效率。
线程是CPU调度的最小单位。不能单独存在,由进程来启动和管理,一个进程可以有多个线程。
三次握手
ISN不是固定的,是动态生成的
第三次握手可携带数据
第三次已经建立了连接了,第一次不行是容易收到攻击
SYN攻击
服务器端资源分配是在二次握手时分配的,客户端的资源是在完成三次握手分配的。客户端伪造大量IP地址对服务器发送SYN包。当发现有大量随机IP地址并且是半连接状态则是。
解决方法:
四次挥手
为什么挥手需要4次
因为ACK是用来应答的、SYN用来同步的,当收到服务端的FIN时,则只是关闭了连接,先回复个ACK收到了,等待其他任务执行完确认关闭了在发送FIN报文
2MSL连接意义
如果挥手时,客户端发送的ACK丢了,不等待的话,服务器收不到ACK则一直在等待不能关闭,后面再重新发送FIN,客户端已经关闭了所以收不到。服务器陷入不能关闭的地步
为什么TIME_WAIT状态需要经过2MSL才能返回到CLOSE状态
网络不可靠,这段时间就是用来重发可能丢失的ACK报文
五层网络
TLS
状态码
首屏加载优化
HTTP1.0-3.0
HTTP1.0
默认是短连接,每次和服务器通信都要建立链接。
HTTP1.1
默认是持久化链接。引入范围请求,实现断点续传。并可以同时发送多个请求
HTTP2.0
多路复用技术(一个TCP链接中可以有多个数据流),同时发起多次请求。头部压缩(只发送改动的头)。服务器推送。二进制分帧(解决队首阻塞)
HTTP3.0
集成了TLS加密,改进拥塞控制、快速握手(基于UDP)、连接迁移(只通过conection ID,id不变链接不需要重新建立)
Service Worker
同源策略
同源策略:端口、域名、协议相同
主要表现在DOM、Web数据、网络三个层面
XSS
跨站脚本攻击,在代码中加入<script>xxx</script>来进行一些操作。
主要分为:
处理方式:
其他:Vue因为在编译的时候所有的都是以字符串的形式处理的,并且他会匹配是否有script标签,然后此时是不允许执行的,并给提示
CSRF
跨站请求伪造,主要针对服务器的漏洞。
处理方法:
浏览器渲染
渲染的处理流程我们一般称为渲染流水线
主要分为以下:
构建DOM树
输入:HTML
因为浏览器不能直接理解和使用HTML,所以需要将HTML转为浏览器可以理解的DOM树。(document输出的就是DOM树)一个树形结构的(有点像虚拟DOM)。
输出:DOM树
样式计算
计算出DOM的具体样式
输入:CSS
流程
1、把CSS转换成浏览器可理解的结构styleSheets。该结构具备查询和修改功能
2、转换样式表中的属性值,使其标准化。将blue、em等转换为rgba和px
3、计算DOM树中每个节点的具体样式。用到CSS的继承规则和层叠规则
输出:styleSheets
布局
输入:DOM树和styleSheets
流程:
输出:布局树
分层
输入:布局树
生成图层树。为应对z-index、页面滚动、3D变化等,进行分层。渲染引擎还为特定的节点生成专用的图层,并生成一个图层树。
页面由图层叠加后呈现的。不是布局树每个节点都有一个图层,节点没有对应的层就继承父节点的层。
提升为单独一个图层的条件:
输出: 图层树
图层绘制
输入:图层树
把图层树进行绘制。将一个图层的绘制分成很多小的绘制指令,然后按照这些指令顺序组成一个待绘制的列表
输出:绘制列表
栅格化
输入:绘制列表
将绘制列表提交给合成线程。合成线程将图层划分为图块(256256或者512512)。优先将视口附近的图块优先生成位图。
一般栅格化过程会用GPU加速生成,用GPU生成位图的过程称为快速栅格化,生成的位图保存在GPU内存中。
输出:位图
合成和显示
所有图块都被光栅化后,合成线程生成一个绘制图块的指令,提交给浏览器进程,浏览器进程收到后则根据命令将页面绘制到内存中,最后显示在屏幕上
其他
如果下载CSS文件阻塞了,会阻塞DOM树合成么?会阻塞页面显示么?
当浏览器接收到HTML时,DOM解析器开始工作,解析过程中遇到JS脚本
重排
更新了元素的几何属性。比如宽度、高度触发重新布局,然后执行后面的一系列阶段,需要更新完整的渲染流水线,所以开销最大
重绘
更改了元素的绘制属性。比如修改背景色等。由于没有更改布局,所以直接进入绘制阶段和后面的子阶段。省去了布局和分层,比重排效率要高。
直接合成
使用CSS的transform实现动画效果,避开重绘和重排,在非主线程上合成动画操作,效率最高。避开了布局和绘制。
浏览器缓存
缓存可以分为:强缓存和协商缓存。协商缓存依赖强缓存,没有强缓存就没有本地缓存。
强缓存:
通过控制台可以看到,http状态为200,size显示from cache的请求是命中了强缓存的请求。
强缓存主要是Expires或者Cache-Control这两个response header实现的,他们都是表示资源在客户端缓存的有效期,Cache-Control的优先级高于Expires,两个header可同时存在
1) Expires
是http1.0提出的一个表示资源过期时间的header,过期时间是一个绝对时间,用GMT格式字符串表示,如:Expires:Thu, 31 Dec 2037 23:55:55 GMT
(1)浏览器第一次向服务器请求一个资源,服务器在返回这个资源的同时,在response header上加上Expires的header
(2)浏览器接收到这个资源的时候,会把这个资源连同所有response header一起缓存下来
(3)浏览器再次请求这个资源时,先从缓存中查找这个资源,找到后再和它的Expires跟当前本地时间作比较,如果在Expires指定时间前,则命中缓存
(4)如果没命中缓存,则请求服务器获取资源,并更新Expires Header
2) Cache-Control
是http1.1提出的一个表示资源过期时间的header,过期时间是一个相对时间,以秒为单位,用数值表示,如:Cache-Control:max-age=315360000。
Cache-Control还有其他的值:
1、 no-store:不缓存
2、 no-catch:缓存前,向服务器进行新鲜度验证
3、 public:可以被所有用户缓存
4、 private:不允许中继服务器缓存,只能被终端浏览器缓存
(1)浏览器第一次向服务器请求一个资源,服务器在返回这个资源的同时,在response header上加上Cache-Control的header
(2)浏览器接收到这个资源的时候,会把这个资源连同所有response header一起缓存下来
(3)浏览器再次请求这个资源时,先从缓存中查找这个资源,找到后再通过第一次请求时间和Cache-Control设定的有效期计算出资源过期时间,这个时间跟当前本地时间作比较,如果在过期时间前,则命中缓存
(4)如果没命中缓存,则请求服务器获取资源,并更新Cache-Control Header
协商缓存
http状态码是304,并显示Not Modified,则是命中了协商缓存
协商缓存主要是通过[Last-Modified,If-Modified-Since]和[ETag,If-None-Match]这两对header来管理
1) [Last-Modified,If-Modified-Since]
(1)浏览器第一次向服务器请求一个资源,服务器在返回这个资源的同时,在response header里加上Last-Modified,这个表示这个资源在服务器上最后的修改时间
(2)浏览器再次向服务器请求这个资源时,在request header上加上If-Modified-Since,这个值就是上次请求response的Last-Modified的值
(3)服务器收到请求时,根据传过来的If-Modified-Since和资源在服务器上的最后修改时间判断资源是否有变化,如果没有变化则返回304 Not Modified,但是服务器不会返回资源内容。当返回了304 Not Modified时,response中不会再添加Last-Modified,因为资源没有变化,Last-Modified也不会变化
(4)浏览器收到304响应后,从浏览器缓存中加载资源
(5)如果协商缓存没有命中,则从服务器中加载资源,Last-Modified在重新加载的时候会更新,并通过response header返回回去
2) [ETag,If-None-Match]
(1)浏览器第一次请求服务器资源时,服务器返回资源的同时,在response header里加上ETag,这个值是当前资源的唯一的标识,只要资源有变化,ETag就会变化
(2)浏览器再次请求这个资源的时候,在request header上加上If-None-Match,这个值就是上次请求返回的ETag的值
(3)服务器收到资源请求时,服务器会再生成一个新的ETag和传来的If-None-Match作比较,如果相同则命中缓存,返回304 Not Modified,不返回资源内容,并将ETag返回回去,即使没有变化。如果不相同,则返回资源内容。
浏览器行为对缓存的影响
缓存的处理方式可以被浏览器的行为改变,比如:
ctrl+f5强制刷新页面的时候,直接请求源服务器,跳过协商缓存和强缓存
f5刷新的时候,跳过强缓存,检查协商缓存
cookie和session区别
session:在服务端。被默认放在一个文件中,保存方式有很多(内存、数据库、文件)。依赖session_id,这个又放在cookie中,cookie禁用了session也失效了,当然也可以通过url传递
cookie:在客户端保存用户信息的一种机制。
跨域
三个允许跨域的标签
JSONP
原理:利用script标签没有跨域限制,可以从其他来源获取json数据
优点:简单,兼容性好
缺点:只能Get请求,容易XSS
实现:
CORS
实现:Access-Control-Allow-Origin 设置相应的域名
处理:
服务器代理。服务器端没有跨域限制,则同源服务器处理跨域请求
postMessage 不同源的脚本采用异步的方式跨文本和窗口的有限通信
websocket
nginx反向代理
window.name + iframe。name值在不同的页面(甚至不同域名)加载后依旧存在,并且可以支持非常长的 name 值
location.hash + iframe
document.domain + iframe
https
https是在http上建立SSL加密层,http协议是http直接请求TCP,https是http先请求TLS/SSL,然后请求TCP,对传输数据进行加密
优点:
缺点:
流程:
输入URL后的过程
事件机制
The text was updated successfully, but these errors were encountered: