标签(空格分隔): 计算机网络 秋招


为什么有HTTPS

因为HTTP有如下缺点

  • 通信使用明文不加密,内容可能会被窃听
  • 不验证通信方身份,有可能会在遭到伪装
  • 无法验证报文的完整性

添加了加密及认证机制的HTTP就是HTTPS

SSL就是 安全套接层 secure socket layout

SSL采取公开密匙加密

共享密匙加密是加密与解密都用同一个密匙,也叫做对称加密。但是由于加密与解密都是用的同一把密匙,所以不安全

公开密匙加密使用一对非对称密匙,一把私有密匙,一把公匙。发送密文方使用公开密匙进行加密,对方收到被加密信息后,在使用私匙解密。

由于无法验证公开密钥本身就是服务器设定的密钥,存在问题

所以需要数字证书

数字证书

数字证书认证机构处于客户端与服务器双方都可信赖的第三方机构的立场上

服务器会将这份由数字证书认证机构颁发的公钥证书发送给客户端,以进行公开密钥加密方式通信。公钥证书也可叫做数字证书或直接称为证书。
接到证书的客户端可使用数字证书认证机构的公开密钥,对那张证书上的数字签名进行验证,一旦验证通过,客户端便可明确两件事:一,认证服务器的公开密钥的是真实有效的数字证书认证机构。二,服务器的公开密钥是值得信赖的。

HTTPS AND HTTP AND HTTP2 - 图1

HTTP

HTTP-Only与Secure Cookies的属性

  1. 标记为Secure属性的cookies表示只能通过HTTPS发送给服务端,Http-Only表明客户端无法通过document.cookies读取到cookies
  2. SameSite 表明服务器要求某个Cookies在跨站请求不会被发送,有三种值 None,Strict,Lax
  • None表示跨站请求,同站请求都可以设置Cookeis
  • Strict表明只在访问相同站点发送Cookie

Fetch 与 AJAX

随着 React.js、Angular.js 和 Vue.js 这些前端框架的流行,很多单页面应用已经不再使用 jQuery 了,这意味着你要自己对 XMLHttpRequest 进行封装,而很多人选择封装一个跟 jQuery.ajax 差不多的接口。

Fetch API 的出现,就是为了给类似的操作流程定一个接口规范。

Fetch的特点

  • 基于Promise
  • 没有引入第三方库

问题

  • 由于基于Promise,不支持取消
  • Fetch默认不带Cookies,如需设置,需要设置fetch(url, {credentials: ‘include’})`
  • 服务器返回400,500的时候并不会reject,只有网络错误导致请求不能完成的时候才会被reject

解决办法 对Fetch多进行一层封装

  1. function checkStatus(response) {
  2. if (response.status >= 200 && response.status < 300) {
  3. return response;
  4. }
  5. const error = new Error(response.statusText);
  6. error.response = response;
  7. throw error;
  8. }
  9. function parseJSON(response) {
  10. return response.json();
  11. }
  12. export default function request(url, options) {
  13. let opt = options || {};
  14. return fetch(url, { credentials: "include", ...opt })
  15. .then(checkStatus)
  16. .then(parseJSON)
  17. .then(data => data)
  18. .catch(err => err);
  19. }

HTTP2.0

HTTP2.0采用二进制传输。之前的HTTP中都使用文本格式传输。HTTP新版本中采用了新的编码格式

多路复用

首先

请求头的字段

响应与请求都需要用到首部字段
首部字段分为:

  1. 通用首部字段: 即请求报文与响应保文都会用到的首部
  2. 请求首部字段: 即请求报文所需要的首部
  3. 响应首部字段: 同理
  4. 实体首部字段: 针对响应与请求报文实体所需要的字段

通用首部字段

通用首部字段 相关的值 作用
Cache-Control no-store no-cache max-age public private 控制强缓存
Date 创建报文时间
Connection keep-alive close 决定当前的事务完成后,是否会关闭网络连接(不可用于HTTP2)

Tips:
Cache-Control中no-cache 与 no-store的 区别

no-store表示强制不进行缓存,每一次请求都要请求服务器获取新资源 no-cache表示资源可以在本地缓存,但是能不能用要问服务器 如果服务器返回304就直接用

max-age

max-ag出现在http1.1 优先级比last-modify要高

请求字段 相关的值 作用
If-modify-since Last-modify的值 协商缓存
If-None-Match Etag的值 协商缓存
TE 传输编码的方式
HOST 服务器的域名

HTTP2.0 VS HTTP 1.0 VS HTTP 1.1

HTTP 2.0

HTTP/2 所有性能增强的核心在于新的二进制分帧层,它定义了如何封装 HTTP 消息并在客户端与服务器之间传输。
传输期间的编码方式变了,HTTP/1.x采用换行符作为纯文本的分隔符,而HTTP/2.0将传输的信息分为更小的消息和帧,并且采用二进制格式进行编码


HTTP/2.0 三个概念

  • 数据流:已建立的连接内的双向字节流,可以承载一条或多条消息。
  • 消息:与逻辑请求或响应消息对应的完整的一系列帧。
  • 帧:HTTP/2 通信的最小单位,每个帧都包含帧头,至少也会标识出当前帧所属的数据流。

概念总结如下:

  • 所有通信都在一个 TCP 连接上完成,此连接可以承载任意数量的双向数据流。
  • 每个数据流都有一个唯一的标识符和可选的优先级信息,用于承载双向消息。
  • 每条消息都是一条逻辑 HTTP 消息(例如请求或响应),包含一个或多个帧。
  • 帧是最小的通信单位,承载着特定类型的数据,例如 HTTP 标头、消息负载等等。 来自不同数据流的帧可以交错发送,然后再根据每个帧头的数据流标识符重新组装。

数据流优先级

服务器推送

服务器发送Push—Promise帧来告诉客户端将要推送什么资源。