HTTP 协议


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

Internet的基本协议是TCP/IP协议,在TCP/IP模型最上层的是应用层(Application layer),它包含所有高层的协议。高层协议有:文件传输协议FTP、电子邮件传输协议SMTP、域名系统服务DNS、网络新闻传输协议NNTP和HTTP协议等。

?? 在地址栏中键入:http://www.google.com/ 就代表用http用户协议来访问指定位置的信息。
??
?? HTTP是工作流程
一次HTTP操作称为一个事务,其工作过程可分为四步:
(1)首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作就开始了。
(2)连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
(3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
(4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
??? ?
??? http 由请求与响应两部分组成。
??? ?
??? 1,请求报文
???????? 请求行(request line)、请求头部(header)、空行和请求数据4个部分组成
????????????? 格式:

???????????????? 请求方法 URL http协议版本?? (请求行)

??????????????????? User-Agent:产生请求的浏览器类型。

??????????????????? Accept:客户端可识别的内容类型列表。?????? (请求头部)

??????????????????? Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。

???????????????????? …..
?????????????????????????? 空的一行
?????????????????????????? 请求数据(post方法才有)

??? HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。最常用的GET方法和POST方法。

??? get 主要用于请求服务器传来数据,适用于参数不多的页面,故其没有请求数据段,它传的参数在请求行的URL中传递,而post主要向服务器传数据,适用于大量参数的页面,它的参数存储于请求数据中,故在请求行的URL中不用再带参。这也是用get方法url会显示参数,而post却不会的原因所在。

??? (1)get

??? GET /books/?name=Professional%20Ajax HTTP/1.1??????? (请求行)

??? Host: www.wrox.com???????????????????????????????????????????????????????? (请求头部)

??? User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)

??? Gecko/20050225 Firefox/1.0.1

??? Connection: Keep-Alive

??? 请求行

??? 请求行的第一部分说明了该请求是GET请求。该行的第二部分是一个斜杠/books/,用来说明请求的是该域名的/books目录。该行的最后一部分说明使用的是HTTP 1.1版本(另一个可选项是1.0)。再配合host就是所要的位置。

??? 请求头部

?????????? 第2行是请求的第一个首部,HOST。首部HOST将指出请求的目的地。结合HOST和上一行中的斜杠(/books),可以通知服务器请求的是? www.wrox.com/books(HTTP 1.1才需要使用首部HOST,而原来的1.0版本则不需要使用)。
?????????? 第三行中包含的是首部 User-Agent,服务器端和客户端脚本都能够访问它,它是浏览器类型检测逻辑的重要基础。该信息由你使用的浏览器来定义(在本例中是 Firefox 1.0.1),并且在每个请求中将自动发送。最后一行是首部Connection,通常将浏览器操作设置为Keep-Alive(当然也可以设置为其他值,但这已经超出了本书讨论的范围)。注意,在最后一个首部之后有一个空行。即使不存在请求主体,这个空行也是必需的。

??? (2)post

??? POST / HTTP/1.1?????????????????????????????? (请求行)

??? Host: www.wrox.com/???????????????????? ? ? (请求头部)

??? User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)

??? Gecko/20050225 Firefox/1.0.1

??? Content-Type: application/x-www-form-urlencoded??????? ?

??? Content-Length: 40????????????????????? ?

??? Connection: Keep-Alive

??? name=Professional%20Ajax&publisher=Wiley????????????????????? ( 请求数据)

??? 首部Host和User-Agent仍然存在,在后面有两个新行。其中首部Content-Type说明了请求主体的内容是如何编码的。浏览器始终以application/ x-www- form- urlencoded的格式编码来传送数据,这是针对简单URL编码的MIME类型。首部Content-Length说明了请求主体的字节数。在首部Connection后是一个空行,再后面就是请求主体。与大多数浏览器的POST请求一样,这是以简单的“名称?值”对的形式给出的,其中 name是Professional Ajax,publisher是Wiley。你可以以同样的格式来组织URL的查询字符串参数。

??? HTTP响应

???? 与请求不同点就在于请求行!

??? 如下所示,HTTP响应的格式与请求的格式十分类似:

??? <status-line>

??? <headers>

??? <blank line>

??? [<response-body>]

??? 正如你所见,在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。以下就是一个HTTP响应的例子:

??? HTTP/1.1 200 OK

??? Date: Sat, 31 Dec 2005 23:59:59 GMT

??? Content-Type: text/html;charset=ISO-8859-1

??? Content-Length: 122

??? <html>

??? <head>

??? <title>Wrox Homepage</title>

??? </head>

??? <body>

??? <!– body goes here –>

??? </body>

??? </html>

??? 在本例中,状态行给出的HTTP状态代码是200,以及消息OK。状态行始终包含的是状态码和相应的简短消息,以避免混乱。最常用的状态码有:

??? ◆200 (OK): 找到了该资源,并且一切正常。

??? ◆304 (NOT MODIFIED): 该资源在上次请求之后没有任何修改。这通常用于浏览器的缓存机制。

??? ◆ 401 (UNAUTHORIZED): 客户端无权访问该资源。这通常会使得浏览器要求用户输入用户名和密码,以登录到服务器。

??? ◆403 (FORBIDDEN): 客户端未能获得授权。这通常是在401之后输入了不正确的用户名或密码。

??? ◆404 (NOT FOUND): 在指定的位置不存在所申请的资源。

??? 在状态行之后是一些首部。通常,服务器会返回一个名为Data的首部,用来说明响应生成的日期和时间(服务器通常还会返回一些关于其自身的信息,尽管并非是必需的)。接下来的两个首部大家应该熟悉,就是与POST请求中一样的Content-Type和 Content-Length。在本例中,首部Content-Type指定了MIME类型HTML(text/html),其编码类型是ISO- 8859-1(这是针对美国英语资源的编码标准)。响应主体所包含的就是所请求资源的HTML源文件(尽管还可能包含纯文本或其他资源类型的二进制数据)。浏览器将把这些数据显示给用户。

??? 注意,这里并没有指明针对该响应的请求类型,不过这对于服务器并不重要。客户端知道每种类型的请求将返回什么类型的数据,并决定如何使用这些数据。

头部
? 在页面中可通过meta设置如:<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″ />

HTTP的头域包括通用头,请求头,响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。

通用头域

??? 通用头域包含请求和响应消息都支持的头域,通用头域包含Cache-Control、 Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。对通用头域的扩展要求通讯双方都支持此扩展,如果存在不支持的通用头域,一般将会作为实体头域处理。

(1)Cache-Control头域(请求和应答通用头域)
Cache -Control指定请求和响应遵循的缓存机制。不要缓存的实体,要求现在从WEB服务器去取,在请求消息或响应消息中设置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消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
禁止页面缓存,:

?????????????????????????? request.setCharacterEncoding(“GB2312”);//设置编码
?????????????????????????? ((HttpServletResponse)response).setHeader(“Pragma”,”No-cache”);
?????????????????????????? ((HttpServletResponse)response).setHeader(“Cache-Control”,”no-cache”);
?????????????????????????? ((HttpServletResponse)response).setHeader(“Expires”,”0″);//禁止缓存

(2)Connection
?Connection:请求:close(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,断开连接,不要等待本次连接的后续请求了)。
keepalive(告诉WEB服务器或者代理服务器,在完成本次请求的响应后,保持连接,等待本次连接的后续请求)。
响应:close(连接已经关闭)。
keepalive(连接保持着,在等待本次连接的后续请求)。
Keep-Alive:如果浏览器请求保持连接,则该头部表明希望 WEB 服务器保持连接多长时间(秒)。
例如:Keep-Alive:300

(3)Pragma 主要使用 Pramga: no-cache,相当于 Cache-Control: no-cache。
例如:Pragma:no-cache
(4)Transfer-Encoding: WEB 服务器表明自己对本响应消息体(不是消息体里面的对象)作了怎样的编码,比如是否分块(chunked)。例如:Transfer-Encoding: chunked

(5)Via? 列出从客户端到 最终服务器 或者相反方向的响应经过了哪些代理服务器,他们用什么协议(和版本)发送的请求。
当客户端请求到达第一个代理服务器时,该服务器会在自己发出的请求里面添加 Via 头部,并填上自己的相关信息,当下一个代理服务器
收到第一个代理服务器的请求时,会在自己发出的请求里面复制前一个代理服务器的请求的Via 头部,并把自己的相关信息加到后面,
以此类推,当 OCS 收到最后一个代理服务器的请求时,检查 Via 头部,就知道该请求所经过的路由。
例如:Via:1.0 236-81.D07071953.sina.com.cn:80 (squid/2.6.STABLE13)

请求头域

请求头域可能包含下列字段Accept、Accept- Charset、Accept-Encoding、Accept-Language、Authorization、From、Host、If- Modified-Since、If-Match、If-None-Match、If-Range、If-Unmodified- Since、Max-Forwards、Proxy-Authorization、Range、Referer、User-Agent。对请求头域的扩展要求通讯双方都支持,如果存在不支持的请求头域,一般将会作为实体头域处理。

(1)Accept:告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type。
(2)Accept-Charset: 浏览器申明自己接收的字符集
(3)Accept-Encoding: 浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)
(4)Accept-Language::浏览器申明自己接收的语言. 跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等。

(5)Authorization:当客户端接收到来自WEB服务器的 WWW-Authenticate 响应时,用该头部来回应自己的身份验证信息给WEB服务器。
(6)Proxy-Authorization:浏览器响应代理服务器的身份验证请求,提供自己的身份信息。

(7)Host头域
Host头域:客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号。例如:Host:rss.sina.com.cn,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。

(8)User-Agent: 浏览器表明自己的身份(是哪种浏览器)。
例如:User-Agent:Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14

(9)If-Modified-Since:如果请求的对象在该头部指定的时间之后修改了,才执行请求的动作(比如返回对象),否则返回代码304,告诉浏览器该对象没有修改。例如:If-Modified-Since:Thu, 10 Apr 2008 09:14:42 GMT

(10)If-Unmodified- Sincee:如果请求的对象在该头部指定的时间之后没修改过,才执行请求的动作(比如返回对象)。

(11)If-Match:如果对象的 ETag 没有改变,其实也就意味著对象没有改变,才执行请求的动作。
(12)If-None-Match:如果对象的 ETag 改变了,其实也就意味著对象也改变了,才执行请求的动作。

(13)If-Range:浏览器告诉 WEB 服务器,如果我请求的对象没有改变,就把我缺少的部分给我,如果对象改变了,就把整个对象给我。浏览器通过发送请求对象的 ETag 或者 自己所知道的最后修改时间给 WEB 服务器,让其判断对象是否改变了。总是跟 Range 头部一起使用。

(14)Referer:浏览器向 WEB 服务器表明自己是从哪个 网页/URL 获得/点击 当前请求中的网址/URL,这可以允许服务器生成回退链表,可用来登陆、优化cache等,例如:Referer:http://www.sina.com/

响应头域

响应头域允许服务器传递不能放在状态行的附加信息,这些域主要描述服务器的信息和Request-URI进一步的信息。响应头域包含Age、 Location、Proxy-Authenticate、Public、Retry-After、Server、Vary、Warning、WWW- Authenticate。对响应头域的扩展要求通讯双方都支持,如果存在不支持的响应头域,一般将会作为实体头域处理。。

(1)Content-Encoding:WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。
例如:Content-Encoding:gzip
(2)Content-Language:WEB 服务器告诉浏览器自己响应的对象的语言。
(3)Content-Length: WEB 服务器告诉浏览器自己响应的对象的长度。
例如:Content-Length: 26012
(4)Content-Range: WEB 服务器表明该响应包含的部分对象为整个对象的哪个部分。
例如:Content-Range: bytes 21010-47021/47022
(5)Content-Type: WEB 服务器告诉浏览器自己响应的对象的类型。
例如:Content-Type:application/xml

(6)Age:当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。

(7)Location:用于重定向接收者到一个新URI地址。WEB 服务器告诉浏览器,试图访问的对象已经被移到别的位置了,到该头部指定的位置去取。(redirect 就是利用此location,传回一个状态码及要请求的url,url放在location中)

(8)Proxy-Authenticatee: 代理服务器响应浏览器,要求其提供代理身份验证信息。

(9)Server: WEB 服务器表明自己是什么软件及版本等信息。此域能包含多个产品标识和注释,产品标识一般按照重要性排序。例如:Server:Apache/2.0.61 (Unix)

(10)Vary: WEB服务器用该头部的内容告诉 Cache 服务器,在什么条件下才能用本响应所返回的对象响应后续的请求。假如源WEB服务器在接到第一个请求消息时,其响应消息的头部为:Content-Encoding: gzip; Vary: Content-Encoding那么 Cache 服务器会分析后续请求消息的头部,检查其 Accept-Encoding,是否跟先前响应的 Vary 头部值一致,即是否使用相同的内容编码方法,这样就可以防止 Cache 服务器用自己 Cache 里面压缩后的实体响应给不具备解压能力的浏览器。例如:Vary:Accept-Encoding

(11)Location响应头Location响应头用于重定向接收者到一个新URI地址。

实体
请求消息和响应消息都可以包含实体信息,实体信息一般由实体头域和实体组成。实体头域包含关于实体的原信息,实体头包括
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方法发送的请求介质类型 Content-Range实体头

Content-Range实体头:用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式:

Content-Range: bytes-unit SP first-byte-pos -last-byte-pos/entity-legth
例如,传送头500个字节次字段的形式:Content-Range: bytes 0-499/1234 如果一个http消息包含此节(例如,对范围请求的响应或对一系列范围的重叠请求),Content-Range表示传送的范围,Content- Length表示实际传送的字节数。

Range:浏览器(比如 Flashget 多线程下载时)告诉 WEB 服务器自己想取对象的哪部分。可以请求实体的一个或者多个子范围。例如,
表示头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(Partial Content)返回而不是以200
例如:Range: bytes=1173546-

ETag:就是一个对象(比如URL)的标志值,就一个对象而言,比如一个 html 文件,如果被修改了,其 Etag 也会别修改,所以,ETag 的作用跟 Last-Modified 的作用差不多,主要供 WEB 服务器判断一个对象是否改变了。比如前一次请求某个 html 文件时,获得了其 ETag,当这次又请求这个文件时,浏览器就会把先前获得的 ETag 值发送给WEB 服务器,然后 WEB 服务器会把这个 ETag 跟该文件的当前 ETag 进行对比,然后就知道这个文件有没有改变了。

Last-Modified:WEB 服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等。例如:Last-Modified:Tue, 06 May 2008 02:42:43 GMT

Expired:WEB服务器表明该实体将在什么时候过期,对于过期了的对象,只有在跟WEB服务器验证了其有效性后,才能用来响应客户请求。
是 HTTP/1.0 的头部。例如:Expires:Sat, 23 May 2009 10:02:12 GMT(11) Last-Modified:WEB 服务器认为对象的最后修改时间,比如文件的最后修改时间,动态页面的最后产生时间等等。
例如:Last-Modified:Tue, 06 May 2008 02:42:43 GMT

使用Visual Sniffer( 用于拦截通过网络传输的TCP/IP/UDP/ICMP等数据包的一个工具),它可以监测到通过本机的使用HTTP协议交互的数据。