深入浅出:HTTP/2
上篇文章深入浅出:5G和HTTP里给自己挖了一根深坑,说是要写一篇关于HTTP/2的文章,今天来还账了。 本文分为以下几个部分: HTTP/2的背景 HTTP/2的特点 HTTP/2的协议分析 HTTP/2的支持 HTTP/2简介 HTTP/2主要是为了解决现HTTP 1.1性能不好的问题才出现的。当初Google为了提高HTTP性能,做出了SPDY,它就是HTTP/2的前身,后来也发展成为HTTP/2的标准。 HTTP/2兼容HTTP 1.1,例如HTTP Method,Status code,URI以及大部分Header Fields。 HTTP/2通过以下方法减少latency,用来改进页面加载的速度, HTTP Header的压缩,采用的是HPack算法。 HTTP/2的Server Push,非常重要的一个特性。 请求的pipeline。 修复在HTTP 1.x的队头阻塞问题。 在单个TCP连接里多工复用请求。 HTTP/2支持HTTP 1.1里的大部分use case,例如桌面浏览器、移动浏览器、Web API、Web Server、代理服务器、反向代理服务器、防火墙和CDN等。 HTTP/2 头部压缩(HPack) HPack是HTTP/2 里HTTP头压缩的算法,具体可以参看https://tools.ietf.org/html/rfc7541。下面简单介绍一下HPack是如何工作的。 见下图,该图来自Google 的性能专家 Ilya Grigorik 的文章HTTP/2 is here, let’s optimize!,它非常直观地描述了 HTTP/2 中头部压缩的原理: 简单说,HTTP头压缩需要在HTTP/2 Client和服务端之间: 维护一份相同的静态表(Static Table),包含常见的头部名称,以及特别常见的头部名称与值的组合; 维护一份相同的动态表(Dynamic Table),可以动态地添加内容; 基于静态哈夫曼码表的哈夫曼编码(Huffman Coding); 在HTTP头里,有些key:value是固定,例如: :method: GET :scheme: