您的位置:首页 > 理论基础 > 计算机网络

文章5:HTTP协议大汇总

2012-11-22 15:10 417 查看
欢迎转载,转载请注明出处 /article/1653028.html
本文章写于2012/11/22日,目的汇总接下来一段时间遇到和学到的HTTP协议的内容,最终整理出一篇完整的详尽的HTTP学习文档。供自己使用,也供他人学习。
这篇文章主要是对于HTTP协议进行一个汇总学习,每一部分我都列出了参考文章的来源,并且在每个关键词上链接到RFC2616官方文档。
内容介绍:

0.序
一 讲述HTTP消息构成及头部域详解
二完整的HTTP通信过程
三HTTP协议的主要特点
四HTTP消息官方文档
五示例
六附录
<头域详细介绍>
<请求方法详细介绍>+GET与POST区别
<状态码详细介绍>
0.序

1. TCP/IP分层结构http://softbbs.pconline.com.cn/9431424.html

TCP/IP的层次结构和工作原理,我们就不详细介绍了,这里就针对HTTP进行一下说明:简单的说HTTP协议是应用层协议,通过下层传输层的TCP进行可靠连接,网络层IP选路,链路层Ethernet II,最后在物理上以位(Bit)进行传输。
应用层 -------------HTTP
传输层 -------------TCP
网络层 -------------IP
链路层 -------------Ethernet II
HTTP协议是基于TCP进行可靠连接的。

一 讲述HTTP消息构成及头部域详解
来源 http://hi.baidu.com/zaeymrtzvobkrvq/item/81f190fabdd9721dff35825d 官方 HTTP Message
0.概述:

HTTP消息包含请求消息和响应消息。消息的构成为:起始行(请求行或响应行)、头域(一个或者多个)、空行、消息体(可有可无)。
起始行之请求行:请求方法 请求URI HTTP版本
起始行之响应行:HTTP版本 状态码 描述
头域包含通用头、请求头、响应头、实体头四个部分。
HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。
HTTP消息包含client到server的请求消息和server到client的响应消息。
这两种类型的消息由一个起始行、一个或者多个头域(Message Headers)、一个指示头域结束的空行和一个可选的消息体(Message
Body)组成。


generic-message = start-line
*(message-header CRLF)
CRLF
[ message-body ]
start-line = Request-Line | Status-Line
HTTP的头域包括通用头、请求头、响应头和实体头四个部分。
每个头域有一个“域名:域值”三部分构成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被拓展为多行,在每行开始处,使用至少一个空格或制表符。这些头部域的发送或接收的顺序不是很重要,但最好是:先general-header字段,在请求头或响应头,最后是实体头。
1.通用头域
通用头域包含请求和响应消息都支持的头域,通用头域包含Cache-Control、ConnectionDatePragmaTransfer-EncodingUpgradeVia。对通用头域的扩展要求通讯双方都支持此扩展,如果存在不支持的通用头域,一般将会作为实体头域处理。
2.请求头域
请求头域允许客户端向服务器传递关于请求或者关于客户机的附加信息。请求头域可能包含下列字段 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。对请求头域的扩展要求通讯双方都支持,如果存在不支持的请求头域,一般将会作为实体头域处理。
3.响应头域
响应头域允许服务器传递不能放在状态行的附加信息,这些域主要描述服务器的信息和Request-URI进 一步的信息。响应头域包含Age、Location、Proxy-Authenticate、Public、Retry-After、Server、 Vary、Warning、WWW-Authenticate。对响应头域的扩展要求通讯双方都支持,如果存在不支持的响应头域,一般将会作为实体头域处理。
4.实体头域
实 体头域包含关于实体的原信息,实体头包括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定义



二完整的HTTP通信过程 来源http://madbluesky.iteye.com/blog/348637
一次完整的http通信过程中,web浏览器与web服务器之间将完成以下七个步骤:
1。 建立TCP连接。在http连接之前web浏览器首先要通过网络与服务器要建立连接,该连接是通过tcp协议来完成的。http协议是比TCP更高层次的协议,根据规则只有低层次的协议建立好之后才能建立更高层次的连接,所以首先建立tcp连接。
2。发送请求命令。一旦建立了tcp连接,web浏览器就可以向http服务器发送请求命令。
例如:GET/sample/hello.jsp HTTP/1.1
GET 表示请求的方式为GET,/sample/hello.jsp 表示请求的资源的uri,HTTP/1.1表示http协议的版本。
3。头信息形式发送一些其他信息。web浏览器发送请求命令后还要以头信息的形式向向web服务器发送一些别的信息,之后浏览器发送一空白行来通知服务器头信息以发送完毕。头信息在“一
讲述HTTP消息构成及头部域详解”已经详细讲述。
消息头以空行表示结束,消息头后面可接消息体(可选的)如:name=xiaoming&sex=1

4。web 服务器应答。客户机发送请求后,服务器将向客户机回送应答。
例如:HTTP/1.1 200 OK
HTTP/1.1 表示http协议的版本,200表示响应状态码,ok为响应状态码的文字描述信息。

5。web服务器发送应答头信息
6。web服务器向客户机发送数据。
7。web服务器关闭tcp连接。

三HTTP协议的主要特点可概括如下:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

四HTTP消息官方文档 HTTP Message

五示例



六:附录
<头域详细介绍>

1.通用头域详细介绍:

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

Date头域
Date头域表示消息发送的时间,时间的描述格式由rfc822定义
2.请求头域详细介绍:
Host头域
Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。
Referer头域
Referer头域允许客户端指定请求uri的源资源地址,这可以允许服务器生成回退链表,可用来登陆、优化cache等。他也允许废除的或错误的连接由于维护的目的被追踪。如果请求的uri没有自己的uri地址,Referer不能被发送。如果指定的是部分uri地址,则此地址应该是一个相对地址
Range头域
Range头域可以请求实体的一个或者多个子范围。例如,
表示头500个字节:bytes=0-499
表示第二个500字节:bytes=500-999
表示最后500个字节:bytes=-500
表示500字节以后的范围:bytes=500-
第一个和最后一个字节:bytes=0-0,-1
同时指定几个范围:bytes=500-600,601-999
但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200(OK)。
User-Agent头域

User-Agent头域的内容包含发出请求的用户信息。
请求头字段的具体含义
Accept:浏览器可接受的MIME类型。
Accept-Charset:浏览器可接受的字符集。
Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。
Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。
Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。
Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到 请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一 点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入 ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。
Content-Length:表示请求消息正文的长度。
Cookie:设置cookie,这是最重要的请求头信息之一
From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。
Host:初始URL中的主机和端口。
If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not Modified”应答。
Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。
Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。
UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。
3.响应头域详细介绍:
Location响应头
Location响应头用于重定向接收者到一个新URI地址。
Server响应头
Server响应头包含处理请求的原始服务器的软件信息。此域能包含多个产品标识和注释,产品标识一般按照重要性排序。Example:Server: CERN/3.0 libwww/2.17

4.实体头域详细介绍:
Content-Type实体头
Content-Type 实体头用于向接收方指示实体的介质类型,对于HEAD方法送到接收方的实体介质类型必须由GET发送请求。格式: Content-Type = "Content-Type" ":" media-type 示例:Content-Type: text/html; charset=ISO-8859-4
Content-Range实体头
用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式:
Content-Range:bytes-unit SP first-byte-pos - last-byte-pos/entity-legth
例如,传送头500个字节次字段的形式:Content-Range:bytes0-499/1234如果一个http消息包含此节(例如,对范围请求的 响应或对一系列范围的重叠请求),
Content-Range表示传送的范围,Content-Length表示实际传送的字节数。
举例:
HTTP/1.1 206 Partial content
Date: Wed, 15 Nov 1995 06:25:24 GMT
Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
Content-Range: bytes 21010-47021/47022
Content-Length: 26012
Content-Type: image/gif
Content-Length实体头
Content-length指示发送给接收者的实体大小。格式:Content-Length = "Content-Length" ":" 1*DIGIT 示例:Content-Length: 3495
Applications SHOULD use this field to indicate the transfer-length of the message-body, unless this is prohibited by the rules in section 4.4.

Any Content-Length greater than or equal to zero is a valid value. Section 4.4 describes how to determine the length of a message-body if a Content-Length is not given.

Note that the meaning of this field is significantly different from the corresponding definition in MIME, where it is an optional field used within the "message/external-body" content-type. In HTTP, it SHOULD be sent whenever the message's length can be
determined prior to being transferred, unless this is prohibited by the rules in section 4.4.
Last-modified实体头
Last-modified实体头指定服务器上保存内容的最后修订时间

实体头字段的具体含义
Allow 服务器支持哪些请求方法(如GET、POST等)。
Content-Encoding 文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档 的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。
Content-Length 表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。
Content-Type 表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。
Date 当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。
Expires 应该在什么时候认为文档已经过期,从而不再缓存它?
Last-Modified 文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not
Modified)
状态。If-Modified-Since示例:
If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT

Location 表示客户应当到哪里去提取文档。Location用于将请求重定向到接受者的某个位置,而不是原来的请求uri。
Refresh 表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面。
注意这种功能通常是通过设置HTML页面HEAD区的<META HTTP-EQUIV="Refresh" C>实现,这是因为,自动刷新或重定向对于那些不能使用CGI或Servlet的HTML编写者十分重要。但是,对于Servlet来说,直接设置 Refresh头更加方便。
注意Refresh的意义是“N秒之后刷新本页面或访问指定页面”,而不是“每隔N秒刷新本页面或访问指定页面”。因此,连续刷新要求每次都发送一个 Refresh头,而发送204状态代码则可以阻止浏览器继续刷新,不管是使用Refresh头还是<META HTTP-EQUIV="Refresh" ...>。
注意Refresh头不属于HTTP 1.1正式规范的一部分,而是一个扩展,但Netscape和IE都支持它。

<请求方法详细介绍>

请求方法

GET 请求获取Request-URI所标识的资源

POST 在Request-URI所标识的资源后附加新的数据

HEAD 请求获取由Request-URI所标识的资源的响应消息报头

PUT 请求服务器存储一个资源,并用Request-URI作为其标识

DELETE 请求服务器删除Request-URI所标识的资源

TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断

CONNECT 保留将来使用

OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求

GET与POST区别:

1)数据的位置 Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML
HEADER内提交

2)数据的大小 GET方式提交的数据最多只能有1024字节,而POST则没有此限制。

3)数据的安全性 安全性问题。正如在(1)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好

4)表单提交中 get是从服务器上获取数据,post是向服务器传送数据

请求头示例

以下是 HTTP 请求的简单示例。

GET /articles/news/today.asp HTTP/1.1

Accept: */*

Accept-Language: en-us

Connection: Keep-Alive

Host: localhost

Referer: http://localhost/links.asp

User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)

Accept-Encoding: gzip, deflate

该请求具有请求行,其中包括方法 (GET)、资源路径 (/articles/news/today.asp) 和 HTTP 版本 (HTTP/1.1)。由于该请求没有正文,故所有请求行后面的内容都是头的一部分。紧接着头之后是一个空行,表示头已结束。
响应头示例

Web 服务器可以通过多种方式响应前一个请求。假设文件是可以访问的,并且用户具有查看该文件的权限,则响应类似于:

HTTP/1.1 200 OK

Server: Microsoft-IIS/5.0

Date: Thu, 13 Jul 2000 05:46:53 GMT

Content-Length: 2291

Content-Type: text/html

Set-Cookie: ASPSESSIONIDQQGGGNCG=LKLDFFKCINFLDMFHCBCBMFLJ; path=/

Cache-control: private

...

响应的第一行称为状态行。它包含响应所用的 HTTP 版本、状态编码 (200) 和原因短语。示例中包含一个头,其中具有五个字段,接着是一个空行(回车和换行符),然后是响应正文的头两行。
<状态码详细介绍>

状态码

状态码表示响应类型,常用的有:

1××  保留
1xx:信息响应类,表示接收到请求并且继续处理

2××  表示请求成功地接收  2xx:处理成功响应类,表示动作被成功接收、理解和接受

3××  为完成请求客户需进一步细化请求 3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理

4××  客户错误
4xx:客户端错误,客户请求包含语法错误或者是不能正确执行

5××  服务器错误
5xx:服务端错误,服务器不能正确执行一个正确的请求

在我们抓到的数据包中,状态码是200,表明请求是成功接受请求。

100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部分。(HTTP
1.1新)

101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议(HTTP
1.1新

200 OK 一切正常,对GET和POST请求的应答文档跟在后面。

201 Created 服务器已经创建了文档,Location头给出了它的URL。

202 Accepted 已经接受请求,但处理尚未完成。

203 Non-Authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝(HTTP
1.1新)。

204 No Content 没有新文档,浏览器应该继续显示原来的文档。

205 Reset Content 没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容(HTTP
1.1新)。

206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它(HTTP
1.1新)。

300 Multiple Choices 客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。

301 Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。

302 Found 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。注意,在HTTP1.0中对应的状态信息是“Moved
Temporatily”,出现该状态代码时,浏览器能够自动访问新的URL,因此它是一个很有用的状态代码。注意这个状态代码有时候可以和301替换使 用。例如,如果浏览器错误地请求http://host/~user(缺少了后面的斜杠),有的服务器返回301,有的则返回302。严格地说,我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。请参见307。

303 See Other 类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取(HTTP
1.1新)。

304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。

305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取(HTTP
1.1新)。

307 Temporary Redirect 和302(Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时
才能重定向。由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只 能跟随对GET请求的重定向。(HTTP 1.1新)

400 Bad Request 请求出现语法错误。

401 Unauthorized 客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。

403 Forbidden 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。

404 Not Found 无法找到指定位置的资源。这也是一个常用的应答,

405 Method Not Allowed 请求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)对指定的资源不适用。(HTTP
1.1新)

406 Not Acceptable 指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容(HTTP
1.1新)。

407 Proxy Authentication Required 类似于401,表示客户必须先经过代理服务器的授权。(HTTP
1.1新)

408 Request Timeout 在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求。(HTTP
1.1新)

409 Conflict 通常和PUT请求有关。由于请求和资源的当前状态相冲突,因此请求不能成功。(HTTP
1.1新)

410 Gone 所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。它和404的不同在于,返回407表示文档永久地离开了指定的位置,而404表示由于未知的原因文档不可用。(HTTP
1.1新)

411 Length Required 服务器不能处理请求,除非客户发送一个Content-Length头。(HTTP
1.1新)

412 Precondition Failed 请求头中指定的一些前提条件失败(HTTP
1.1新)。

413 Request Entity Too Large 目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求,则应该提供一个Retry-After头(HTTP
1.1新)。

414 Request URI Too Long URI太长(HTTP
1.1新)。

416 Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头。(HTTP
1.1新)

500 Internal Server Error 服务器遇到了意料不到的情况,不能完成客户的请求。

501 Not Implemented 服务器不支持实现请求所需要的功能。例如,客户发出了一个服务器不支持的PUT请求。

502 Bad Gateway 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。

503 Service Unavailable 服务器由于维护或者负载过重未能应答。

504 Gateway Timeout 由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答。(HTTP
1.1新)

505 HTTP Version Not Supported 服务器不支持请求中所指明的HTTP版本
http://course.cug.edu.cn/cugfourth/jsjyyjch/book2/Chapter02/2.4.4.4.htm TCP协议的窗口机制
http://softbbs.pconline.com.cn/9431424.html

http://blog.csdn.net/metasearch/article/details/2147213
http://hi.baidu.com/zaeymrtzvobkrvq/item/81f190fabdd9721dff35825d 怎样学习HTTP才能熟悉HTTP
http://madbluesky.iteye.com/blog/348637
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: