Skip to content

HTTP1x和HTTP2.x

HTTP1.x

数据格式

HTTP1.x基于文本传输

  • 请求行
  • 请求头
  • 请求体

image.png

image.png

缺点

  1. 占用字节:在HTTP请求中,包含很多空格和换行符。

  2. 头部不能压缩:在HTTP1.x中,请求头不能压缩。所以存在请求头比较大的问题,出现大头儿子。

    可以在请求头中指定请求体的压缩算法。但是无法指定请求头的。

  3. 传输效率低:同一个链接(Keep-Alive的情况)同时只能处理一个请求,收到响应才会开始发送下一个请求。

    • 如果不设置 Keep-Alive,则每一次HTTP请求都会新建一个TCP链接。

    为提高效率,浏览器等应用层软件会选择同时与服务器建立多个TCP链接(一般上限是6个)。

浏览器的域名限制

在Http1.x中,浏览器客户端在同一时间,针对同一域名下的请求有一定数量限制,而超过限制数目的请求会被阻塞。

比如Chrome3 对 HTTP1.1 的限制是 4个。

image.png

HTTP2.x

长连接

  • HTTP1.0:基本上都是短连接,每个请求响应完成后立即关闭连接。
  • HTTP2.0:支持长连接,即一个TCP连接可以承载多个请求和响应,减少了连接的建立和关闭次数,提高了性能。

帧是HTTP/2通信的最小单位。

  • 二进制,计算机传输效率高。

  • 帧都有边界。

  • 基于流发送。

    一次请求可以分为多个帧,HEADERS和DATA。在接收端组合。

HTTP/2 采用二进制传输数据,而非文本格式,大大提高了传输效率。引入了流控制和帧压缩等机制,进一步提升了数据传输的性能。

流控制

在HTTP/2的数据格式里面,按帧划分。

每个帧的格式如下:

  • 帧长度:标识当前帧实际传输的数据大小。
  • 帧类型
    • 数据帧:HEADERS和DATAS,用来传输请求头和请求体。
    • 控制帧:PING、SETTINGS,用来管理的。
  • 标志位:标识当前帧是请求的最后一帧。

image.png

客户端在一个TCP连接上,可以并发的给服务端同时发送多个帧,比如同时发送多个HEADERS帧(请求头),多个DATA 帧(请求体)。每个帧有自己的 StreamID。

而服务端接受的时候会按照 StreamID 组合在一起处理单次请求。

头部压缩问题

HTTP 1.1请求的大小变得越来越大,有时甚至会大于TCP窗口的初始大小,因为它们需要等待带着ACK的响应回来以后才能继续被发送。

HTTP/2对消息头采用HPACK(专为HTTP/2头部设计的压缩格式)进行压缩传输,能够节省消息头占用的网络的流量。

而HTTP/1.x每次请求,都会携带大量冗余头信息,浪费了很多带宽资源。像cookie这些信息,每个请求都会附带,产生了很多不必要的资源消耗。为了减少这块的资源消耗并提升性能, HTTP/2对这些首部采取了压缩策略:

传输问题-多路复用

HTTP2.0采用多路复用,将多个资源请求同时发给同一个TCP连接,实现单个连接并发发送请求

  • HTTP2.0用一条长链接,能实现并发处理请求。

    避免了重复创建TCP连接带来的网络问题,同时还能够提高吞吐效率。

由于浏览器限制的原因,HTTP1.x的吞吐率不会太高。而HTTP2.0引入了多路复用后,能够将吞吐率提高数量级增长。

image.png

滑动窗口问题

TCP滑动窗口是由发送者和接受者来控制,能限制发送者的发送速率。窗口大小会根据数据大小进行动态调整。

  • HTTP1.x的请求一般都是短链接,复用率很低。刚创建的TCP连接的滑动窗口一般会很小(慢启动),由于复用率低,窗口大小一般都不会过度增长,导致发送速率会收到限制。
  • 而 HTTP2.x 基于同一个连接采用多路复用,在请求数据不断发送成功的情况,滑动窗口大小会逐渐增大,进而提高发送效率。

数据格式

  • HEADERS帧
  • DATA帧

image.png

image.png

在客户端和服务器交互时,可以将帧并发发送,在服务器端组合。

每个帧都带有请求ID,根据请求ID即可组合为单次请求详情。

帧格式

image.png