BGround / Web-Front-End-Interview

4 stars 0 forks source link

学习图解HTTP4--http1.0/1.1,http2和比http更加Web安全的https #21

Open BGround opened 3 years ago

BGround commented 3 years ago

HTTP的不足

HTTP 主要有这些不足,例举如下。

正式因为HTTP有这些不安全的地方,才催生更加完善的协议

HTTP+加密+认证+完整性保护 = HTTPS

HTTPS并非时应用层的一种新协议。只是HTTP通信接口部分用SSL和TLS协议代替而已。

通常,HTTP 直接和 TCP 通信。当使用 SSL 时,则演变成先和 SSL 通信,再由 SSL 和 TCP 通信了。简言之,所谓 HTTPS,其实就是身披SSL 协议这层外壳的 HTTP。

HTTPS和HTTP的主要区别

  1. 最最重要的区别就是安全性,HTTP 明文传输,http的连接很简单,是无状态的,不对数据进行加密安全性较差。HTTPS (HTTP + SSL / TLS)的数据传输过程是加密的,安全性较好。
  2. 使用 HTTPS 协议需要申请 CA 证书,一般免费证书较少,因而需要一定费用。证书颁发机构如:Symantec、Comodo、DigiCert 和 GlobalSign 等。
  3. HTTP 页面响应速度比 HTTPS 快,这个很好理解,由于加了一层安全层,建立连接的过程更复杂,也要交换更多的数据,难免影响速度。
  4. 由于 HTTPS 是建构在 SSL / TLS 之上的 HTTP 协议,所以,要比 HTTP 更耗费服务器资源。
  5. HTTPS 和 HTTP 使用的是完全不同的连接方式,用的端口也不一样,前者是 443,后者是 80。

上面说到HTTPS比HTTP传输数据更加的安全,而HTTPS解决这个问题的关键就是加密算法,具体就是混合加密算法(对称加密和非对称加密),下面就来学习下加密算法

对称加密算法 简单理解对称加密就是客户端和服务端拥有同样的密钥key,数据使用这个key加密之后再传输,但是有一个致命的问题,那就是既然双方要使用相同的密钥,那就必然要在传输数据之前先由一方把密钥传给另一方,那么在此过程中密钥就很有可能被截获,这样一来加密的数据也会被轻松解密。那如何确保密钥在传输过程中的安全呢?这就要用到非对称加密了。

非对称加密算法 非对称加密,顾名思义,就是加密和解密需要使用两个不同的密钥:公钥(public key)和私钥(private key)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。

HTTPS在传输过程中,客户端先用非对称加密公钥加密密钥key,再发送给服务端,服务端使用私钥解密得到key,之后使用对称加密key进行数据传输

认识SSL和TSL

SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。

  SSL协议提供的服务主要有:

  1)认证用户和服务器,确保数据发送到正确的客户机和服务器;

  2)加密数据以防止数据中途被窃取;

  3)维护数据的完整性,确保数据在传输过程中不被改变。

TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。

HTTPS 数据安全传输中客户端如何验证证书的合法性

  1. 客户端向服务端发起请求之后,服务端会返回数字证书给客户端
  2. 先利用CA签名相同的Hash算法得到证书中的明文信息,得到摘要A
  3. 再利用对应CA公钥解密签名数据,得到摘要B
  4. 对比摘要A和B是否一致,可以判断服务器的合法性

最后贴几篇参考文章:

BGround commented 2 years ago

一、HTTP/1.x

缺陷:线程阻塞,在同一时间,同一域名的请求有一定数量限制,超过限制数目的请求会被阻塞

http1.0

缺陷:浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接(TCP连接的新建成本很高,因为需要客户端和服务器三次握手),服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求; 解决方案:添加头信息——非标准的Connection字段Connection: keep-alive

http1.1

改进点

  1. 持久连接:引入了持久连接,即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive(对于同一个域名,大多数浏览器允许同时建立6个持久连接)
  2. 管道机制:即在同一个TCP连接里面,客户端可以同时发送多个请求。(不过由于各种原因,管线化技术最终被各大厂商放弃了)
  3. 分块传输编码:也就是HTTP/1.1 通过引入 Chunk transfer 机制来解决这个问题,服务器会将数据分割成若干个任意大小的数据块,每个数据块发送时会附上上个数据块的长度,最后使用一个零长度的块作为发送数据完成的标志。这样就提供了对动态内容的支持
  4. 提供虚拟主机的支持:HTTP/1.1 的请求头中增加了 Host 字段,用来表示当前的域名地址,这样服务器就可以根据不同的 Host 值做不同的处理
  5. 新增请求方式
    • PUT:请求服务器存储一个资源;
    • DELETE:请求服务器删除标识的资源;
    • OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求;
    • TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断;
    • CONNECT:保留将来使用

缺点:

  1. 虽然允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的。服务器只有处理完一个请求,才会接着处理下一个请求。如果前面的处理特别慢,后面就会有许多请求排队等着。这将导致“队头堵塞”;
  2. 避免方式:一是减少请求数,二是同时多开持久连接

二、HTTP/2.0

特点:

- 采用二进制格式而非文本格式;
- 完全多路复用,而非有序并阻塞的、只需一个连接即可实现并行;
- 使用报头压缩,降低开销
- 服务器推送

1. 二进制协议

HTTP/1.1 版的头信息肯定是文本(ASCII编码),数据体可以是文本,也可以是二进制。HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为”帧”:头信息帧和数据帧。 二进制协议解析起来更高效、“线上”更紧凑,更重要的是错误更少。

2. 完全多路复用

HTTP/2 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应,这样就避免了”队头堵塞”。

HTTP/2 添加了一个二进制分帧层,那我们就结合图来分析下 HTTP/2 的请求和接收过程。

注意: HTTP1.1到HTTP2解决的是Http层面上的队首阻塞,是同一个长链接上的多个http请求之间的队首阻塞,只有前面的请求完事儿才轮到后面的请求;并不等同于TCP层面的队首阻塞, tcp的队首阻塞是数据包层面的,一个请求被分成有序的多个小的数据包,只有序号靠前的包确认完整接收,后续的包才能被处理;否则就不处理一直等这个包重传。这个机制导致的TCP层面 的队首阻塞。

3. 可以设置请求的优先级

HTTP/2 提供了请求优先级,可以在发送请求时,标上该请求的优先级,这样服务器接收到请求之后,会优先处理优先级高的请求

4. 报头压缩

HTTP 协议是没有状态,导致每次请求都必须附上所有信息。所以,请求的很多头字段都是重复的,比如Cookie,一样的内容每次请求都必须附带,这会浪费很多带宽,也影响速度。 对于相同的头部,不必再通过请求发送,只需发送一次; HTTP/2 对这一点做了优化,引入了头信息压缩机制; 一方面,头信息使用gzip或compress压缩后再发送; 另一方面,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,产生一个索引号,之后就不发送同样字段了,只需发送索引号。

5. 服务器推送

HTTP/2 允许服务器未经请求,主动向客户端发送资源; 通过推送那些服务器任务客户端将会需要的内容到客户端的缓存中,避免往返的延迟

参看链接: 深入理解http1.x、http 2和https HTTP/2.0 原理!与 1.x 相比,到底优化了什么?

BGround commented 2 years ago

三、展望一下HTTP3

前面学习了http1和http2,http中如传输速度等一大堆缺陷得到解决,但是因为使用的是TCP协议,本质上TCP的协议还没有得到解决,具体有哪些呢?

1、TCP的对手阻塞

在 TCP 传输过程中,由于单个数据包的丢失而造成的阻塞称为 TCP 上的队头阻塞。

2、TCP 建立连接的延时

先理解一个概念

网络延迟又称为 RTT(Round Trip Time)。我们把从浏览器发送一个数据包到服务器,再从服务器返回数据包到浏览器的整个往返时间称为 RTT(如下图)。RTT 是反映网络性能的一个重要指标。

所以在数据传输之前,会有TCP的连接延时,HTTPS中还有TLS的连接延时

3、TCP 协议僵化

  1. 中间设备的僵化,像路由器、交换机、NAT、防火墙等,们通常依赖一些很少升级的软件,这些软件使用了大量的 TCP 特性,这些功能被设置之后就很少更新了。
  2. 操作系统也是导致 TCP 协议僵化的另外一个原因。因为 TCP 协议都是通过操作系统内核来实现的,应用程序只能使用不能修改。通常操作系统的更新都滞后于软件的更新,因此要想自由地更新内核中的 TCP 协议也是非常困难的。

QUIC协议

面对使用TCP协议中这些缺陷,HTTP3中开发一个折衷的协议,QUIC协议

参考文章: HTTP/3原理与实践

BGround commented 2 years ago

面试问题

HTTP 1.0/1.1和2.0在并发请求上主要的区别是什么?

HTTP 1.1的长连接和2.0的多路复用有什么区别?

1.1 同一时间同一个TCP连接只能处理一个请求,采用一问一答的形式,上一个请求响应后才能处理下一个请求

追问:听说Chrome浏览器支持最大6个同域请求的并发?

因为chrome支持最大6个TCP连接

2.0 同域名上的所有通信都在单个连接上完成,每个连接上都可以进行交错的进行请求和响应

为什么HTTP 1.1不能实现多路复用?

HTTP2.0是基于二进制的协议,HTTP1.1是基于文本分割解析的协议

1.1的报文解析结构里,服务器需要不断的读入字节,直到遇到换行符,处理的顺序是串行的

GET / HTTP/1.1 Accept: host: referer:

POST

2.0以帧为最小数据单位,每个帧都会有标识自己属于哪个流,多个帧组成一个流 多路复用,其实就是一个TCP连接里面存在多条流

前端代码里有什么方式可以控制最大并发量吗?