工具篇 - HTTP协议报文结构及示例03
从事性能测试必不可绕过的就是协议,对基本知识的了解也还,还是深入掌握协议的机制,都能让你在从事性能测试实施时显得更加顺手。
下面我们就HTTP协议及性能测试过程必须掌握的一些分析工具来进行分享。
重点分享性能测试实施过程中必须掌握的关键技术、工具。更细节的请参考HTTP相关书籍或RFC文档。
HTTP基本架构
下面我们用一张简单的流程图来展示HTTP协议基本架构,以便大家先有个基本的了解。
- Web Client可以是浏览器、搜索引擎、机器人等等一切基于HTTP协议发起http请求的工具。
- Web Server可以是任何的能解析HTTP请求,并返回给Web Client可识别的响应的服务,常见的有apache、nginx、IIS等等web服务器。
浓缩就是精华,看下最简洁的HTTP交互图:
HTTP报文结构
- 请求报文
HTTP请求报文由请求行、请求头、空行和请求内容4个部分构成。
如下图所示:
下面对上图进行简单的分析:
请求行
由请求方法字段、URL字段、协议版本字段三部分构成,它们之间由空格隔开。常用的请求方法有:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
请求头
请求头由key/value对组成,每行为一对,key和value之间通过冒号(:)分割。请求头的作用主要用于通知服务端有关于客户端的请求信息。
典型的请求头有:
User-Agent:生成请求的浏览器类型
Accept:客户端可识别的响应内容类型列表;星号*
用于按范围将类型分组。*/*
表示可接受全部类型,type/*
表示可接受type类型的所有子类型。
Accept-Language: 客户端可接受的自然语言
Accept-Encoding: 客户端可接受的编码压缩格式
Accept-Charset: 可接受的字符集
Host: 请求的主机名,允许多个域名绑定同一IP地址
connection:连接方式(close或keeplive)
Cookie: 存储在客户端的扩展字段
空行
最后一个请求头之后就是空行,用于告诉服务端以下内容不再是请求头的内容了。
请求内容
请求内容主要用于POST请求,与POST请求方法配套的请求头一般有Content-Type(标识请求内容的类型)和Content-Length(标识请求内容的长度)
- 响应报文
HTTP响应报文由状态行、响应头、空行和响应内容4个部分构成。
如下图所示:
下面对响应报文格式进行简要的分析说明:
状态行
由HTTP协议版本、状态码、状态码描述三部分构成,它们之间由空格隔开。
状态码由3位数字组成,第一位标识响应的类型,常用的5大类状态码如下:
1xx:表示服务器已接收了客户端的请求,客户端可以继续发送请求
2xx:表示服务器已成功接收到请求并进行处理
3xx:表示服务器要求客户端重定向
4xx:表示客户端的请求有非法内容
5xx:标识服务器未能正常处理客户端的请求而出现意外错误
常见状态码说明:
200 OK: 表示客户端请求成功
400 Bad Request: 表示客户端请求有语法错误,不能被服务器端解析
401 Unauthonzed: 表示请求未经授权,该状态码必须与WWW-Authenticate报文头一起使用
404 Not Found:请求的资源不存在,例如输入了错误的url
500 Internal Server Error: 表示服务器发生了不可预期的错误,导致无法完成客户端的请求
503 Service Unavailable:表示服务器当前不能处理客户端的请求,在一段时间后服务器可能恢复正常
响应头
一般情况下,响应头会包含以下,甚至更多的信息。
Location:服务器返回给客户端,用于重定向到新的位置
Server: 包含服务器用来处理请求的软件信息及版本信息
Vary:标识不可缓存的请求头列表
Connection: 连接方式。
对于请求端来讲:close是告诉服务端,断开连接,不用等待后续的求请了。keeplive则是告诉服务端,在完成本次请求的响应后,保持连接,等待本次连接后的后续请求。
对于响应端来讲:close表示连接已经关闭。keeplive则表示连接保持中,可以继续处理后续请求。Keep-Alive表示如果请求端保持连接,则该请求头部信息表明期望服务端保持连接多长时间(秒),例如300秒,应该这样写Keep-Alive: 300
空行
最后一个响应头之后就是空行,用于告诉请求端以下内容不再是响应头的内容了。
响应内容
服务端返回给请求端的文本信息。
HTTP报文示例
在这里我们在Firefox下用firebug随意抓取一个HTTP包和上文的报文结构做下一一对应关系图,以便大家了解实际的包和标准报文结构的对应关系。
总结
对于HTTP协议的交互过程这里就不再进行说明了,大家可以搜索下相关的资料进行学习,上述的内容请务必熟练掌握、深刻了解。更详细的内容推荐大家学习RFC 2616(http协议1.1版本,有中文版本)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python—requests模块详解
- python爬虫伪装请求头---fake-useragent
- Flutter基础widgets教程-RaisedButton篇
- 记一次 excel vba 参考手册爬虫实战,不必要的一次爬虫。
- xray子域名扫描结果导出
- AWS的湖仓一体使用哪种数据湖格式进行衔接?
- python 行政区域地址标准化:业务经理填报的地址乱起八糟,高德接口有点厉害!
- python 行政区域地址标准化:业务经理填报的地址乱起八糟,高德接口有点厉害! -- 后续,使用分词思路完成解析
- pandas 一维台账数据与二维表格数据的转换
- Flutter基础widgets教程-Row篇
- padans 关于数据处理的杂谈 -- 时序数
- python pandas DataFrame 关于重复索引取值的一些坑
- selenium webdriver 如何添加cookie
- Flutter基础widgets教程-Scaffold篇
- python selenium 微信公众号历史文章随手一点就返回首页?郁闷之下只好将他们都下载下来。