HTTP 的演变与改进

128 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

HTTP1.1

HTTP1.1相对于HTTP1.0性能上的改进

  1. 使用TCP长连接,改善短连接造成的性能开销
  2. 支持管道进行网络传输

瓶颈:

  1. 首部冗长,每次发送相同的首部浪费较多
  2. 服务器按请求的顺序响应,如果服务器响应慢,会招致客户端一直请求不到数据,也就是队头阻塞
  3. 没有请求优先级控制
  4. 请求只能从客户端开始,服务器被动响应

HTTP2

针对这些问题HTTP2做了优化

  1. 头部进行压缩,如果同时发送多个请求,头部相似,那么协议帮你消除重复的部分(HPACK算法:客户端和服务端同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样的字段,值发送索引号)
  2. 二进制格式:不采用纯文本形式的保温,采用二进制格式,头信息和数据都是二进制,并且统称为帧(头信息帧和数据帧),这样无需将明文的报文转成二进制,而实直接解析二进制报文,增加了数据传输的效率
  3. 同一连接里面连续的数据包,可能属于不同的回应,所以需要对数据包做标记,指出它属于哪个回应。每一个请求或者回应的所有数据包,称为一个数据流。每个数据流都标记着一个独一无二的编号,奇数指的是客户端发出数据流,偶数为服务器发出的数据流。客户端可以指定数据流的优先级,优先级高的先响应
  4. 多路复用:移除了HTTP1.1的串行请求,避免了队头阻塞,降低了延迟,大幅度提高了连接的利用率
  5. 服务器推送:改善了传统的请求-应答工作模式,主动向客户端发送消息,举例来说就是浏览器刚请求HTML的时候,提前把可能用到的JS、CSS文件等静态资源主动发送给客户端,减少延时的等待。

问题

容易出现丢包现象:多个HTTP请求复用一个TCP连接,下层的TCP协议不知道有多少个HTTP请求。

一旦出现丢包问题,就会触发TCP的重传机制,这样在一个TCP连接里的所有请求就必须等这个丢了的包被重传回来

也就是说

  1. HTTP1.1中的管道传输如果有一个请求阻塞,队列后的请求被阻塞
  2. HTTP2多个请求复用一个TCP连接,一旦丢包,就会阻塞所有HTTP请求

HTTP3

把TCP协议改成UDP

基于UDP的QUIC协议可以实现类似TCP的可靠性传输