风静夜

风静夜

HTTP1.x&HTTP2的差异

HTTP1.x&HTTP2的差异

吴彦祖:HTTP2解决了HTTP1.x的哪些问题?

  • 解决了HTTP1.x的痛点:

    • TCP的慢启动:慢启动是 TCP 为了减少网络拥塞的一种策略,我们无法改变,但是HTTP1.x支持建立多个TCP连接,每次都要经历慢启动的阶段。这样就会对初次渲染页面的时长造成问题。

    • 多个TCP连接之间会竞争带宽TCP连接之间不能协商带宽,会导致传输HTML、css、JavaScript文件的带宽被一些图片等优先度低的TCP连接影响。

    • HTTP1.x的队头阻塞问题。在http1.x中,一个TCP的长连接中,只能在同一时刻处理一个请求,在当前的请求没有响应时,会阻塞其他请求的传输。

  • 如何解决这些痛点:

    • 关于TCP的慢启动和竞争带宽问题:HTTP2的思路就是,一个域名只使用一个TCP长连接来传输数据。这样一个页面加载的过程只需要进行一次慢启动过程,而且也避免了多个TCP连接竞争带宽的问题。
    • 使用多路复用解决队头阻塞问题。通过多路复用,可以实现客户端不用等待服务端响应,一次发送多个请求,服务端收到请求后,会根据自己的配置,从优先度高的请求开始响应。之所以可以乱序发送响应数据,是因为每个数据都会携带自己的ID,浏览器接收到响应数据后会根据ID拼接成完整的http响应数据。

吴彦祖:多路复用是如何实现的

  • http2添加了一个二进制分帧层,在请求行、请求头、请求体经过二进制分帧层的处理后会被转换为一个个带有请求 ID 编号的帧,发送给服务器。

  • 服务器接收到这些帧后,会将所有具有相同请求ID编号的帧合并为一个完整的请求信息。

  • 服务器处理完请求后,会将响应行、响应头、响应体经过二进制分帧层处理后转换成一个个带有请求ID编号的帧,发送给客户端。

  • 客户端浏览器接收到这些帧后,会将所有带有相同请求ID编号的帧合并为响应内容并作为对应ID请求的响应。