HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616。HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(NextGenerationofHTTP)的建议已经提出。今天在实验室把相关的RFC文档仔细看了一下,对HTTP协议有了一个详细的认识,本文将做一个详细的介绍。
1
HTTP
协议特点及其相关概念
HTTP
协议的主要特点可概括如下:
1.
支持客户
/
服务器模式
。
2.
简单快速
:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有
GET
、
HEAD
、
POST
。由于
HTTP
协议简单,使得
HTTP
服务器的程序规模小,因而通信速度很快。
3.
灵活
:
HTTP
允许传输任意类型的数据对象。正在传输的类型由
Content-Type
加以标记。
4.
无连接
:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.
无状态
:
HTTP
协议是无状态协议。无状态是指协议对于事务处理没有记忆能力
。
缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大
。
另一方面,在服务器不需要先前信息时它的应答就较快。
1.
连接
(Connection)
:一个传输层的实际环流,它是建立在两个相互通讯的应用程序之间。
2.
消息
(Message)
:
HTTP
通讯的基本单位,包括一个结构化的八元组序列并通过连接传输。
3.
请求
(Request)
:一个从客户端到服务器的请求信息包括应用于资源的方法、资源的标识符和协议的版本号
4.
响应
(Response)
:一个从服务器返回的信息包括
HTTP
协议的版本号、请求的状态
(
例如“成功”或“没找到”
)
和文档的
MIME
类型。
5.
资源
(Resource)
:由
URI
标识的网络数据对象或服务。
6.
实体
(Entity)
:数据资源或来自服务资源的回映的一种特殊表示方法,它可能被包围在一个请求或响应信息中。一个实体包括实体头信息和实体的本身内容。
7.
客户机
(Client)
:一个为发送请求目的而建立连接的应用程序。
8.
用户代理
(Useragent)
:初始化一个请求的客户机。它们是浏览器、编辑器或其它用户工具。
9.
服务器
(Server)
:一个接受连接并对请求返回信息的应用程序。
10.
源服务器
(Originserver)
:是一个给定资源可以在其上驻留或被创建的服务器。
11.
代理
(Proxy)
:一个中间程序,它可以充当一个服务器,也可以充当一个客户机,为其它客户机建立请求。请求是通过可能的翻译在内部或经过传递到其它的服务器中。一个代理在发送请求信息之前,必须解释并且如果可能重写它。代理经常作为通过防火墙的客户机端的门户,代理还可以作为一个帮助应用来通过协议处理没有被用户代理完成的请求。
12.
网关
(Gateway)
:一个作为其它服务器中间媒介的服务器。与代理不同的是,网关接受请求就好象对被请求的资源来说它就是源服务器;发出请求的客户机并没有意识到它在同网关打交道。网关经常作为通过防火墙的服务器端的门户,网关还可以作为一个协议翻译器以便存取那些存储在非
HTTP
系统中的资源。
13.
通道
(Tunnel)
:是作为两个连接中继的中介程序。一旦激活,通道便被认为不属于
HTTP
通讯,尽管通道可能是被一个
HTTP
请求初始化的。当被中继的连接两端关闭时,通道便消失。当一个门户
(Portal)
必须存在或中介
(Intermediary)
不能解释中继的通讯时通道被经常使用。
14.
缓存
(Cache)
:反应信息的局域存储。
2
HTTP
协议的运作方式
HTTP
协议是基于请求/响应范式的。一个客户机与服务器建立连接后,发送一个请求给服务器,请求方式的格式为,统一资源标识符、协议版本号,后边是
MIME
信息包括请求修饰符、客户机信息和可能的内容。服务器接到请求后,给予相应的响应信息,其格式为一个状态行包括信息的协议版本号、一个成功或错误的代码,后边是
MIME
信息包括服务器信息、实体信息和可能的内容。
在
Internet
上,
HTTP
通讯通常发生在
TCP/IP
连接之上。缺省端口是
TCP80
,但其它的端口也是可用的。但这并不预示着
HTTP
协议在
Internet
或其它网络的其它协议之上才能完成。
HTTP
只预示着一个可靠的传输。
3 HTTP
协议的内部操作过程
首先,简单介绍基于
HTTP
协议的客户
/
服务器模式的信息交换过程,它分四个过程,建立连接、发送请求信息、发送响应信息、关闭连接。在
WWW
中,“客户”与“服务器”是一个相对的概念,只存在于一个特定的连接期间,即在某个连接中的客户在另一个连接中可能作为服务器。
WWW
服务器运行时,一直在
TCP80
端口
(WWW
的缺省端口
)
监听,等待连接的出现。
1.
建立连接
连接的建立是通过申请套接字
(Socket)
实现的。客户打开一个套接字并把它约束在一个端口上,如果成功,就相当于建立了一个虚拟文件。以后就可以在该虚拟文件上写数据并通过网络向外传送。
2.
发送请求
打开一个连接后,客户机把请求消息送到服务器的停留端口上,完成提出请求动作。
HTTP/1.0
请求消息的格式为:
请求消息
=
请求行
(
通用信息
|
请求头
|
实体头
)CRLF[
实体内容
]
请求 行
=
方法 请求
URL
HTTP
版本号
CRLF
方 法
=GET|HEAD|POST|
扩展方法
U
R
L=
协议名称
+
宿主名
+
目录与文件名
请求行中的方法描述指定资源中应该执行的动作,常用的方法有
GET
、
HEAD
和
POST
。不同的请求对象对应
GET
的结果是不同的,对应关系如下:
对象
GET
的结果
文件 文件的内容
程序 该程序的执行结果
数据库查询 查询结果
HEAD
——
要求服务器查找某对象的元信息,而不是对象本身。
POST
——
从客户机向服务器传送数据,在要求服务器和
CGI
做进一步处理时会用到
POST
方法。
POST
主要用于发送
HTML
文本中
FORM
的内容,让
CGI
程序处理。
一个请求的例子为:
GEThttp://networking.zju.edu.cn/zju/index.htmHTTP/1.0
头信息又称为元信息,即信息的信息,利用元信息可以实现有条件的请求或应答。
请求头——告诉服务器怎样解释本次请求,主要包括用户可以接受的数据类型、压缩方法和语言等。
实体头——实体信息类型、长度、压缩方法、最后一次修改时间、数据有效期等。
实体——请求或应答对象本身。
3.
发送响应
服务器在处理完客户的请求之后,要向客户机发送响应消息。
HTTP/1.0
的响应消息格式如下:
响应消息
=
状态行
(
通用信息头
|
响应头
|
实体头
)
CRLF
〔实体内容〕
状态行
=HTTP
版本号 状态码 原因叙述
响应头的信息包括:服务程序名,通知客户请求的
URL
需要认证,请求的资源何时能使用。
4.
关闭连接
客户和服务器双方都可以通过关闭套接字来结束
TCP/IP
对话
通常
HTTP
消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。
HTTP
的头域包括通用头,请求头,响应头和实体头四个部分。每个头域由一个域名,冒号(
:
)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。
4
.
HTTP
各域详细分析
通用头域
通用头域包含请求和响应消息都支持的头域,通用头域包含
Cache-Control
、
Connection
、
Date
、
Pragma
、
Transfer-Encoding
、
Upgrade
、
Via
。对通用头域的扩展要求通讯双方都支持此扩展,如果存在不支持的通用头域,一般将会作为实体头域处理。下面简单介绍几个在
UPnP
消息中使用的通用头域。
Cache-Control
头域
Cache-Control
指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置
Cache-Control
并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括
no-cache
、
no-store
、
max-age
、
max-stale
、
min-fresh
、
only-if-cached
,响应消息中的指令包括
public
、
private
、
no-cache
、
no-store
、
no-transform
、
must-revalidate
、
proxy-revalidate
、
max-age
。各个消息中的指令含义如下:
Public
指示响应可被任何缓存区缓存。
Private
指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
no-cache
指示请求或响应消息不能缓存
no-store
用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
max-age
指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
min-fresh
指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
max-stale
指示客户机可以接收超出超时期间的响应消息。如果指定
max-stale
消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
Date
头域
Date
头域表示消息发送的时间,时间的描述格式由
rfc822
定义。例如,
Date:Mon,31Dec200104:25:57GMT
。
Date
描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。
Pragma
头域
Pragma
头域用来包含实现特定的指令,最常用的是
Pragma:no-cache
。在
HTTP/1.1
协议中,它的含义和
Cache-Control:no-cache
相同。
请求消息
请求消息的第一行为下面的格式:
Method
SP
Request-URI
HTTP-Version
CRLF
Method
表示对于
Request-URI
完成的方法,这个字段是大小写敏感的,包括
OPTIONS
、
GET
、
HEAD
、
POST
、
PUT
、
DELETE
、
TRACE
。方法
GET
和
HEAD
应该被所有的通用
WEB
服务器支持,其他所有方法的实现是可选的。
GET
方法取回由
Request-URI
标识的信息。
HEAD
方法也是取回由
Request-URI
标识的信息,只是可以在响应时,不返回消息体。
POST
方法可以请求服务器接收包含在请求中的实体信息,可以用于提交表单,向新闻组、
BBS
、邮件群组和数据库发送消息。
SP
表示空格。
Request-URI
遵循
URI
格式,在此字段为星号(
*
)时,说明请求并不用于某个特定的资源地址,而是用于服务器本身。
HTTP-Version
表示支持的
HTTP
版本,例如为
HTTP/1.1
。
CRLF
表示换行回车符。请求头域允许客户端向服务器传递关于请求或者关于客户机的附加信息。请求头域可能包含下列字段
Accept
、
Accept-Charset
、
Accept-Encoding
、
Accept-Language
、
Authorization
、
From
、
Host
、
If-Modified-Since
、
If-Match
、
If-None-Match
、
If-Range
、
If-Range
、
If-Unmodified-Since
、
Max-Forwards
、
Proxy-Authorization
、
Range
、
Referer
、
User-Agent
。对请求头域的扩展要求通讯双方都支持,如果存在不支持的请求头域,一般将会作为实体头域处理。
典型的请求消息
GEThttp://class/download.microtool.de:80/somedata.exe
Host:download.microtool.de
Accept:*/*
Pragma:no-cache
Cache-Control:no-cache
Referer:http://class/download.microtool.de/
User-Agent:Mozilla/4.04[en](Win95;I;Nav)
Range:bytes=554554-
Host
头域
Host
头域指定请求资源的
Intenet
主机和端口号,必须表示请求
url
的原始服务器或网关的位置。
HTTP/1.1
请求必须包含主机头域,否则系统会以
400
状态码返回。
Referer
头域
Referer
头域允许客户端指定请求
uri
的源资源地址,这可以允许服务器生成回退链表,可用来登陆、优化
cache
等。他也允许废除的或错误的连接由于维护的目的被追踪。如果请求的
uri
没有自己的
uri
地址,
Referer
不能被发送。如果指定的是部分
uri
地址,则此地址应该是一个相对地址。
Range
头域
Range
头域可以请求实体的一个或者多个子范围。
但是服务器可以忽略此请求头,如果无条件
GET
包含
Range
请求头,响应会以状态码
206
(
PartialContent
)返回而不是以
200
(
OK
)。
User-Agent
头域
User-Agent
头域的内容包含发出请求的用户信息。
响应消息
响应消息的第一行为下面的格式:
HTTP-VersionSPStatus-CodeSPReason-PhraseCRLF
,
HTTP-Version
表示支持的
HTTP
版本,例如为
HTTP/1.1
。
Status-Code
是一个三个数字的结果代码。
Reason-Phrase
给
Status-Code
提供一个简单的文本描述。
Status-Code
主要用于机器自动识别,
Reason-Phrase
主要用于帮助用户理解。
Status-Code
的第一个数字定义响应的类别,后两个数字没有分类的作用。第一个数字可能取
5
个不同的值:
1xx:
信息响应类,表示接收到请求并且继续处理
2xx:
处理成功响应类,表示动作被成功接收、理解和接受
3xx:
重定向响应类,为了完成指定的动作,必须接受进一步处理
4xx:
客户端错误,客户请求包含语法错误或者是不能正确执行
5xx:
服务端错误,服务器不能正确执行一个正确的请求
响应头域允许服务器传递不能放在状态行的附加信息,这些域主要描述服务器的信息和
Request-URI
进一步的信息。响应头域包含
Age
、
Location
、
Proxy-Authenticate
、
Public
、
Retry-After
、
Server
、
Vary
、
Warning
、
WWW-Authenticate
。对响应头域的扩展要求通讯双方都支持,如果存在不支持的响应头域,一般将会作为实体头域处理。