HTTP1 和HTTP2、HTTPS、HTTP3

227 阅读4分钟

《HTTP2 in Action》是一本十分不错的书,既没有像《计算机网络》这本书一样将HTTP协议一笔带过,也没有像普通的博客那样只讲协议之间具体的区别,不讲区别的来源或者底层实现原理。而是把HTTP的发展及每一次技术革新做了一个详细的阐述、讲清楚其起因经过结果、进而阐述了HTTP1.0和HTTP2.0的区别。今天读过一二章,暂且做个记录。

HTTP1的问题和特性

原理

HTTP1.x是基于TCP的应用层协议,用于从服务端获取数据。在HTTP设计的初期,采用文本编码的格式进行数据传输。

问题

  1. 队头阻塞:一个请求发送后等待回应后才会发送第二个请求。当有一个请求出现丢包的情况会有队头阻塞的问题。
  2. 安全问题:HTTP1.x是一个文本传输协议,所有文本都是明文传输,网络通道也是未经加密的,可以通过抓包的形式获取到响应的传输数据。

HTTP1.x解决方案

  1. 对于队头阻塞问题,大部分浏览器都采用了复用TCP链接的形式,以chrome为例,一个浏览器可以开6个TCP链接,所有的请求都复用这6个链接,如果有超过6个请求,就需要排队等候空闲的TCP链接。队头问题并没有彻底解决。
  2. 管道化技术:在第一个请求发送之后,立马发送第二个请求,以减少客户端和服务端的等待时间。但是在返回响应的时候,依旧采取队列的方式,先到达的请求先返回,即使后到达的请求已经处理准备好,也不可以先返回。这个方案目前没有浏览器实现。
  3. 通过token、cookie等措施对会话进行安全校验。

HTTPS如何解决安全问题

在HTTPS中,新增了一层SSL加密层对网络中传输的数据进行加密,这是一个处于HTTP和TCP之间的加密层。
在网络安全中,有以下几种加密方法

  1. 数字证书
  2. 对称加密
  3. 非对称加密

HTTPS通过以下步骤建立连接

  1. 建立TCP链接
  2. 客户端申请建立TLS链接,并发送客户端支持的TLS协议版本、加密算法及一个随机数A
  3. 服务端响应客户端,返回:一个随机数B、确认采用的加密算法、一个数字证书
  4. 客户端基于随机数A、B进行生成随机数C,并使用证书中的公钥对随机数C进行加密并发送给服务端,并通过ABC计算出会话密钥。
  5. 服务端用私钥解出随机数C并生成会话密钥
  6. TCP四次挥手关闭链接
TCP三次握手,四次挥手过程
三次握手
  1. 客户端发送建立连接ACK请求
  2. 服务度响应建立连接SYN(如果因为某些原因导致服务端没有响应,客户端会一直重发,直到超时)
  3. 客户端发送SYN+1表示建立成功(服务端发来了滞后的请求建立连接的响应,客户端会直接放弃)
四次挥手

HTTP2如何解决性能问题

总的来说,http2基于TCP协议本身的特质做了一些优化,更加符合TCP协议规范,提升了网络传输效率。
(1)http2采用二进制进行传输,减少了明文解析的过程,所以能够提升效率。
(2)采用多路复用的方式,一个TCP链接上同时发送多个请求,提升TCP链接的利用率:合理利用了二进制的特点,将二进制进行分帧处理,在帧中通过标志位区分每一帧属于哪个流。
(3)http2服务端可以主动向客户端推送消息。
(4)http2可以设置请求的优先级、中断请求。(真正中断,利用帧中的流标志)。AbortController中断是将返回的promise置为reject,在浏览器层面处理,请求实际已经发生。
(5)http2对请求头进行了压缩。

注意:HTTP1.0队头阻塞是因为后面的请求必须等前面的请求返回才可以发送,所以会占用TCP链接,但是HTTP2.0无需等待,所以HTTP2.0的队头阻塞问题不严重,但是如果遇到了占用资源比较大的请求,也会有类似的问题。

HTTP3

http3是一种基于UDP的全新的应用层协议,原理是:在UDP的基础上,将UDP的不可靠加强成可靠的传输,减少了TCP的三次握手来提升传输效率。