http和浏览器相关知识

126 阅读7分钟

一、在浏览器输入 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、 三级缓存原理 (访问缓存优先级)

  1. 先在内存中查找,如果有,直接加载。
  2. 如果内存中不存在,则在硬盘中查找,如果有直接加载。
  3. 如果硬盘中也没有,那么就进行网络请求。
  4. 请求获取的资源缓存到硬盘和内存。

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 是否正确,从而将正常的请求和攻击的请求区分开。

防护策略分为三个步骤:

  1. 将 CSRF Token 输出到页面;放到window或者隐藏的div中。
  2. 页面提交的请求携带这个 Token;
  3. 服务器验证 Token 是否正确。

3、 双重 Cookie 验证

原理和 Token 相似,在请求接口时,在请求参数中附带上对应的 cookie(js取到的cookie),服务端在接收到请求时对参数中的 cookie 和 cookie 中的值进行对比判断是否为攻击请求。

4、增加网站A的验证手段,例如增加图形验证码或短信验证码等等,只有通过验证的请求才算合法。

四、https加密和http的区别

1、ssl的中文全称 安全套接字层

2、https的流程

  1. 首先客户端通过URL访问服务器建立SSL连接。
  2. 服务端收到客户端请求后,会将网站支持的证书信息(证书中包含公钥)传送一份给客户端。
  3. 利用网站的公钥将会话密钥加密,并传送给网站。
  4. 服务器利用自己的私钥解密出会话密钥,
  5. 服务器利用会话密钥加密与客户端之间的通信
  6. 第四步可以存到session里面,然后根据sessionId进行通信。不必要每次都要制作和传输秘钥了