0.9
、1.0
、1.1
三个版本,我们目前上网使用最广泛的是http/1.1
协议,发布于1997年,距今已经20多年了,至今仍然是访问网站的主流协议(真是老而弥坚啊)。http/1.1的报文格式如下:request报文
response报文
HTTP/1.1的问题
http协议早期为互联网的普及做出了巨大的贡献,构建了现代互联网的基础架构,但是由于协议制定的时间较早,在很多方面还是有着局限性,在互联网高速发展,信息爆炸的今天,难免有些捉襟见肘。主要体现在以下几个方面:
- 传输报文为ascii文本形式,对于http header不会进行压缩。这样对于可读性是比较友好,但对于计算机不太友好,此外传输效率较低
- 请求只能由客户端发起,不能由服务端发起。这种模式限制了一些主动推送或者有双工需求的使用场景,当然也有比如websocket之类的解决方案,但那严格来说已经不属于http协议的范畴了。
- 同步阻塞通讯:其实在http/1.1中已经默认使用了持久连接(persistent connection),可以做到多个请求复用同一个tcp连接,同时利用管道机制(pipelining),可以让请求同时在一个tcp连接上发送,但是http本质上还是一个
请求/响应
模型,服务端仍然需要按照请求的顺序依次回复,不能乱序回复。这样要是前面的回应特别慢,后面就会有许多请求排队等着。这称为"队头堵塞"(Head-of-line blocking)。 - 由于队头堵塞问题的存在,在客户端要下载大量资源的情况下,不得不和服务器建立多个TCP连接(大部分浏览器允许最多建立6个和指定服务器的持久连接),达到并发传输的效果,而众所周知,建立和销毁tcp连接的成本是非常高昂的(如果是https就更高),同时也增加了服务端的资源消耗。
基于以上的这些痛点,催生出了http/2。
HTTP/2
SPDY
http/2起源于谷歌的SPDY项目(没错,又是谷歌-_-),于 2009 年年中发布,其主要目标是通过解决 HTTP/1.1 中广为人知的一些性能限制来减少网页的加载延迟(那些广为人知的限制我在上面都提到了)。具体来说,这个项目设定的目标如下:
- 页面加载时间 (PLT) 减少 50%。
- 无需网站作者修改任何内容。
- 将部署复杂性降至最低,无需变更网络基础设施。
- 与开源社区合作开发这个新协议。
- 收集真实性能数据,验证这个实验性协议是否有效。
到了2012 年,这个新的实验性协议得到了 Chrome、Firefox 和 Opera 的支持,越来越多的大型网站(如 Google、Twitter、Facebook)和小型网站开始在其基础设施内部署 SPDY。事实上,在被行业越来越多的采用之后,SPDY 已经具备了成为一个标准的条件。
观察到这一趋势后,HTTP 工作组 (HTTP-WG) 将这一工作提上议事日程,吸取 SPDY 的经验教训,并在此基础上制定了官方“HTTP/2”标准。在拟定宣言草案、向社会征集 HTTP/2 建议并经过内部讨论之后,HTTP-WG 决定将 SPDY 规范作为新 HTTP/2 协议的基础。2015 年初,IESG 审阅了新的 HTTP/2 标准并批准发布。
2、HTTP2的压力测试关注点
现网中已经存在大量的基于HTTP2协议的WEB服务,对于HTTP2协议,浏览器访问web服务存在较大的差异,主要体现在相同的并发量的情况下,WEB服务会受到突发性HTTP请求的冲击。主要原因是对于浏览器访问一个页面,HTTP/1.1协议,浏览器最并发量控制在6个以内。但对于HTTP2的请求最高并量几乎没有限制,如下所示。
要对支持HTTP2协议的网站进行压力测试,必须是基于HTTP/2协议的请求并发(一般支持HTTP2协议的WEB服务,都会同时支持HTTP/1.1,与客户端之间建立链接时,必须进行握手,互方协商需要使用的协议,如果测试工具不支持HTTP/2协议,下发HTTP/1.1的协议请求,WEB服务器也可以正常提供服务,这时测试的结果就不是你想要的结果)。
要想证明性能测试工具下的HTTP协议是HTTP/1.1还是HTTP2,可以通过抓包工具抓取server heloo的报文进行确认。如下所示:server hello报文中的ALPN Next Protocol:h2 ,是判断发送HTTP请求协议版本的重要判断依据。
3、支持HTTP2协议的压力测试工具
国内常用的Jmeter,LoadRunner 12性能测试工具,这两个均不支持HTTP2协议的请求。下图是通过LR 12.55导入chrome HAR包,发送HTTP请求的抓包图。报文中没有ALPN Next Protocol:h2的关键字(LR 没有采用ie录制脚本的原因是ie不支持HTTP/2)。目前国内阿里PTS,腾讯WeTest,华为CPTS均不支持HTTP2协议。本文采用奇林软件kylinTOP
4、HTTP2压力测试
4.1、录制脚本
本次以脚本录制网站案采用:https://www.ustc.edu.cn/ (中国科学技术大学官网)
打开HTTP2开关,点击确认,弹出如下对话框,输入要录制的URL
录制生成如下脚本
调试脚本
调试过程可以看到HTTP请求的瀑布图,几科所有HTTP请求都是同时并发。目前kylinTOP工具在处理HTTP/2协议的HTTP的请求并发模型依据请求的父子关系,按照一定的算法进行并发。从并法的瀑布图看,与HTTP2协议的标准相一致(HTTP2标准并发是按照尽可能的并发,除非两个请求有依赖关系。最高并发可以达到300都有可能)。