HTTP
HTTP是一个由请求与响应组成的客户端与服务端交互协议。浏览器发送一个HTTP请求到指定的URL地址,持有此URL地址的WEB服务器将返回一个HTTP请求。请求的类型有GET, POST, HEAD, PUT, DELETE, OPTIONS和TRACE等。
HTTP操作模式与客户端/服务器通信
HTTP只关心一个功能:从web服务器到web客户端的超文本文件以及其他文件的传输。
从通信的角度来看,客户端主要负责发送请求给服务器,服务器对请求作出响应。相比FTP和SMTP这样需要多个通信步骤和命令/响应序列的应用层协议,HTTP更像BOOTP和ARP。
基本的HTTP客户端/服务器通信
最简单的HTTP操作包括一个使用web浏览器的HTTP客户端,和一个HTTP服务器,通常称为web服务器。在TCP连接创建之后,以下两步通信过程如下:
- 客户端请求:HTTP客户端根据HTTP协议标准发送HTTP请求信息,该信息指定客户端想要获取的资源或包括准备提供给服务器的信息。
- 服务器响应:服务器读取并解释该请求。对请求作出相应行为并创建HTTP响应信息,发回给客户端。响应信息包括该请求是否成功,也包括客户端请求的资源内容。
HTTP消息格式
使用HTTP的设备通信都是通过HTTP消息来完成,其中只有两种类型:请求和响应。
客户端通常发送请求和接收响应,服务器接收请求和发送响应。
信息使用的是文本的形式。
常规HTTP消息格式如下所示:
<起始行>
<首部字段>
<空白行>
[<主体>]
[<尾部>]
- 起始行包含消息的类型。请求消息中,这一行以方式的形式表明消息为请求类型,并制定一个URI(Uniform Resource Identifier)指明请求的对象资源。响应通过起始行来表明请求响应的状态信息。
- 首部字段HTTP定义了多种类型的首部字段。通过功能分组,除了主机头以外,几乎所有首部字段都是可选的。格式如下:
: 。 - 主体也是可选的,包含客户端和服务器通信所需的一系列信息,如响应的详细错误消息。更加常见的是承载文件或其他资源,HTTP标准中称为实体。由于大多数客户端请求服务器发送文件或其他资源,实体在响应信息中最为常见。
- 尾部,HTTP/1.1默认使用永久链接,消息在服务器与客户端之间以流的形式传输,需要标记消息的结束点和开始点。
HTTP请求消息
客户端通过打开一个TCP连接发起与服务器的HTTP会话,之后发送HTTP请求信息。
起始行
主要有三个用途:
- 表明客户端想要进行的命令或行为
- 指定行为想要获取的资源
- 告知服务器客户端使用的HTTP版本
起始行的语法为:
<METHOD><request-uri><HTTP-VERSION>
METHOD
method就是客户端想要服务器做什么,三种比较常用:GET,HEAD和POST。
- GET:从服务器向客户端发送发送命名资源
- PUT:将来自客户端的数据存储到一个命名的服务器资源中去
- DELETE:从服务器中删除命名资源
- POST:将客户端数据发送到一个服务器网关应用程序
- HEAD:仅发送命名资源响应中的HTTP首部
RequestURI
Request URI是请求所申请资源的URI。目前URI通常值符合Web URL语法的HTTP URL。有趣的是,HTTP起始行所使用的URL形式通常与HTML文件或用户输入的不同。这是因为一个完整URL中的部分信息是用来控制HTTP本身的。这是用户和HTTP客户端通信所需,而不包括在客户端对服务器的请求中。在请求中指定资源的标准方式是在起始行中加入路径和文件名(以及可选的查询信息),同时在主机头字段指定主机。
例如:假设用户输入URL:http://www.myfavoritewebsite.com:8080/chatware/chatroom.php,我们不需要发送http:到服务器。客户端将余下的信息拆分成URI /chatware/chatroom.php主机行会包括www.myfavoritewebsite.com:8080。
因此,请求的开始内容如下:
GET /chatware/chatroom.php HTTP/1.1
Host: www.myfavoritewebsite.com:8080
这一准则的例外是当请求对象是代理服务器时。这时请求就要使用完整URL的形式,以使代理可以作为初始客户端来处理该请求。请求如下所示:
GET http://www.myfavoritewebsite.com:8080/chatware/chatroom.php HTTP/1.1
请求首部
在请求首部,提供给服务器关于请求的详细信息。
所有请求首部都使用相同的结构,但按照以下功能分类:
- 普通报头 普通报头通常指消息本身,通常用于控制其处理过程或提供给接收方额外信息。这类报头不限于请求或响应信息,所以两者都可能出现。同样,也与所承载的实体没有特别关系。
- 请求报头 这类报头告知服务器关于客户端请求的更多信息,给予客户端更多关于请求处理的控制。例如,一些请求报头用于指定条件请求,只有在特定条件时才执行。其他告诉服务器响应信息中客户端能够徐立的格式或编码。
如:
- Accept 告诉服务器端,接受哪些类型的信息。
- Accept-Encoding 可接受的内容编码。
- Accept-Lanague 指定一种自然语言。
Connection 表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时显著地减少下载所需要的时间。
Cookie 最重要的请求头信息之一, 每次请求时都会携带上Cookie以方便服务器端识别是否是同一个客户端。
Host host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来。
User-Agent用户代理,一般情况是浏览器。我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了客户端操作系统的名称和版本,所使用的浏览器的名称和版本,实际上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息。User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。
HTTP响应
每一个HTTP客户端发送给服务器请求都会要求服务器发回响应信息。在特定情况下,服务器会发回两条响应,一条初步响应和一条实际上的响应。一般,一个请求产生一个响应,表明服务器对于该请求的处理结果,并且响应往往消息主体还携带一个实体(文件或资源)。 响应消息格式如下:
<状态行>
<响应首部>
<响应实体>
状态行
状态行是响应信息的起始行,作用有两个:告知客户端服务器使用的协议版本以及沟通客户端请求的处理结果。状态行语法格式如下:
<HTTP-VERSION><status-code><reason-phrase> ### HTTP版本 状态行中的HTTP-VERSION标签与请求信息中的目的一样。服务器要求返回的版本号不得高于客户端发送的版本号。
响应码和文本描述
状态码和文本描述提供客户端请求处理结果的信息。服务器通过3位数字状态码告知客户端处理结果。目的是为了方便客户端HTTP软件采取合适的行动。文本描述将服务器响应显示给客户端用户。
状态代码由 3 位数字组成, 表示请求是否被理解或被满足,状态描述给出了关于状态码的简短的文字描述。状态码的第一个数字定义了响应类别,后面两位数字没有具体分类。第一个数字有5 种取值,如下所示。
1xx:指示信息——表示请求已经接受,继续处理
2xx:成功——表示请求已经被成功接收、理解、接受。
3xx:重定向——要完成请求必须进行更进一步的操作
4xx:客户端错误——请求有语法错误或请求无法实现
5xx:服务器端错误——服务器未能实现合法的请求。 常见状态代码、状态描述、说明:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
响应首部
响应首部可能包括:
- Location(重定向)Location响应报头域用于重定向接受者到一个新的位置。例如:客户端所请求的页面已不存在原先的位置,为了让客户端重定向到这个页面新的位置,服务器端可以发回Location响应报头后使用重定向语句,让客户端去访问新的域名所对应的服务器上的资源。当我们在JSP中使用重定向语句的时候,服务器端向客户端发回的响应报头中,就会有Location响应报头域。
- Server响应头 Server响应头包含处理请求的原始服务器的软件信息。此域能包含多个产品标识和注释,产品标识一般按照重要性排序。它和User-Agent请求报头域是相对应的,前者发送服务器端软件的信息,后者发送客户端软件(浏览器)和操作系统的信息。下面是Server响应报头域的一个例子:Server: Apache-Coyote/1.1
- 实体头 请求消息和响应消息都可以包含实体信息,实体信息一般由实体头域和实体组成。实体头域包含关于实体的原信息,实体头包括Allow、Content- Base、Content-Encoding、Content-Language、Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、 Etag、Expires、Last-Modified、extension-header。
- extension-header允许客户端定义新的实体头,但是这些域可能无法未接受方识别。实体可以是一个经过编码的字节流,它的编码方式由Content-Encoding或Content-Type定义,它的长度由Content-Length或Content-Range定义。
- Content-Type实体头用于向接收方指示实体的介质类型,指定HEAD方法送到接收方的实体介质类型,或GET方法发送的请求介质类型,如:”application/octet-stream”。
- Last-modified:实体头指定服务器上保存内容的最后修订时间。
- Accept-Ranges:这个字段说明Web服务器是否支持Range(是否支持断点续传功能),如果支持,则返回
- Accept-Ranges: bytes,如果不支持,则返回Accept-Ranges: none。
- Content-Encoding:文档的编码(Encode)方法。它的值指示了已经被应用到实体正文的附加内容编码,因而要获得Content- Type报头域中所引用的媒体类型,必须采用相应的解码机制。Content-Encoding主要用语记录文档的压缩方法,下面是它的一个例子: Content-Encoding: gzip。如果一个实体正文采用了编码方式存储,在使用之前就必须进行解码。
- Expires: 给出响应过期的日期和时间。通常,代理服务器或浏览器会缓存一些页面。当用户再次访问这些页面时,直接从缓存中加载并显示给用户,这样缩短了响应的时间,减少服务器的负载。为了让代理服务器或浏览器在一段时间后更新页面,我们可以使用Expires实体报头域指定页面过期的时间。当用户又一次访问页面时,如果Expires报头域给出的日期和时间比Date普通报头域给出的日期和时间要早(或相同),那么代理服务器或浏览器就不会再使用缓存的页面而是从服务器上请求更新的页面。不过要注意,即使页面过期了,也并不意味着服务器上的原始资源在此时间之前或之后发生了改变。
- Refresh:表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader(“Refresh”, “5; URL=http://host/path”)让浏览器读取指定的页面。 注意这种功能通常是通过设置HTML页面HEAD区的<META HTTP-EQUIV=”Refresh” CONTENT=”5;URL=http://host/path”>实现。
- Allow:服务器支持哪些请求方法(如GET、POST等)。
- Content-Disposition:打开一个网页时,浏览器会首先看是否有Content-Disposition: attachment这一项,当是“Content-Disposition: attachment”时是下载,“Content-Disposition:inline”是在线打开文件
下面是一个响应消息
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
HTTP方法
GET
GET方法请求服务器检索由该HTTP请求中的URL指定的资源并在回复中发给客户端。这是最基本的请求类型,也是占大多数的HTTP数据流。当你输入一个常规URL或点击一个文档中的链接,通常就是提示Web浏览器发送GET请求。
对于GET的处理取决于若干因素。如果URL正确并且服务器能够找到资源,会发送合适的响应给客户端。返回资源需取决于请求对象的特性。如果无法妥当处理请求,则会产生一个错误信息。在使用缓存的情况下,代理服务器甚至客户端自己就可以满足请求。对于某种特定报头如 If-Modified-Since 或 If-Match, GET请求的含义可能随之而改变,要求服务器仅在满足特定条件时发送资源。这类请求称为条件GET。类似的,客户端可以使用Range头来要求服务器仅发送部分资源。这类请求称为部分GET。
HEAD
HEAD方法同GET,但告知服务器不要发送消息实体。客户端通常使用这种方法来检查资源是否存在,状态,或文件大小,再决定是否需要服务器发送整个文件。HEAD请求的处理与GET相同,除了只返回头部而不返回实际的资源之外。
POST
POST方法允许客户端发送任意数据的实体到服务器以进行处理。它通常同于客户端提交例如交互式HTML信息给服务器程序,之后服务器作出行动并发回响应。这种方法用于各种在线进程。请求中的URL指定服务器上接受数据的程序名。
PUT
这种方法请求服务器将请求中的实体保存在请求中的URL里。PUT中,URI指明请求中的实体,因而PUT能够让文件复制到服务器,在GET请求中文件能够被复制到客户端。与之相反,POST中URI标识的程序处理请求中的实体,因此通常应用于交互式程序。PUT用法很多,如上传内容到网站,这种情况下必须加以认证。但是,在站点上存储文件通常使用其他方式,如FTP。
TRACE
客户端通过这种方法接收发至服务器的请求,用于诊断目的。