深入浅出:HTTP/2 (2)

于是,HTTP/2 连接的两端都知道已经发送了哪些首部,这些首部的值是什么,从而可以针对之前的数据只编码发送差异数据,具体如下图所示。

深入浅出:HTTP/2

请求与响应首部的定义在HTTP/2 中基本没有改变,只是所有首部键必须全部小写,而且请求行要独立为:method 、:scheme 、:host 和:path 这些键-值对。

在前面的例子中,第二个请求只需要发送变化了的路径首部(:path ),其他首部没有变化,不用再发送了。这样就可以避免传输冗余的首部,从而显著减少每个请求的开销。

通信期间几乎不会改变的通用键-值对(用户代理、可接受的媒体类型,等等)只需发送一次。事实上,如果请求中不包含首部(例如对同一资源的轮询请求),那么首部开销就是零字节。此时所有首部都自动使用之前请求发送的首部!

二进制帧

头部数据压缩之后,HTTP/2 就要把报文拆成二进制的帧准备发送。

HTTP/2 的帧结构有点类似 TCP 的段或者 TLS 里的记录,但报头很小,只有 9 字节,非常地节省(可以对比一下 TCP 头,它最少是 20 个字节)。

二进制的格式也保证了不会有歧义,而且使用位运算能够非常简单高效地解析。

深入浅出:HTTP/2

帧开头是 3 个字节的长度(但不包括头的 9 个字节),默认上限是 2^14,最大是 2^24,也就是说 HTTP/2 的帧通常不超过 16K,最大是 16M。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssjxp.html