0%

HTTP的演进

文章 https://zhuanlan.zhihu.com/p/111716047 Part5 学习笔记
视频科普:https://www.bilibili.com/video/BV1vv4y1U77y

1.0→1.1

  1. 使用TCP长连接,改善了短链接的性能开销

  2. 因为有了长连接,进而支持管道传输,不用等待响应回来,就可以立马发下一个请求(类似消息队列)

    由于是按顺序处理,所以会有队头阻塞问题:若前面的请求处理过慢,后面的请求就要一直等着

1.1→2.0

  1. 可以压缩首部,之前只能压缩主体(body)

  2. 如果多个请求的首部相同,会自动消除重复部分

    以上两点使用HPack头部压缩算法实现,C/S同时维护一张头信息表,所有字段都会存入该表,之后只用发送对应字段的索引

  3. 全面采用二进制格式,节省了明文与二进制的转换开销

.image-20220316221315081

  1. 客户端可以指定数据流的优先级,所以数据流不是按顺序发送的,所以必须编号(客户端的为奇数,服务器的为偶数)

.image-20220316221936517

  1. 多路复用,解决了1.1的队头阻塞问题,并发处理请求

    Eg: 处理A→回应A已经处理好的部分→处理B→回应B→继续处理A

  2. 服务器也可以主动发起请求,叫做服务器推送

仍存在的问题:多个HTTP请求复用一个TCP连接,⼀旦发⽣了丢包现象,就会触发TCP的重传机制,这个TCP连接中的所有 HTTP请求都必须等待这个丢了的包被重传回来

2.0→3.0

  1. HTTP/3.0直接把下层的TCP改为了UDP

    UDP不管顺序,也不管丢包,所以不会发生1.1的队头阻塞问题和2.0的丢包重传等待问题

  2. 使用基于UDP的QUIC协议可以实现可靠传输

    当某个流发生丢失时,只会阻塞对应的流,其他流不受影响

  3. TLS由1.2升级为1.3

    TLS/1.3只需三次握手,2RTT降为1RTT

    .image-20220317105324247

  4. HPack升级为QPack

    .image-20220316233626581

  5. QUIC把HTTPS的6次握手(3次TCP+3次TLS/1.3)合并为3次

.image-20220316233454045