HTTP(HyperText Transfer Protocol,超文本传输协议)协议是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。HTTP是一个应用层协议,有请求和响应构成,是一个标准的客户端服务器模型。HTTP具有以下几个特点:
2. 简单快速;客户端向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4. HTTP 0.9和1.0使用非持续连接:限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。HTTP 1.1使用持续连接:不必为每个web对象创建一个新的连接,一个连接可以传送多个对象。
5. 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
2. HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
3. GET:向特定的资源发出请求。注意:get方法不应当被用于产生“副作用”的操作中。例如在Web APP中,其中一个原因是GET可能会被网站蜘蛛等随意访问。
4. POST:向指定资源提交数据进行处理请求(比如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立或已有资源的修改。
5. PUT:向指定资源位置上传其最新内容。
6. DELETE:请求服务器删除Request-URI所标识的资源。
7. TRACE:回显服务器收到的请求,主要用于测试或者诊断。
8. CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
2. TCP建立连接成功后,向服务器发送HTTP请求。
3. 服务器接收客户端的HTTP请求后,将返回应答,并向客户端发送数据
4. 客户端通过TCP四次断开,与服务器断开TCP连接。
假设在非持久连接的情况下服务器向客户端传送一个web页面。假设该贝面由1个基本HTML文件和10个JPEG图像构成,而且所有这些对象都存放在同一台服务器主机中。 再假设该基本HTML文件的URL为http://www.example.cn/somepath/index.html,则传输步骤如下所示:
(2)HTTP客户段通过TCP连接向服务器发送—个HTTP请求消息。这个消息中包含路径名/somepath/index.html。
(3)Web服务器通过TCP连接接收这个请求消息后,从服务器主机的内存或硬盘中取出对象/somepath/index.html,经由同一个套接字发出包含该对象的响应消息。
(4)Web服务器告知本机的TCP协议栈关闭这个TCP连接。但是TCP协议栈要到客户端收到刚才这个应答消息之后,才会真正终止这个链接。
(5)HTTP客户经由同一个套接字接收这个响应消息。TCP连接随后终止。
(6)该消息标明所封装的对象是一个HTML文件。客户从中取出这个文件,加以分析后发现其中有10个JPEG对象的引用。
(7)这时候客户端在重复步骤(1)~(5),从服务器得到所引用的每一个JPEG对象。
实际上,客户端还可以通过并行的TCP连接同时取得其中的某些JPEG对象。这样可以大大提高数据传输速度,缩短响应时间。目前的浏览器允许用户通过配置来控制并行连接的数目,大多浏览器默认可以打开5-10个并行的TCP连接,每个连接处理一个请求/应答事务。
根据以上例子的描述,可以发现非持久连接具有如下几个缺点。
其次,每个对象 都有2个RTT(Round-Trip Time,往返时延)的响应延长。一个RTT用于建立TCP连接,另—个RTT用于请求和接收对象。最后,每个对象都要经过TCP缓启动,因为每个TCP连接都 起始于缓启动阶段。不过并行TCP连接的使用能够部分减轻RTT延迟和缓启动延迟的影响。
通常,HTTP服务器在某个连接闲置一段特定时间后关闭它,而这段时间通常是可以配置的。持 久连接分为不带流水线(without pipelining)和带流水线(with pipelining)两个版本。如果是不带流水线的版本,那么客户只在收到前一个请求的响应后才发出新的请求。这种情况下,web页面所引用的每个对象 (上例中的10个图像)都经历1个RTT的延迟,用于请求和接收该对象。与非持久连接2个RTT的延迟相比,不带流水线的持久连接已有所改善,不过带流水 线的持久连接还能进一步降低响应延迟。不带流水线版本的另一个缺点是,服务器送出一个对象后开始等待下一个请求,而这个新请求却不能马上到达。这段时间服 务器资源便闲置了。
HTTP/1.1的默认模式使用带流水线的持久连接。这种情况下,HTTP客户每碰到一个引用就立即发出一个请求,因而HTTP客户可以一个接一个 紧挨着发出各个引用对象的请求。服务器收到这些请求后,也可以一个接一个紧挨着发出各个对象。与非流水线模式相比,流水线模式的效率要高得多。
点击页面的登录,在对话框中输入用户名密码(demo/demo),确定之后等待服务器响应。成功如下
HTTP请求报文格式
(2)请求头部包含很多客户端环境以及请求正文的有用信息。请求头部由“关键字:值”对组成,每行一堆,关键字和值之间使用英文“:”分隔。
(3)空行,这一行非常重要,必不可少。表示请求头部结束,下面就是请求正文。
(4)请求正文:可选部分,比如GET请求就没有请求正文;POST比如以提交表单数据方式为请求正文。
(3)空行,这一行非常重要,必不可少。表示响应头部结束
(4)响应正文,服务器返回的文档,最常见的为HTML网页。
HTTP请求头域
HTTP 应答头域
HTTP通用头域
HTTP实体头域
分析HTTP请求包
我们打开数据包,输入过滤条件ip.addr == 10.1.1.33,如下
GET / HTTP/1.1\r\n #请求行信息
Expert Info (Chat/Sequence): GET / HTTP/1.1\r\n #专家信息
GET / HTTP/1.1\r\n
Severity level: Chat
Group: Sequence
Request Method: GET #请求方法为GET
Request URI: / #请求的URI
Request Version: HTTP/1.1 #请求的版本为HTTP/1.1
Host: 10.1.1.33:8080\r\n #请求的主机
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0\r\n #浏览器类型
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n #请求的类型
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3\r\n #请求语言
Accept-Encoding: gzip, deflate\r\n #请求的编码格式
Connection: keep-alive\r\n #使用持久连接
\r\n #空行
Full request URI: http://10.1.1.33:8080/ #请求的URI为10.1.1.33:8080
HTTP request 1/8
Response in frame: 2770 #应答是第2770帧
Next request in frame: 2775 #下一个请求是第2775帧
根据请求包的信息,我们已经知道,响应包是第2770帧,下面我们来看下
HTTP/1.1 200 OK\r\n #响应行信息
Expert Info (Chat/Sequence): HTTP/1.1 200 OK\r\n #专家信息
HTTP/1.1 200 OK\r\n #HTTP响应信息,响应码为200
Severity level: Chat
Group: Sequence
Request Version: HTTP/1.1 #请求吧
Status Code: 200 #状态码
Response Phrase: OK #响应短语
Content-Type: text/html\r\n #响应的内容类型
Content-Length: 2023\r\n #包的长度
Content length: 2023
Accept-Ranges: bytes\r\n #服务器支持的请求:字节
Server: HFS 2.3 beta\r\n #服务器类型
Set-Cookie: HFS_SID=0.248448607278988; path=/; \r\n #设置Http Cookie
Cache-Control: no-cache, no-store, must-revalidate, max-age=-1\r\n #缓存控制
Content-Encoding: gzip\r\n #实体数据的压缩格式
\r\n #空行
HTTP response 1/8 #HTTP响应
Time since request: 0.015248000 seconds #响应使用的时间
Request in frame: 2763 #请求的帧号为2763
Next request in frame: 2775 #下一个请求的帧号2775
Next response in frame: 2778 #下一个响应的帧号是2778
Content-encoded entity body (gzip): 2023 bytes -> 4375 bytes #内容编码(gzip)
Line-based text data: text/html #基于行的文本数据
下面我们以HTTP-Post为例,分析POST方法的HTTP请求和响应。打开数据包,输入过滤条件ip.addr ==10.1.1.33,显示出的HTTP中,Info列中还有POST的即可,如下
POST /hfs2_3b287/ HTTP/1.1\r\n #请求行
Expert Info (Chat/Sequence): POST /hfs2_3b287/ HTTP/1.1\r\n #专家信息
POST /hfs2_3b287/ HTTP/1.1\r\n
Severity level: Chat
Group: Sequence
Request Method: POST #请求方法为POST
Request URI: /hfs2_3b287/ # 请求的URI
Request Version: HTTP/1.1 #请求的版本
Host: 10.1.1.33:8080\r\n #使用的主机
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0\r\n #使用的浏览器类型
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n #浏览器接受的类型
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3\r\n #希望使用的语言
Accept-Encoding: gzip, deflate\r\n #可使用的编码格式,这里是gzip和deflate
Referer: http://10.1.1.33:8080/hfs2_3b287/\r\n #从包含的URL页面发起请求
Cookie: HFS_SID=0.248448607278988\r\n #Cookie信息
Cookie pair: HFS_SID=0.248448607278988
Authorization: Basic ZGVtbzpkZW1v\r\n #授权证书信息
Credentials: demo:demo #登录的用户名密码
Connection: keep-alive\r\n #使用持久连接
Content-Type:multipart/form-data;boundary=—————————54542580413055\r\n #请求的内容类型
Content-Length: 367\r\n #包的长度
Content length: 367
\r\n #空行
Full request URI: http://10.1.1.33:8080/hfs2_3b287/ #请求的URI为http://10.1.1.33:8080/hfs2_3b287/
HTTP request 1/6
Response in frame: 3800 #响应的帧号
Next request in frame: 3802 #下一个请求的正好
在看Wireshark中的使用
wireshark中字段与Multipart/form-data的对应关系: MIME Multipart Media Encapsulation:代表整个Multipart/form-data上传文件中的数据。
Encapsulated multipart part:代表表单中不同部分的数据。
Boundary:用来隔开表单中不同部分的数据。
其次:
1) MIME Multipart Media Encapsulation, Type: multipart/form-data, Boundary: “—————————54542580413055”
这行指出这个请求是multipart/form-data格式的,且boundary是“———-54542580413055”这个字符串。
2)关于Boundary: Boundary:用来隔开表单中不同部分的数据。实际上,每部分数据的开头都是由“–”+boundary开始的(这是MIME标准中讲述的标准内容)。
3) Encapsulated multipart part:紧跟着boundary的是该部分数据的描述:Content-Dispostion:form-data;name=”Filename”\r\n
每一个part至少一个name和一个content部分。
分析HTTP响应包
根据Wireshark现实的响应包帧数,我们来看下第3800帧。
HTTP/1.1 200 OK\r\n #响应行
Expert Info (Chat/Sequence): HTTP/1.1 200 OK\r\n #专家信息
HTTP/1.1 200 OK\r\n #响应信息
Severity level: Chat
Group: Sequence
Request Version: HTTP/1.1 #请求版本
Status Code: 200 #状态码
Response Phrase: OK #响应短语
Content-Type: text/html\r\n # #响应包类似
Content-Length: 570\r\n #响应包长度
Content length: 570
Accept-Ranges: bytes\r\n #服务器支持的请求:字节
Server: HFS 2.3 beta\r\n #web服务器类型
Content-Encoding: gzip\r\n #实体数据的压缩格式
\r\n #空行
HTTP response 1/6 #响应
Time since request: 0.008774000 seconds #响应请求的时间
Request in frame: 3798 #请求的帧号
Next request in frame: 3802 #下一个请求的帧号
Next response in frame: 3804 #下一个响应的帧号
Content-encoded entity body (gzip): 570 bytes -> 866 bytes #内容编码(gzip)
Line-based text data: text/html #文本内容