当前使用得最为广泛的应用层协议就是 HTTP 了。我想了好久,还是觉得应该把 HTTP 协议写一下。
因为做性能测试分析的人来说,HTTP 协议可能是绕不过去的一个槛。在讲 HTTP 之前,我们得先知道一些基本的信息。
HTTP(HyperText Transfer Protocol,超文本传输协议),显然是规定了传输的规则,但是它并没有规定内容的规则。
HTML(HyperText Marked Language,超文本标记语言),规定的是内容的规则。浏览器之所以能认识传输过来的数据,都是因为浏览器具有相同的解析规则。
希望你先搞清楚这个区别。
我们首先关注一下 HTTP 交互的大体内容。想了很久,画了这么一张图,我觉得它展示了我对 HTTP 协议在交互过程上的理解。
在这张图中,可以看到这些信息:
在交互过程中,数据经过了 Frame、Ethernet、IP、TCP、HTTP 这些层面。不管是发送和接收端,都必须经过这些层。这就意味着,任何每一层出现问题,都会影响 HTTP 传输。
在每次传输中,每一层都会加上自己的头信息。这一点要说重要也重要,说不重要也不重要。重要是因为如果这些头出了问题,非常难定位(在我之前的一个项目中,就曾经出现过 TCP 包头的一个 option 因为 BUG 产生了变化,查了两个星期,一层层抓包,最后才找到原因)。不重要是因为它们基本上不会出什么问题。
HTTP 是请求 - 应答的模式。就是说,有请求,就要有应答。没有应答就是有问题。
客户端接收到所有的内容之后,还要展示。而这个展示的动作,也就是前端的动作。在当前主流的性能测试工具中,都是不模拟前端时间的**,**比如说 JMeter。我们在运行结束后只能看到结果,但是不会有响应的信息。你也可以选择保存响应信息,但这会导致压力机工作负载高,压力基本上也上不去。也正是因为不存这些内容,才让一台机器模拟成千上百的客户端有了可能。
如果你希望能理解这些层的头都是什么,可以直接抓包来看,比如如下示图:
从这个图中,我们就能看到各层的内容都是什么。当然了,这些都属于网络协议的知识范围,如果你有兴趣,可以去看一下《TCP/IP 详解 卷 1:协议》。
我们还是主要来说一说 HTTP 层的内容。同样,我希望通过最简单的示例的方式,给你解释一下 HTTP 的知识,而不是纯讲压力工具,或纯理论。
在我看来,只有实践的操作和理论的结合,才能真正的融会贯通。只讲压力工具而不讲原理,是不可能学会处理复杂问题的;空有理论没有动手能力是不可能解决实际问题的。
由于压力工具并不处理客户端页面解析、渲染等动作,所以,以下内容都是从协议层出发的,不包括前端页面层的部分。
JMeter 脚本
在这里,我写了一个简单的 HTTP GET 请求(由于 HTTP2.0 在市场上还没有普及,所以这里不做特别说明的话,就是 HTTP1.1)。
在前面的文章中,我已经写过了 HTTP GET 和 POST 请求。在这里只解释几个重要信息:
第一个就是 Protocol。
这个当然重要。从“HTTP”这几个字符中,我们就能知道这个协议有什么特点。 HTTP 的特点是建立在 TCP 之上、无连接(TCP 就是它的连接)、无状态(后来加了 Cookies、Session 技术,用 KeepAlive 来维持,也算是有状态吧)、请求 - 响应模式等。
第二个是 Method 的选项 GET。
HTTP 中有多少个 Method 呢?我在这里做个说明。在 RFC 中的 HTTP 相关的定义中(比如 RFC2