网络-http演变

Author Avatar
丁起男 12月 09,2020
  • 在其它设备中阅读本文章

网络-http演变

http/1.1

改进

  • 使用tcp长连接的方式改善了http/1.0段间距造成的性能开销。
  • 支持管道网络传输,只要第一个请求发出去了,不必等其回来,就可以发送第二个出去,可以减少整体的响应时间

缺点

  • 请求/相应header未经压缩就发送,首部信息越多延迟越大。只能压缩body部分
  • 发送冗长的首部。每次相互发送相同的首部造成的浪费较多
  • 服务器是按请求的顺序相应的,如果服务器相应慢,会招致客户端一直请求不到数据,也叫是队头阻塞
  • 没有请求优先级控制
  • 请求只能从客户端开始,服务器只能被动相应

http/2

http/2协议是基于https的,所以http/2的安全性也是有保障的

改进

  • 头部压缩

    http/2会压缩头(header)如果你同时发出多个请求,他们的头是一样的或相似的,那么,协议会帮你消除重复的部分

    这就是所谓的hpack算法:在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,上传一个索引号,以后就不发送统一字段来,只发送索引号,这就提高了速度

  • 二进制格式

    http/2不再像http/1.1里的纯文本形式的报文,二十全面采用了二进制格式,头信息和数据体都是二进制,并且统称为帧(frame):头信息帧和数据帧

    虽然对人不友好,但是对计算机非常友好,因为计算机只懂二进制,那么收到报文后,无需再将名文的报文转成二进制,而是直接解析二进制报文,这增加了数据传输的效率

  • 数据流

    http/2的数据包部署按顺序发送的,同一个连接里连续的数据包,可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应

    每个请求或回应的所有数据包,成为一个数据流(stream)。每个数据流都标记着一个独一无二的编号, 其中规定客户端发出的数据流编号为奇数,服务器发出的数据流为偶数

    客户端还可以指定数据流的优先级。优先级高的请求,服务器就先响应请求

  • 多路复用

    http/2可以在一个连接中并发多个请求或回应,而不用按照顺序一一对应

    移除了http/1.1中的串行请求,不需要排队等待,也叫不会再出现队头阻塞问题,降低了延迟,大幅提高了连接的利用率

  • 服务器推送

    http/2还在一定程度上改善了传统的请求-应答工作模式,服务不再是被动的响应,也可以主动想客户端发送消息

缺点

http/2主要的问题 在于,多个http请求在复用一个tcp连接,下层的tcp协议是不知道有多少个http请求的。所以一旦发生了丢包现象,就会触发tcp的重传机制,这样在一个tcp连接中所有的http请求都必须等待这个丢了的包被重传回来

http/3

改进

  • http/1.1中的管道传输中如果有一个请求阻塞了,那么队列后请求也统统被阻塞住
  • http/2多个请求复用一个tcp连接,一旦发生丢包,就会阻塞所有的http请求

这都是基于tcp传输层的问题,所有http/3把http下层的tcp协议改成了udp

udp发生是不管顺序,也不管丢包的,所有不会出现http/1.1的队头阻塞和http/2的丢包全部重传问题

QUIC

udp是不可靠传输的,但是基于udp的quic协议可以实现类似tcp的可靠性传输

  • quic有自己的一套机制可以保证传输的可靠性。当某个流发生丢包时,只会阻塞这个流,其他流不会收到影响
  • tls3升级了最新的1.3版本,头部压缩算法也升级成了qpack
  • https要建立一个连接,要花费6次交互,先是建立三次握手,然后是tls/1.3的三次握手。quic直接把以往的tcp和tls/1.3的6次交互合并成了3次,减少了交互次数

所以,quic是一个在udp之上的伪tcp+tls+http/2的多路复用协议

quic是新协议,对于很多网络设备,根本不知道什么是quic,只会当做udp,这样会出现新的问题。所以http/3现在普及的进度非常缓慢