HTTP2离我们有多远 技术探讨

 

HTTP1.1已经快20岁了,可谓是老当益壮,然而HTTP2也不容小视的。...



HTTP1.1已经快20岁了,可谓是老当益壮。然而HTTP2也不容小视,过去一年以来,对HTTP2的支持已经或即将广泛出现在浏览器、Web服务器、商用代理以及各主要内容交付网络当中。



我们先看看浏览器是如何将网站内容呈现给我们的

►地址栏上输入网址,回车

►浏览器将网址解析成IP地址

►浏览器通过IP地址和端口与服务器建立TCP连接

►浏览器将请求发给服务器

►服务器处理请求生产响应报文

►服务器将相应报文发回给浏览器

►浏览器解析报文,并将结果呈现

那么浏览器如何告诉服务器要请求的内容,服务器如何生存响应报文,如何区分正常响应,异常情况,以及跳转等响应内容。浏览器收到服务器的响应报文又是如何解析的?这些都是HTTP协议所规定的内容,HTTP协议就是用于统一服务器和客户端的请求应答的标准



从1997年获得批准,HTTP1.1已经快20岁了,这让我们不得不赞一句“老当益壮”,然而在现代网络时代下HTTP1.1是存在无法应对的某些性能难题

HTTP1.1性能问题

HTTP1.1中每个请求/响应都要独占用一个TCP连接。而通常一个网页通常包含HTML文本、CSS、JS、图片等多个文件请求,需要等前一个请求完成后才能继续下一个请求,导致页面加载缓慢。

后来HTTP1.1修订版中取消限制建立TCP连接的数量,访问一个网站浏览器可以起数个TCP连接进行访问,这会加快请求速度,但是建立TCP连接很耗费资源。如果没有限制TCP连接数的话服务器资源很容易就被耗尽。现代浏览器一般允许同域名并发6~8个连接。

另外一个解决思路是合并资源。如多个CSS合并成一个文件,JS、多张图片拼接在一起等。但是这个治标不治本,而且就算只需要小部分资源也需要将整个文件加载下来,同样也会耗费服务器资源。

采用HTTP管道。复用一个TCP连接,浏览器不用等请求响应,一股脑把请求都发给服务端,然后等着接受响应就可以了。服务端收到请求后,需要按照顺序处理,如果一个请求很占用时间的话,那么后面的请求都会被阻塞,或者请求过程中网络中断则需要重新发起所有请求浪费服务端资源。



HTTP2

首先HTTP2沿用HTTP1.1的语义部分,例如请求方法、响应状态码、URI 以及头部字段等核心概念依旧存在,这样就很容易从HTTP1.1过度到HTTP2协议。

HTTP2 最大的变化是重新定义了格式化和传输数据的方式,这是通过在高层 HTTP API 和低层 TCP 连接中引入二进制分帧层来实现。

HTTP2中引入了二进制编码方式,将报文分割成一个报文头帧和多个数据帧,有固定的帧格式。同时采用的双向的字节流进行传输数据,多个流可以在一个TCP连接上进行交换消息,同时将报文分割成多个帧,每个帧关联一个流,每个报文的帧可以乱序发送,接收端可以根据帧的标识进行组装。这样对报文的解析和差错处理都变得比较容易,可以参考TCP/IP协议进行理解。

HTTP2帧中包含优先级的字段,即当资源有限的时候,服务器会根据优先级来选择应该先发送哪些流。同时根据依赖关系也容易建立一个优先级树。

HTTP2对头部进行压缩可以有效地减少报文的大小,降低传输数据量。采用静/动态数据字典,对于静态数据字典中有的头部信息则直接传送数据字典项,否则动态地在连接上维护一个动态数据字典。对于没法加到数据字典的数据则采用哈夫曼压缩。

HTTP2提供了服务端主动推送资源的方法,一个客户端请求资源X,而服务器知道它很可能也需要资源Z的情况下,服务器可以在客户端发送请求前,主动将资源Z推送给客户端。

HTTP2提供了流量控制窗口,因为一个连接中会有多个流进行竞争带宽。此时与TCP流量控制相似,采用流量控制窗口的方法进行控制。



总结

虽然HTTP2有多种优化手段,但大多数用户并不在乎所访问站点到底使用哪种应用协议,他们只希望获得与预期相符的速度表现与使用体验。

尽管如此,HTTP2的普及态势仍然一路向好,目前顶级站点中使用HTTP2的比例正不断提升。对于HTTP2的具体实现案例我们将继续钻研与探讨,也欢迎您的加入!

想了解更多?
那就赶紧来关注我们


长按二维码 关注我们


    关注 脑壳细胞


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册