HTTP协议大家都是比较熟悉的,但是通常我们只是了解和知道它是做什么的,但并不是每个人都去详细了解了其具体的规则。比如说我一直都是认为这个不需要了解,或者说了解到之前的程度就可以了,因为一提到协议就有一些退缩感,觉的离我很远,测试工作也不用了解太多,所以一直对http的认识还是处于最基本的。比如它是应用层协议,是基于TCP/IP协议的,用于web通信,可以GET、POST,可以通过脚本或者TELNET的方法 来发送一个HTTP请求并得到返回的内容,默认端口是80等。
最近在看一本叫模糊测试的书籍,里面说的都是如何构造协议模糊器,然后通过这个来进行模糊测试。在阅读过程中发现还是比较吃了的,因为在这方面的知识根本不够,如果连HTTP协议都没有很好的理解和操作性,那么对其它更底层的协议就没法学习了。所以稍稍去收集了一下资料,现整理并记录之,个人觉得这个对于WEB测试来说还是比较好测试基础知识,理解了测试web程序时很多隐含的问题都可以考虑到。
1、HTTP的发展历史:
共有3个版本,0.9、1.0、1.1。现在大部分网站都是使用的1.0,有些网站是1.1。下面来看看他们的区别和发展:
HTTP0.9已过时。只接受 GET 一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持 POST 方法,所以客户端无法向服务器传递太多信息。
HTTP1.0是第一个在通讯中指定版本号的 HTTP 协议版本,至今仍被广泛采用。相对于0.9增加了如下内容:
1、添加请求的类型,如 HEAD、POST等。
2、添加请求和响应消息的协议版本,响应消息第一行以“HTTP/1.0”开始
3、使用 Server响应码来表示请求响应消息的成功与否,如200表示成功
4、使用MIME的消息标题(Header)和消息体(Body)格式来描述访问对象的数据类型和附加在后面的元信息,如MIME的Header为“Content-type:text/html”表明响应的消息实体是HTML文件
5、增加了MIME支持之后,使HTTP协议扩大了处理的数据类型,支持对多媒体流信息的处理
6、用 Challenge/Response实现认证,这样可以在用户访问某些页面时要求输入用户名和密码,进行身份认证
7、增加了代理(proxy)支持功能,在HTTP0.9中,规定了Client和Server只能直接交互,而1.0版可以通过代理等中间实体实现间接连接
HTTP1.1当前版本。持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度。 相较于 HTTP/1.0 协议的区别主要体现在:
1 缓存处理
2 带宽优化及网络连接的使用
3 错误通知的管理
4 消息在网络中的发送
5 互联网地址的维护
6 安全性及完整性
由上述可以得出一个结论,那就是GET和POST唯一的联系是他们都是应运而生的;唯一的区别是GET能做的POST都能做,PSOT能做的GET不一定能做。至于网上的那些分析出来的区别其实更确切的理解应该是它们各自的属性,因为设计时的目的是升级而不是互补,所以要是知道GET有什么好处,设计POST时肯定会带上的,而之所以喜欢把它们联系到一起恐怕还是因为它们的基本功能。
2、HTTP的实现机制:
因为是高层协议,所以肯定有依托的底层协议,大部分情况下HTTP使用的都是TCP/IP协议,但有时也可以基于其他底层协议,其唯一的要求就是像TCP一样具有可靠的传输。我们先假定其实现是基于TCP/IP实现的,那么HTTP的通信过程也就是必然要包括3次交互,交互成功后表示已建立了链接,而后采用请求/响应的模式来进行内容获取:客户端向服务器发送一个请求,请求头包含请求的方法、URL、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。具体步骤如下:
a、输入url回车
b、请求建立(TCP)传输连接【通过HOST:PORT】
c、连接成功后请求页面【通过网页路径】
d、请求成功后返回200状态和所请求的页面
e、请求失败则返回相应状态【浏览器根据状态显示相应错误页】
3、HTTP的结构分析:
HTTP完整请求和响应的结构如下所示:
请求行
*Header
CRLF
[body]
状态行
*Header
CRLF
[body]
注:上面的CRLF是Header 的结束符,其实就是/r/n
HEADER部分呢有可以分为:General-Header ,Request-Header,Response-Header ,Entity-Header。其实就是对头部内容进行了分类,具体的可以查一下HTTP协议头的详解,还挺多的但是记的话只要记长用到的就够了。
另外BODY部分是用来传输一些内容信息的,可以存放任意内容【最好是编码后】,任意长度【除浏览器限制外】,而且通常都是name:value对,常用到的就是POST数据的内容。
【注:GET方法不支持body,但post方法可以支持带参数请求;所以由此可以看出get可以做的post也可以,但反之则不亦然】
在分析http时需要用到的工具如:httpanalysis,wireshark