《全栈性能测试修炼宝典JMeter实战》第12章学习笔记-HTTP协议

12.1 HTTP协议简介

  HTTP(HyperText Transfer Protocol)协议,即超文本传输协议。所谓协议,就是指计算机网络中进行数据交换而建立的规则、标准或约束的集合。简单来说,就是协议定义了两台计算机之间的通信规则,通过协议,就可以达到相互通信的目的。作为万维网上应用最广泛的协议,HTTP协议的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的成果。

12.1.1 HTTP的发展历史1

1、HTTP/0.9版本 :第一个定稿的HTTP协议,这个版本的内容非常的简单。

  • 只有一个命令GET
  • 没有HEADER等描述数据的信息
  • 服务器发送完内容之后,就关闭TCP连接

2、HTTP/1.0版本 :这个版本是在HTTP/0.9版本的基础上进行了改进,和现在普遍使用的HTTP/1.1差不多。

  • 增加了很多命令。比如:POST、PUT、HEADER这些命令。
  • 增加了status code和header相关的内容。status code是用来描述服务器端处理某一个请求之后的状态的。
  • 增加了多字符集支持、多部分发送、权限、缓存等相关的内容

3、HTTP/1.1版本 :这个版本是在HTTP/1.0的基础上增加了一些功能来优化网络连接的过程。

  • 在这个版本支持了持久连接 。建立一次TCP连接后,不关闭,新的http请求可以一直在这个连接里面进行数据发送。
  • 增加了pipeline。可以在同一个TCP连接里面发送多个http请求。但是服务器端对于进来的请求,是要按照顺序进行数据返回的。
  • 增加了HTTP的头host和其他一些命令。有了host之后就可以在同一台服务器(物理服务器)上同时跑多个web服务。

4、HTTP/2版本

  • 所有数据都是以二进制进行传输的。在HTTP/1.1里面大部分的数据传输是通过字符串,所以数据的分片方式是不太一样的。在HTTP/2里面所有的数据都是以帧进行传输的。
  • 并行处理同一个连接里的请求。同一个连接里面发送多个请求时,服务器端不再需要按照顺序来返回处理后的数据了。
  • 新增头信息压缩以及推送等功能,提高了传输效率。

12.1.2 HTTP协议的主要特点

  1. 简单:客户向服务器请求服务时,只需传送请求方法和路径。
  2. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
  3. 无状态:HTTP协议是无状态协议。无状态是指Web浏览器和Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后Web服务器返回响应(response),连接就被关闭了,在服务器端不保留连接的有关信息。

12.2 HTTP的工作原理

12.2.1 HTTP协议在TCP/IP协议簇中的位置

  在Internet中所有的传输都是通过TCP/IP进行的,HTTP协议作为TCP/IP模型中应用层的协议也不例外,通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。HTTP在网络中的层次如下图所示:

应用层(HTTP/HTTPS)
传输层(TCP)
网络层(IP)
数据链路层

  通常情况下,HTTP的保留端口是80,HTTPS的端口号是443。

12.2.2 HTTP的工作原理

  从上面可知,HTTP是基于传输层的TCP协议,而TCP是一个端到端的面向连接的协议。所谓的端到端可以理解为进程到进程之间的通信。所以HTTP在开始传输之前,首先需要建立TCP连接,而TCP的连接过程需要所谓的“三次握手”。在TCP三次握手之后,建立了TCP连接,此时HTTP就可以进行传输了。
  下面通过一个例子来简单了解HTTP协议的通信过程。利用Wireshark工具, 访问http://www.cr173.com页面对其进行一次捕捉,可以清楚的看到一个网页访问的全过程,如下图所示(其中客户端的IP为:10.134.51.2,服务端的IP为:49.7.21.45)。
在这里插入图片描述
  客户端浏览器向服务端发起一个TCP连接请求,状态为SYN;
  然后服务端向客户端浏览器做出回应,并要求确认,Seq=0,Ack=1;
  客户端浏览器收到信息后,同样做出回应,并确认,此时Seq=1,Ack=1,TCP三次握手成功;
  客户端浏览器向服务端发一起一个页面HTTP请求;
  服务器向客户端浏览器发送数据及状态响应码200。

12.3 HTTP请求

  了解了浏览器和服务器是如何建立起连接,接下来要弄清楚HTTP协议是如何传输内容的。在HTTP的请求报文中,主要由3个部分构成:

  • 请求行 (请求方法+请求网址+协议版本)
  • 请求头
  • 请求正文

  下面举个例子说明:
  在这里插入图片描述
  上面是一个典型的HTTP请求报文,第一行为请求行:
  在这里插入图片描述
  请求行写法是固定的,由三部分组成。第一部分是请求方法,第二部分是请求网址,第三部分是HTTP协议版本。“GET”表示请求方法,在HTTP/1.1协议中,一共有7种方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TRACE。其中最常用的就是GET和POST。“/”表示访问URL的根目录,这里也可以是HOST所在URL下的其他相对路径。“HTTP/1.1”表示协议及对应的版本,现在主流的是1.1。
  从第二行开始到结束都是请求头,通常也称为头域。每一个头域由一个域名,冒号(:)和域值3部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符。下面介绍一些常用的头域。
  在这里插入图片描述
  HOST头域指定请求资源的Internet主机和端口号,必须表示请求URL的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。
  在这里插入图片描述

  User-Agent标识请求者的一些信息,如浏览器的类型和版本、操作系统等。从本例的内容可知,客户使用的是Chrome/87.0.4280.88 版本的浏览器,基于Windows 10 64位的操作系统。这里的信息通常用来做数据收集,可以分析用户常用什么浏览器访问我们的服务。
  在这里插入图片描述
  Accept用于指定客户端接收哪些类型的响应内容,也是能够在客户浏览器中直接打开的格式。
  在这里插入图片描述
  Accept-Language:客户端的操作系统语言,我们通常情况下使用的中文操作系统,这个属性值一般是zh-cn。
  在这里插入图片描述
  Connection:表示当client和server通信时,对于长连接如何进行处理,在HTTP/1.1中,client和server都是默认对方支持长连接的,如果client使用HTTP/1.1协议,但又不希望使用长连接,则需要在header中指明connection的值为close;如果server方也不想支持长连接,则在response中也需要明确说明connection的值为close。不论request还是response的header中包含了值为close的connection,都表明当前正在使用的TCP连接在当前请求处理完毕后会被断掉。以后client再进行新的请求时就必须创建新的TCP连接了。
  还有一些常见的头域内容如:Date、Proxy、Cache-Control、Cookies等。
  由于上面的例子是个GET请求,通常没有请求正文,我们通过一个POST请求来看看请求正文(直接贴的书上原图):
  在这里插入图片描述
  上面示例中的方框部分就是请求正文了,通常情况下对应的就是POST提交的内容信息。

12.4 HTTP应答

HTTP应答报文与请求报文相类似,也是由三部分构成的:

  • 应答行
  • 应答头
  • 应答正文

我们通过上面请求的应答报文来做说明:
  在这里插入图片描述
  在这里插入图片描述
  应答行,类似于HTTP请求行,它表示通信协议用的是HTTP/1.1版本,“200”表示服务器已经成功地处理了客户端发出的请求。以下是常见的HTTP请求应答返回码列表:

200 OK 请求成功。一般用于GET和POST请求
300 Multiple Choices 多种选择。请求的资源可包括多个位置,响应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302 Found 临时移动。与301类似,但资源只是临时被移动,客户端应继续使用原有URI
400 Bad Request 客户端请求的语法错误,服务器无法理解
401 Unauthorized 请求要求用户的身份认证
402 Payment Required 保留,将来使用
403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置“您所请求的资源无法找到”的个性页面
405 Method Not Allowed 客户端请求中的方法被禁止
500 Internal Server Error 服务器内部错误,无法完成请求
501 Not Implemented 服务器不支持请求的功能,无法完成请求
502 Bad Gateway 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求
503 Service Unavailable 第由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求
505 HTTP Version not supported 服务器不支持请求的HTTP协议版本,无法完成处理

  应答头的内容与请求头也类似,几个需要注意的头域如下:
  在这里插入图片描述
  表示返回的内容是基于HTML格式的页面信息。
  在这里插入图片描述
  表示返回的正文长度,确保页面传输的内容正确。
  当我们访问一个页面时,不是只发送一个HTTP请求。通常情况下,我们看到的一个完整的Web界面,是由多个HTTP请求共同完成的。一般情况下,在浏览器对HTML解析的过程中,如果发现需要获取的内容(如CSS、GIF、PNG等),会再次发起HTTP请求去服务器获取,但只靠一个TCP连接就够了,这就是所谓的持久连接

12.5 HTTP捕获

  目前捕获网络上传输的HTTP协议内容的主流工具有下面这些:
  Wireshark:Windows下最常用的网络抓包工具,使用简单方便,上面的例子中使用的就是这款工具。但是此工具捕获的包通常都是十六进制的,不便于我们后期性能测试过程中对HTTP协议的传输内容进行二次加工。
  Firefox下的Firebug:可以清楚的看到每个页面传输的内容,页面构成,使用也比较简单,在Firefox下工具-附件组件中搜索Firebug组件并安装即可(新版本的浏览器不支持附加组件安装了,大家可以自己下载安装)。
  Chrome不需要安装任何组件,直接按ctrl+shift+I组合键或者右键-检查,就可以调出相关的工具进行查看HTTP协议的请求内容,效果如下图所示:
  在这里插入图片描述
  IE下也有个工具Http Watch,在下面的章节中将重点介绍此工具,并利用此工具进行简单的页面前端性能分析。

12.6 Http Watch

  Http Watch是强大的网页数据分析工具,集成在Internet Explorer工具栏中,能够收集并显示HTTP协议交互的深层信息。只需要选择相应的网站,就可以对网站与IE之间的请求回复的通讯情况进行分析,并在同一界面显示其相应的日志记录。每一个HTTP记录都可以详细地分析其Cookies、消息头、字符查询等信息。支持HTTPS及分析报告输出为XML、CSV等格式。
  Http Watch安装完成后(win10存在版本兼容问题,需要下载7.0.23版本,我下载的是7.0.23汉化版本),访问一个网站,在IE的工具选项或者右键找到“Http Watch Pro”(我这里下载的pro版本)选项,点击就可以在浏览器下方出现Http Watch的主界面,如下图所示:
在这里插入图片描述

12.6.1 Http Watch 录制

  点击“Record”按钮,然后访问一个URL,等页面完全展现后,单击“Stop”按钮,就可以生成一次HTTP的交互结果,如下图所示:
在这里插入图片描述
  把整个HttpWatch面板化分为3个区域:菜单区、数据区、数据明细区。菜单区主要是一些常用的功能按钮,比如录制、停止、清除、查询、过滤等等。数据区存放访问的URL及其相关资源(如图片、css等)。数据明细区是针对某个URL进行详细的分析。

12.6.2 Http Watch 数据分析

  • 数据区
    在数据区,可以看到一个界面是由多个URL请求组成的。下面对这个区域的每个列做一个简单的分析。
    在这里插入图片描述
    开始于:这里的时间指的是相对于第一个请求,其他请求发出的时间偏移。
    耗时图表:每个请求所花费时间的具体分布。
    时间:每个URL请求所花费的具体时间,单位是秒。
    已发送:每个请求发送出去的数据大小,包括HTTP请求头的大小和任何的数据,单位是Bytes。
    已接收:服务器返回的数据总量,单位是Bytes。
    方法:HTTP请求的方法,常见的是GET和POST。
    返回值:HTTP请求应答返回码,当某个请求是通过缓存展现的,此处会展示为(Cache)。
    类型:描述URL请求的类型,主要有以下几种:html、css、javascript、image、redirect。
    URL:具体的URL请求地址。
    在数据区的最下方,有一行统计的信息,这里是最需要关注的地方。
    在这里插入图片描述
    需要关注以下数据:时间反映了整个界面加载完成的时间,也就是通常情况下的用户响应时间,如果这个响应时间过大,会严重影响用户体验。已发送和已接收之和体现了单用户访问的网络流量。如果这个值比较大的话,在多用户使用的情况下,网络带宽会成为瓶颈。在方法列的最下方统计的是请求的个数,当这个请求个数过多的时候,需要考虑是否需要对CSS做合并,对图片做些合并,可减少服务器资源开销。
  • 数据明细区
    选择一个URL或者资源,数据明细区会展现其具体的信息,分成多个标签页面,可以查看不同的内容。
    在这里插入图片描述
    概述:某个URL的概述信息,展示访问的地址、时间、连接的IP及返回的状态信息。
    在这里插入图片描述
    耗时图表:访问某个URL的所有时间花费,从建立连接到完全展现,通过不同的颜色进行区分。
    在这里插入图片描述
    头信息:展现HTTP协议的头域信息,包含发送的请求以及接收到的应答。
    Cookies、Cache:存放页面相关的缓存信息,当我们需要测试缓存刷新、过期、缓存内容是否存放正确时,可以通过这个标签页查看。
    POST数据:存放的是POST请求中的请求正文。
    内容:访问连接时,服务器返回的内容。
    数据流:展现了整个请求过程的数据。
    警告:HttpWatch会自带一些安全校验、语法校验等内容,不需要过分的关注。

本章小结

  本章主要是对HTTP协议进行了介绍,加强对HTTP协议的认识,在编写Web类项目的测试脚本时提供一些帮助。


  1. 本部分内容来源于https://www.cnblogs.com/AhuntSun-blog/p/12021886.html ↩︎

猜你喜欢

转载自blog.csdn.net/weixin_40734030/article/details/112260460