HTTP协议分析.docx
《HTTP协议分析.docx》由会员分享,可在线阅读,更多相关《HTTP协议分析.docx(14页珍藏版)》请在冰豆网上搜索。
HTTP协议分析
HTTP协议分析
1、HTTP介绍
HTTP是超文本传输协议,是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。
在Internet上的Web服务器上存放的都是超文本信息,客户机需要通过HTTP协议传输所要访问的超文本信息。
HTTP包含命令和传输信息,不仅可用于Web访问,也可以用于其他因特网/内联网应用系统之间的通信,从而实现各类应用资源超媒体访问的集成。
2、HTTP应用
目前网络上利用HTTP协议的应用已经非常广泛,如下表所示:
大类
小类
电子邮件
WEBMAIL
网站
门户、公司、个人WWW网站
HTTP-search
流媒体网站
论坛、聊天
论坛
聊天室
突网工具
Web加密
社交网站
Facebook、Twitter等
订票网站
旅游网站
购物
代理服务器
HTTP代理
软件更新
HTTP方式更新软件
3、HTTP协议标准
HTTP中文名称为超文本传输协议(HyperTextTransferProtocol),是一个应用层协议,目前有两个版本,分别为HTTP1.0(RFC1945,1996年5月份发布)和HTTP1.1(RFC2616,1999年6月份发布),现在几乎所有的应用(包括客户端和服务器)都基于HTTP1.1。
3.1HTTP1.1和HTTP1.0的区别
它们之间的区别主要有如下几点:
(一)持久连接
HTTP1.1支持持久连接,且默认是持久连接。
HTTP1.0不支持持久连接,每次访问完后就关闭该连接。
(二)HOST域
HTTP1.1支持HOST域,这样允许虚拟主机的存在。
HTTP1.0不支持HOST域。
(三)日期时间戳
(接收方向)
无论是HTTP1.0还是HTTP1.1,都要能解析下面三种date/timestamp:
Sun,06Nov199408:
49:
37GMT;RFC822,updatedbyRFC1123
Sunday,06-Nov-9408:
49:
37GMT;RFC850,obsoletedbyRFC1036
SunNov608:
49:
371994;ANSIC'sasctime()format
(发送方向)
HTTP1.0要求不能生成第三种asctime格式的date/timestamp;
HTTP1.1则要求只生成RFC1123(第一种)格式的date/timestamp。
(四)传送编码
HTTP1.1支持chunkedtransfer,HTTP1.0不支持。
(五)Range和Content-Range
HTTP1.1支持传送内容的一部分。
比方说,当客户端已经有内容的一部分,为了节省带宽,可以只向服务器请求一部分。
(六)StatusCode
HTTP1.1增加了许多ResponseStatus-Code,比如100(Continue)。
(七)RequestMethod
HTTP1.1增加了OPTIONS、PUT、DELETE、TRACE、CONNECT这些Request方法。
(八)ContentNegotiation
HTTP1.1增加了ContentNegotiation,分为Server-drivenNegotiation,Agent-drivenNegotiation和TransparentNegotiation三种。
(九)Cache
HTTP1.1详细展开地描述了Cache机制。
3.2HTTP1.1
HTTP是一个客户端和服务器端请求和应答的标准。
客户端是终端用户,服务器端是网站。
通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求,我们称这个客户端叫用户代理(useragent)。
应答的服务器上存储着(一些)资源,比如HTML文件和图像,我们称这个应答服务器为源服务器(originserver)。
在用户代理和源服务器中间可能存在多个中间层,比如代理,网关,或者隧道(tunnels)。
尽管TCP/IP协议是互联网上最流行的应用,HTTP协议并没有规定必须使用它和(基于)它支持的层。
事实上,HTTP可以在任何其他互联网协议上,或者在其他网络上实现。
HTTP只假定其下层协议提供可靠的传输,任何能够提供这种保证的协议都可以被其使用。
HTTP消息包括两种:
request和response,消息格式为:
开始行++消息头++消息正文。
消息头包括general-header、request-header、response-header和entity-header四种,消息头格式为:
域名+空格+:
+空格+域值,一个消息可以包含多个消息头,每个消息头都以结束。
3.2.1request消息
Request消息的开始行(请求行)格式为:
请求方法+空格+请求的URI+空格+HTTP版本号,一个消息只有一个请求行。
请求方法有如下几种:
请求方法
解释
OPTIONS
请求查询服务器的性能,或者查询与资源相关的选项和需求
GET
请求获取Request-URI所标识的资源
HEAD
请求获取由Request-URI所标识的资源的响应消息报头
POST
在Request-URI所标识的资源后附加新的数据
PUT
请求服务器存储一个资源,并用Request-URI作为其标识
DELETE
请求服务器删除Request-URI所标识的资源
TRACE
请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT
通过代理服务器连接目的服务器
extension-method
用户扩展的方法
请求的URI分为绝对URI、相对URI和认证信息,其中认证信息仅当方法为CONNECT时有效,绝对URI也主要用于代理时。
例如:
GEThttp:
//www.w3.org/pub/WWW/TheProject.htmlHTTP/1.1(绝对URI)
GET/pub/WWW/TheProject.htmlHTTP/1.1(相对URI)
消息头包括general-header、request-heade和entity-header。
消息正文可有可无。
请求消息例子:
GET/portal-core/layouts/generic/img/technical_support_2.jpgHTTP/1.1
Accept:
*/*
Referer:
Accept-Language:
zh-CN
User-Agent:
Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.1;WOW64;Trident/4.0;SLCC2;.NETCLR2.0.50727;.NETCLR3.5.30729;.NETCLR3.0.30729;MediaCenterPC6.0;InfoPath.3;staticlogin:
product=cboxf2010&act=login&info=ZmlsZW5hbWU9UG93ZXJXb3JkMjAxME94Zl9VbHRpbWF0ZS5leGUmbWFjPTNFMEVENjUyMEJBMzQzNjlBQkQwRDkyNDI5MTI3MkVFJnBhc3Nwb3J0PSZ2ZXJzaW9uPTIwMTAuNi4zLjYuMiZjcmFzaHR5cGU9MQ==&verify=38e5900f1776a308ebc214205c5bb1a1)
Accept-Encoding:
gzip,deflate
Host:
Connection:
Keep-Alive
Cookie:
JSESSIONID=058202D9E4BA7B9F51CCA031B87EBB49
3.2.2response消息
Response消息的开始行(状态行)格式为:
HTTP版本号+空格+响应状态代码+空格+响应状态文字描述。
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:
指示信息--表示请求已接收,继续处理
2xx:
成功--表示请求已被成功接收、理解、接受
3xx:
重定向--要完成请求必须进行更进一步的操作
4xx:
客户端错误--请求有语法错误或请求无法实现
5xx:
服务器端错误--服务器未能实现合法的请求
具体状态代码和描述如下:
"100":
Continue
"101":
SwitchingProtocols
"200":
OK
"201":
Created
"202":
Accepted
"203":
Non-AuthoritativeInformation
"204":
NoContent
"205":
ResetContent
"206":
PartialContent
"300":
MultipleChoices
"301":
MovedPermanently
"302":
Found
"303":
SeeOther
"304":
NotModified
"305":
UseProxy
"307":
TemporaryRedirect
"400":
BadRequest
"401":
Unauthorized
"402":
PaymentRequired
"403":
Forbidden
"404":
NotFound
"405":
MethodNotAllowed
"406":
NotAcceptable
"407":
ProxyAuthenticationRequired
"408":
RequestTime-out
"409":
Conflict
"410":
Gone
"411":
LengthRequired
"412":
PreconditionFailed
"413":
RequestEntityTooLarge
"414":
Request-URITooLarge
"415":
UnsupportedMediaType
"416":
Requestedrangenotsatisfiable
"417":
ExpectationFailed
"500":
InternalServerError
"501":
NotImplemented
"502":
BadGateway
"503":
ServiceUnavailable
"504":
GatewayTime-out
"505":
HTTPVersionnotsupported
例如:
HTTP/1.1200OK
HTTP/1.1301MovedPermanently
HTTP/1.1304NotModified
消息头包括general-header、response-heade和entity-header。
消息正文可有可无。
响应消息例子:
HTTP/1.1200OK
Server:
Apache-Coyote/1.1
X-Powered-By:
Servlet2.4;JBoss-4.2.3.GA(build:
SVNTag=JBoss_4_2_3_GAdate=200807181417)/JBossWeb-2.0
ETag:
W/"30178-1272473282000"
Last-Modified:
Wed,28Apr201016:
48:
02GMT
Content-Type:
image/jpeg
Content-Length:
30178
Date:
Tue,09Aug201113:
36:
50GMT
......JFIF.....H.H......Exif..MM.*.............................b...........j.(...........1.........r.2...........i.................H.......H....AdobePhotoshop7.0.2010:
04:
1414:
00:
37............................`.........................................................(.....................&..................H.......H..........JFIF.....H.H......Adobe_CM......Adobe.d......................
.......................................................
3.2.3URL
HTTPURL是一种特殊的URI,包含了用于查找某个资源的足够的信息,其格式如下:
"http:
""//"host[":
"port][abs_path["?
"query]]
http表示要通过HTTP协议来定位网络资源;
host表示合法的Internet主机域名或者IP地址;
port指定一个端口号,为空则使用缺省端口80;
abs_path指定请求资源的URI,如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。
例如:
1、输入:
浏览器自动转换成:
2、http:
//10.10.201.100:
8888/index.jsp
3.2.4general-header
general-header(通用报头)是指在request消息和response消息中都会用到的消息头,包括如下域:
域名
说明
Cache-Control
用于指定缓存指令
Connection
发送指定连接的选项
Date
表示消息产生的日期和时间
Pragma
用来包含实现特定的指令
Trailer
指明了在以块(chunked)传输编码消息里的尾部(trailer)里用到的头域
Transfer-Encoding
指示了消息正文(messagebody)的编码转换,这是为了实现在接收端和发送端之间的安全数据传输
Upgrade
允许客户端指定它支持什么样的附加传输协议
Via
必须被网关和代理使用,用来指明用户代理和服务器之间关于请求的中间协议和接收者,以及源服务器和客户端之间关于响应的中间协议和接收者
Warning
用于携带额外关于消息的状态或变换的信息而这些信息是不能在消息里反应出来的
3.2.5Request-header
request-header(请求报头)是只在request消息才会用到的消息头,包括如下域:
域名
说明
Accept
用于指定服务器返回给客户端可接受的响应媒体类型
Accept-Charset
用来指出请求客户端能接受什么样的字符集响应
Accept-Encoding
限定服务器返回给客户端可以接受的内容编码
Accept-Language
限定服务器返回给客户端喜爱的自然语言
Authorization
发送授权信息给服务器希望得到授权
Expect
用于指明客户端需要的特定服务器行为
From
允许客户端指定它支持什么样的附加传输协议
Host
说明了正在请求资源的网络主机和端口号
If-Match
如果一个客户端已经从一个资源里获得一个或多个实体(entity),那么他可以通过在If-Match头域里包含相应的实体标签(entitytag)来验证这些实体的一个或多个是否就是服务器当前实体
If-Modified-Since
如果请求变量(variant)自从此头域里指定的时间之后没有改变,那么服务器不应该返回实体
If-None-Match
一个客户端如果有一个或多个从某资源获得的实体,那么他能验证在这些实体中有不存在于服务器当前实体中的实体,这通过在If-None-Match头域里包含这些实体相关的实体标签(entitytag)来达到此目的
If-Range
如果实体没有改变,发送我想要的部分;如果实体改变了,那就把整个新的实体发过来
If-Unmodified-Since
如果请求资源自从此头域指定时间开始之后没有改变,那么服务器应该执行此请求就像If-Unmodified-Since头域不存在一样。
如果请求变量在此头域指定时间后以后已经改变,那么服务器不能执行此请求
Max-Forwards
提供一种机制,那就是利用TRACE和OPTIONS方法去限制代理或网关的数量,这些代理或网关能传递请求到下一个入流(inbound)服务器
Proxy-Authorization
允许客户端让一个需要授权的代理能给自己(或客户端的用户)授权
Range
使用条件或无条件GET方法可以请求一个或多个实体的字节范围,而不是整个实体
Referer
允许服务器生成关于到资源的反向连接列表
TE
指明客户端可以接受哪些传输编码(transfer-coding)的响应,和是否愿意接收块(chunked)传输编码响应的尾部(trailer)
User-Agent
包含关于发起请求的用户代理的信息
3.2.6Response-header
response-header(响应报头)是只在response消息才会用到的消息头,包括如下域:
域名
说明
Accept-Ranges
允许服务器指明它对客户的范围请求(rangerequest)的接受程度
Age
表示发送者(一般是缓存)对响应产生(或重验证)时刻后经过时间的估计
ETag
提供了请求对应变量(variant)的当前实体标签
Location
被用于为了完成请求或识别一个新资源,使接收者能重定向于Location指示的URI而不是请求URI
Proxy-Authenticate
代理授权
Retry-After
能被用于一个503(服务不可得)响应,服务器用它来向请求端指明服务不可得的时长。
此头域可能被用于3xx(重定向)响应,服务器用它来(如web浏览器)指明用户代理再次提交已重定向请求之前的最小等待时间
Server
包含了源服务器用于处理请求的软件信息
Vary
指定了一些请求头域,这些请求头域用来决定当缓存中存在一个响应是保鲜时缓存是否被允许去利用此响应去回复后续请求而不需要重验证(revalidation)
WWW-Authenticate
必须包含在401(没有被授权)响应消息中
3.2.7Entity-header
Entity-header(实体报头)是用来描述实体的消息头,在request消息和response消息中都有可能包含实体(消息正文),实体报头包括如下域:
域名
说明
Allow
列出了请求URI(Request-URI)指定资源所支持的几种方法。
必须出现在405(方法不被允许)响应中
Content-Encoding
表明对实体主体采用了何种的内容编码,从而可以知道采用何种解码机制以获取Content-Type头域中指出的媒体类型
Content-Language
描述了实体面向用户的自然语言
Content-Length
按十进制或八位字节数指明了发给给接收者的实体主体的大小
Content-Location
可用来为消息里的实体提供对应资源的位置,当此实体的访问位置和请求URI不是同一位置时
Content-MD5
含有的是实体主体的MD5摘要,这是为了给一个end-to-end消息的实体主体的提供完整性检测
Content-Range
用于指明部分实体主体在完整实体主体里那一部分被采用
Content-Type
指明发给接收者的实体主体的媒体类型
Expires
给出了在何日何时之后响应即被视为陈旧的
Last-Modified
指明了变量(variant)被源服务器所确信的最后修改的日期和时间
extension-header
用户可扩充的域
4、WEB服务器和客户端
目前市场上占主流的WEB服务器有Apache、IIS、Nginx、AOLserver、Lighttpd、LiteSpeed、Zeus,其中后两款是商业服务器,需要收费,其余的都是免费的并且大部分是开源的。
除了这些主流的服务器之外还有一些轻型化的服务器,如TornadoWebServer、Cherokee、thttpd、Appweb、Eurasia3、Mongrel、Shttpd、TclHttpd等。
HTTP客户端主要是指浏览器,有IE、Firefox、Opera、Lynx、Konqueror、Safari、傲游浏览器、Chrome、E影浏览器、UC手机浏览器、HotJAVA等。
国内的如腾讯TT、搜狗浏览器、世界之窗、360浏览器等都是基于IE的内核实现的。
5、相关技术介绍
与HTTP相关的技术比较多,主要有HTML、XML、JavaScript、CSS、DOM、cookie、session、PHP、JSP、CGI、perl等,这些技术大都是为了在服务器端实现静态和动态网页以及在客户端实现页面展示所采用的一些编程技术,具体技术标准可以参考各自的标准文档。
HTTPS(全称:
HypertextTransferProtocoloverSecureSocketLayer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。
即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
它是一个URIscheme(抽象标识符体系),句法类同http:
体系。
用于安全的HTTP数据传输。
https:
URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口(HTTPS的默认端口是443)及一个加密/身份验证层(在HTTP与TCP之间)。
这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。
6、HTTP数据还原
HTTP数据还原是指将网络上获取的数据包按照一定的顺序重新组装成request消息或response消息。