一、在浏览器输入 URL 回车之后发生了什么
1、url解析
先查看浏览器是否有缓存,如果命中,就直接使用缓存了。
2、DNS解析
1、浏览器缓存
2、操作系统缓存 (本地host文件)
3、ISP DNS缓存
如果都没有的话它就会向根服务器发出请求,进行递归查询。
3、TCP连接
数据传输的 应用层 传输层 网络层 链路层
传输层在建立连接前,会先进行TCP三次握手
3.2三次握手的流程
第一次握手:客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN。此时客户端处于 SYN_SEND 状态。
第二次握手:服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN。同时会把客户端的 ISN + 1 作为ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_REVD 的状态。
第三次握手:客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 ESTABLISHED 状态。服务器收到 ACK 报文之后,也处于 ESTABLISHED 状态,此时,双方已建立起了连接。
3.2为什么需要三次握手,两次不行吗?
第一次握手:客户端发送网络包,服务端收到了。
这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
第二次握手:服务端发包,客户端收到了。
这样客户端就能得出结论:服务端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
第三次握手:客户端发包,服务端收到了。
这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。
因此,需要三次握手才能确认双方的接收与发送能力是否正常。
4、处理请求
1、假如服务器配置了 HTTP 重定向,就会返回一个301永久重定向响应,浏览器就会根据响应,重新发送 HTTP 请求(重新执行上面的过程)。
2、如果请求的文件是真实存在的,比如图片、html、css、js文件等,则会直接把这个文件返回。
5、浏览器接受响应
1、首先查看 Response header,根据不同状态码做不同的事(比如上面提到的重定向)。
2、对响应资源做缓存。
3、解析响应内容。
6、渲染页面
1、HTML解析
2、CSS解析
3、渲染树
4、布局与绘制
5、合并渲染层
6、回流与重绘
7、js编译执行
二、浏览器缓存
1、 浏览器缓存是浏览器将网络资源存储在本地的一种行为。
2、缓存会存储在内存(js)或者硬盘中(css)。
3、 三级缓存原理 (访问缓存优先级)
- 先在内存中查找,如果有,直接加载。
- 如果内存中不存在,则在硬盘中查找,如果有直接加载。
- 如果硬盘中也没有,那么就进行网络请求。
- 请求获取的资源缓存到硬盘和内存。
4、 浏览器在加载资源时,会先根据本地缓存资源的 header 中的信息判断是否命中强缓存,如果命中则直接使用缓存中的资源不会再向服务器发送请求。
这里的 header 中的信息指的是
1、expires 它的值为一个绝对时间的 GMT 格式的时间字符串,缺点:由于失效时间是一个绝对时间,所以当服 务器与客户端时间偏差较大时,就会导致缓存混乱。
2、cahe-control.相对时间
no-cache:需要进行协商缓存,发送请求到服务器确认是否使用缓存。
no-store:禁止使用缓存,每一次都要重新请求数据。
同时启用的时候 Cache-Control 优先级高。
5、当强缓存没有命中的时候,浏览器会发送一个请求到服务器,服务器根据 header 中的部分信息来判断是否命中缓存,叫做协商缓存
1、浏览器第一次请求一个资源的时候,服务器返回的 header 中会加上
标识该资源的最后修改时间的Last-Modify。
当浏览器再次请求该资源时,request 的请求头中会包含 If-Modify-Since,该值为缓存之前返回的 Last-Modify。服务器收到 If-Modify-Since 后,根据资源的最后修改时间判断是否命中缓存。
如果命中缓存,则返回 304,并且不会返回资源内容,并且不会返回 Last-Modify。
2、ETag 可以保证每一个资源是唯一的,资源变化都会导致 ETag 变化。服务器根据浏览器上送的 If-None-Match 值来判断是否命中缓存。
Last-Modified 与 ETag 是可以一起使用的,服务器会优先验证 ETag,一致的情况下,才会继续比对 Last-Modified,最后才决定是否返回 304
6、 否则,返回最新的资源
三、网络安全
1、XSS,即跨站脚本攻击,在用户端注入恶意的可运行脚本 简单了解
如何预防:
1、获取用户输入,不用.innerHTML,用innerText。
2、转义 HTML,如果拼接 HTML 是必要的,就需要采用合适的转义库对 HTML 模版的各处插入点进行充分的转义。& < > " ' /
3、对用户的输入进行过滤,比如数字、URL、电话号码、邮件地址等内容,进行输入过滤
2、CSRF(跨站请求伪造)攻击者诱导受害者进入第三方网站向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。
1、验证 HTTP Referer 字段
2、CSRF Token
CSRF 的另一个特征是攻击者无法直接窃取用户的信息,仅仅是冒用而已。
我们可以要求所有的用户请求都携带一个 CSRF 无法获取到的 Token,服务器判断 Token 是否正确,从而将正常的请求和攻击的请求区分开。
防护策略分为三个步骤:
- 将 CSRF Token 输出到页面;放到window或者隐藏的div中。
- 页面提交的请求携带这个 Token;
- 服务器验证 Token 是否正确。
3、 双重 Cookie 验证
原理和 Token 相似,在请求接口时,在请求参数中附带上对应的 cookie(js取到的cookie),服务端在接收到请求时对参数中的 cookie 和 cookie 中的值进行对比判断是否为攻击请求。
4、增加网站A的验证手段,例如增加图形验证码或短信验证码等等,只有通过验证的请求才算合法。
四、https加密和http的区别
1、ssl的中文全称 安全套接字层
2、https的流程
- 首先客户端通过URL访问服务器建立SSL连接。
- 服务端收到客户端请求后,会将网站支持的证书信息(证书中包含公钥)传送一份给客户端。
- 利用网站的公钥将会话密钥加密,并传送给网站。
- 服务器利用自己的私钥解密出会话密钥,
- 服务器利用会话密钥加密与客户端之间的通信
- 第四步可以存到session里面,然后根据sessionId进行通信。不必要每次都要制作和传输秘钥了