﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-woaidongmao-随笔分类-HTTP &amp; URL</title><link>http://www.cppblog.com/woaidongmao/category/11721.html</link><description>文章均收录自他人博客，但不喜标题前加-[转贴]，因其丑陋，见谅！~</description><language>zh-cn</language><lastBuildDate>Tue, 08 Sep 2009 16:04:14 GMT</lastBuildDate><pubDate>Tue, 08 Sep 2009 16:04:14 GMT</pubDate><ttl>60</ttl><item><title>反向代理简介----服务器的代理</title><link>http://www.cppblog.com/woaidongmao/archive/2009/09/08/95620.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Tue, 08 Sep 2009 14:44:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/09/08/95620.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/95620.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/09/08/95620.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/95620.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/95620.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="TEXT-INDENT: 24pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0; mso-pagination: widow-orphan"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">代理服务器是使用非常普遍的一种将局域网主机联入互联网的一种方式，使用代理上网可以节约紧缺的<span lang=EN-US>IP</span>地址资源，而且可以阻断外部主机对内部主机的访问，使 内部网主机免受外部网主机的攻击。但是，如果想让互联网上的主机访问内部网的主机资源（例如：<span lang=EN-US>Web</span>站点），又想使内部网主机免受外部网主机攻击，一般的 代理服务是不能实现的，需要使用反向代理来实现。 <span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">　　本文将详细介绍反向代理服务的概念以及如何利用反向代理服务器提高<span lang=EN-US>WEB</span>服务器的性能和安全性。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><strong><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">　　一．反向代理的概念</span></strong><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">　　什么是反向代理呢？其实，反向代理也就是通常所说的<span lang=EN-US>WEB</span>服务器加速，它是一种通过在繁忙的<span lang=EN-US>WEB</span>服务器和<span lang=EN-US>Internet</span>之间增加一个高速的<span lang=EN-US>WEB</span>缓冲服务器（即：<span lang=EN-US>WEB</span>反向代理服务器）来降低实际的<span lang=EN-US>WEB</span>服务器的负载。典型的结构如下图所示：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/79b01314d280_13F8F/clip_image001_2.jpg"><img title=clip_image001 style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=264 alt=clip_image001 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/79b01314d280_13F8F/clip_image001_thumb.jpg" width=234 border=0 v:shapes="_x0000_i1025"></a><o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">　　<span lang=EN-US>Web</span>服务器加速（反向代理）是针对<span lang=EN-US>Web</span>服务器提供加速功能的。它作为代理<span lang=EN-US>Cache</span>，但并不针对浏 览器用户，而针对一台或多台特定<span lang=EN-US>Web</span>服务器（这也是反向代理名称的由来）。实施反向代理（如上图所示），只要将<span lang=EN-US>Reverse Proxy Cache</span>设备放置在一台或多台<span lang=EN-US>Web</span>服务器前端即可。当互联网用户访问某个<span lang=EN-US>WEB</span>服务器时，通过<span lang=EN-US>DNS</span>服务器解析后的<span lang=EN-US>IP</span>地址是<span lang=EN-US>Reverse Proxy Server</span>的<span lang=EN-US>IP</span>地址<span lang=EN-US>,</span>而非原始<span lang=EN-US>Web</span>服务器的<span lang=EN-US>IP</span>地址<span lang=EN-US>,</span>这时<span lang=EN-US>Reverse Proxy Server</span>设备充当<span lang=EN-US>Web</span>服务器，浏览器可以与它连接，无需再直接与<span lang=EN-US>Web</span>服务器相连。因此，大量<span lang=EN-US>Web</span>服务工作量被卸载到反向代理服务上。不但能够防 止外部网主机直接和<span lang=EN-US>web</span>服务器直接通信带来的安全隐患，而且能够很大程度上减轻<span lang=EN-US>web</span>服务器的负担，提高访问速度。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><strong><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">　　二．<span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"></span><strong><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">反向代理和其它代理的比较</span></strong><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">　　下面将对几种典型的代理服务作一个简单的比较。在网络上常见的代理服务器有三种：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">　　<span lang=EN-US>1</span>． 标准的代理缓冲服务器<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">　　一个标准的代理缓冲服务被用于缓存静态的网页（例如：<span lang=EN-US>html</span>文件和图片文件等）到本地网络上的一台主机上（即代理服务器）。当被缓存的页面被第二次访问的时候，浏览器将直接从本地代理服务器那里获取请求数据而不再向原<span lang=EN-US>web</span>站点请求数据。这样就节省了宝贵的网络带宽，而且提高了访问速度。但是，要想实现这种方式，必须在每一个内部主机的浏览器上明确指明代理服务器的<span lang=EN-US>IP</span>地址和端口号。客户端上网时，每次都把请求送给代理服务器处理，代理服务器根据请求确定是否连接到远程<span lang=EN-US>web</span>服务器获取数据。如果在本地缓冲区有目标文件，则直接将文件传给用户即可。如果没有的话则先取回文件，先在本地保存一份缓冲，然后将文件发给客户端浏览器。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">　　<span lang=EN-US>2</span>． 透明代理缓冲服务器<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">　　透明代理缓冲服务和标准代理服务器的功能完全相同。但是，代理操作对客户端的浏览器是透明的（即不需指 明代理服务器的<span lang=EN-US>IP</span>和端口）。透明代理服务器阻断网络通信，并且过滤出访问外部的<span lang=EN-US>HTTP</span>（<span lang=EN-US>80</span>端口）流量。如果客户端的请求在本地有缓冲则将缓冲的数据 直接发给用户，如果在本地没有缓冲则向远程<span lang=EN-US>web</span>服务器发出请求，其余操作和标准的代理服务器完全相同。对于<span lang=EN-US>Linux</span>操作系统来说，透明代理使用<span lang=EN-US> Iptables</span>或者<span lang=EN-US>Ipchains</span>实现。因为不需要对浏览器作任何设置，所以，透明代理对于<span lang=EN-US>ISP</span>（<span lang=EN-US>Internet</span>服务器提供商）特别有用。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">　　<span lang=EN-US>3</span>． 反向代理缓冲服务器<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">　　反向代理是和前两种代理完全不同的一种代理服务。使用它可以降低原始<span lang=EN-US>WEB</span>服务器的负载。反向代理服务器承担了对原始<span lang=EN-US>WEB</span>服务器的静态页面的请求，防止原始服务器过载。它位于本地<span lang=EN-US>WEB</span>服务器和<span lang=EN-US>Internet</span>之间，处理所有对<span lang=EN-US>WEB</span>服务器的请求，阻止 了<span lang=EN-US>WEB</span>服务器和<span lang=EN-US>Internet</span>的直接通信。如果互联网用户请求的页面在代理服务器上有缓冲的话，代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向<span lang=EN-US>WEB</span>服务器发出请求，取回数据，本地缓存后再发送给用户。这种方式通过降低了向<span lang=EN-US>WEB</span>服务器的请求数从而降低了<span lang=EN-US>WEB</span>服务器的负载。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><strong><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">　　三．反向代理工作原理</span></strong><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><strong><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">　　</span></strong><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">反向代理服务器位于本地<span lang=EN-US>WEB</span>服务器和<span lang=EN-US>Internet</span>之间<span lang=EN-US>,</span>如下图所示：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/79b01314d280_13F8F/clip_image002_2.jpg"><img title=clip_image002 style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=284 alt=clip_image002 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/79b01314d280_13F8F/clip_image002_thumb.jpg" width=234 border=0 v:shapes="_x0000_i1026"></a><o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">　　当用户浏览器发出一个<span lang=EN-US>HTTP</span>请求时，通过域名解析将请求定向到反向代理服务器（如果要实现多个<span lang=EN-US>WEB </span>服务器的反向代理，需要将多个<span lang=EN-US>WEB</span>服务器的域名都指向反向代理服务器）。由反向代理服务器处理器请求。反向代理一般只缓存可缓冲的数据（比如<span lang=EN-US>html</span>网 页和图片等），而一些<span lang=EN-US>CGI</span>脚本程序或者<span lang=EN-US>ASP</span>之类的程序不缓存。它根据从<span lang=EN-US>WEB</span>服务器返回的<span lang=EN-US>HTTP</span>头标记来缓冲静态页面。有四个最重要<span lang=EN-US>HTTP</span>头标 记：<span lang=EN-US><o:p></o:p></span></span></p>
<ul type=disc>
    <li class=MsoNormal style="LINE-HEIGHT: 150%; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Last-Modified: </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">告诉反向代理页面什么时间被修改 <span lang=EN-US><o:p></o:p></span></span>
    <li class=MsoNormal style="LINE-HEIGHT: 150%; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Expires: </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">告诉反向代理页面什么时间应该从缓冲区中删除 <span lang=EN-US><o:p></o:p></span></span>
    <li class=MsoNormal style="LINE-HEIGHT: 150%; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Cache-Control: </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">告诉反向代理页面是否应该被缓冲 <span lang=EN-US><o:p></o:p></span></span>
    <li class=MsoNormal style="LINE-HEIGHT: 150%; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Pragma: </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">告诉反向代理页面是否应该被缓冲<span lang=EN-US>. <o:p></o:p></span></span></li>
</ul>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">例如：在默认情况下，<span lang=EN-US>ASP</span>页面返回<span lang=EN-US>&#8221; Cache-control: private.&#8221; </span>，所以<span lang=EN-US>ASP</span>页面时不会在反向代理服务器缓存的</span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"></span>&nbsp;</p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"></span>&nbsp;</p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 12pt 6pt 6pt; LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">反向代理服务器（<span lang=EN-US>Reverse Proxy Server</span>）一般被置于源服务器的前端，如图中所示。它配备有大容量的内存和高速磁盘，用于缓存客户的请求，所以反向代理服务器又称为加速服务器。 <span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 12pt 6pt 6pt; WORD-BREAK: break-all; LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 12pt 6pt 6pt; WORD-BREAK: break-all; LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/79b01314d280_13F8F/clip_image001_4.jpg"><img title=clip_image001 style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=249 alt=clip_image001 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/79b01314d280_13F8F/clip_image001_thumb_1.jpg" width=209 border=0 v:shapes="_x0000_i1025"></a><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 12pt 6pt 6pt; WORD-BREAK: break-all; LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">图<span lang=EN-US>:</span>反向代理服务器<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 12pt 6pt 6pt; WORD-BREAK: break-all; LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">对于客户送过来的请求，反向代理服务器的工作方式如下：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 0cm 6pt 0pt 32.25pt; WORD-BREAK: break-all; TEXT-INDENT: -18pt; LINE-HEIGHT: 150%; mso-pagination: widow-orphan; mso-list: l4 level1 lfo1; tab-stops: list 36.0pt"><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: symbol; mso-bidi-font-family: symbol; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: symbol"><span style="mso-list: ignore">&#183;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">使用反向代理服务器后，客户端送过来的请求会首先送到反向代理服务器。 <span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 0cm 6pt 0pt 32.25pt; WORD-BREAK: break-all; TEXT-INDENT: -18pt; LINE-HEIGHT: 150%; mso-pagination: widow-orphan; mso-list: l4 level1 lfo1; tab-stops: list 36.0pt"><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: symbol; mso-bidi-font-family: symbol; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: symbol"><span style="mso-list: ignore">&#183;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">反向代理服务器先查自己缓存的内容（动态内容或静态内容）。 <span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 0cm 6pt 0pt 32.25pt; WORD-BREAK: break-all; TEXT-INDENT: -18pt; LINE-HEIGHT: 150%; mso-pagination: widow-orphan; mso-list: l4 level1 lfo1; tab-stops: list 36.0pt"><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: symbol; mso-bidi-font-family: symbol; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: symbol"><span style="mso-list: ignore">&#183;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">如果客户请求内容在缓存中，则直接将结果反馈给客户，此次请求完成。 <span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 0cm 6pt 0pt 32.25pt; WORD-BREAK: break-all; TEXT-INDENT: -18pt; LINE-HEIGHT: 150%; mso-pagination: widow-orphan; mso-list: l4 level1 lfo1; tab-stops: list 36.0pt"><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: symbol; mso-bidi-font-family: symbol; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: symbol"><span style="mso-list: ignore">&#183;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">如果客户请求内容不在缓存中，它会根据后面的各个<span lang=EN-US>HTTP</span>服务器（或内容服务器）的运行情况，做负载均衡处理，将请求进一步送到某个<span lang=EN-US>http </span>服务器（或内容服务器）。 <span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 0cm 6pt 0pt 32.25pt; WORD-BREAK: break-all; TEXT-INDENT: -18pt; LINE-HEIGHT: 150%; mso-pagination: widow-orphan; mso-list: l4 level1 lfo1; tab-stops: list 36.0pt"><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: symbol; mso-bidi-font-family: symbol; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: symbol"><span style="mso-list: ignore">&#183;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">后端服务器作处理后，反馈结果给反向代理服务器。 <span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 0cm 6pt 0pt 32.25pt; WORD-BREAK: break-all; TEXT-INDENT: -18pt; LINE-HEIGHT: 150%; mso-pagination: widow-orphan; mso-list: l4 level1 lfo1; tab-stops: list 36.0pt"><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: symbol; mso-bidi-font-family: symbol; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: symbol"><span style="mso-list: ignore">&#183;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">对于后端服务器反馈过来的结果，它会将结果缓存（动态内容或静态内容）起来，并进一步送给客户端，此次请求完成。 <span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 12pt 6pt 6pt; WORD-BREAK: break-all; LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">反向代理服务器通常要为一个请求同时维护两个会话：与客户端的会话和与后端服务器的对话。和普通的代理不同，反向代理服务器一般只代理一台或者有限的几台服务器，对于客户而言，反向代理服务器对于他们就相当于源服务器，对于源服务器而言，反向代理服务器通常就是唯一的客户，因为一般客户不和源服务器直接通信。典型情况下，源服务器对于客户或者客户对于源服务器，都是不可见的。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 0cm 6pt 0pt; WORD-BREAK: break-all; LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><strong><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">反向代理服务器的作用</span></strong><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> <span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 12pt 6pt 6pt; WORD-BREAK: break-all; LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">代理服务器起着客户机中继站的作用。它转发请求并接收响应，这使它成为高速缓存结果以便重用的理想场所。这类代理服务器称为高速缓存代理，它具有以下作用：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 0cm 6pt 0pt 32.25pt; WORD-BREAK: break-all; TEXT-INDENT: -18pt; LINE-HEIGHT: 150%; mso-pagination: widow-orphan; mso-list: l3 level1 lfo2; tab-stops: list 36.0pt"><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: symbol; mso-bidi-font-family: symbol; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: symbol"><span style="mso-list: ignore">&#183;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">加快对客户的响应时间，减轻后端源服务器（即内容服务器）负载 <span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 12pt 6pt 6pt; WORD-BREAK: break-all; LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">使用反向代理服务器后，由于它具有大容量缓存，可以缓存多个静态<span lang=EN-US>/</span>动态页面，当有客户请求送过来时，如能够直接在缓存中找到请求结果，就可以直接反馈给客户，而不用再将请求送给后端服务器。这样就加快了对客户的响应时间，同时也减轻了后端源服务器的负载。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 0cm 6pt 0pt 32.25pt; WORD-BREAK: break-all; TEXT-INDENT: -18pt; LINE-HEIGHT: 150%; mso-pagination: widow-orphan; mso-list: l2 level1 lfo3; tab-stops: list 36.0pt"><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: symbol; mso-bidi-font-family: symbol; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: symbol"><span style="mso-list: ignore">&#183;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">保障后端源服务器（即内容服务器）的安全 <span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 12pt 6pt 6pt; WORD-BREAK: break-all; LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">对<span lang=EN-US>Internet</span>上的客户端而言，它只能接触到反向代理服务器，因此反向代理服务器就成为后端服务器的屏障，保障了后端服务器的安全。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 0cm 6pt 0pt 32.25pt; WORD-BREAK: break-all; TEXT-INDENT: -18pt; LINE-HEIGHT: 150%; mso-pagination: widow-orphan; mso-list: l1 level1 lfo4; tab-stops: list 36.0pt"><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: symbol; mso-bidi-font-family: symbol; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: symbol"><span style="mso-list: ignore">&#183;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">减少源服务器（即内容服务器）节点之间占用的网络带宽 <span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 12pt 6pt 6pt; WORD-BREAK: break-all; LINE-HEIGHT: 150%; mso-pagination: widow-orphan"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">使用反向代理服务器后，它具有的大容量缓存可以减少源服务器的网络通讯量。这样就减少源服务器（即内容服务器）节点之间占用的网络带宽。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="BACKGROUND: white; MARGIN: 0cm 6pt 0pt 32.25pt; WORD-BREAK: break-all; TEXT-INDENT: -18pt; LINE-HEIGHT: 150%; mso-pagination: widow-orphan; mso-list: l0 level1 lfo5; tab-stops: list 36.0pt"><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: symbol; mso-bidi-font-family: symbol; mso-font-kerning: 0pt; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: symbol"><span style="mso-list: ignore">&#183;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">对源服务器进行负载均衡<span lang=EN-US>(Load Balance)</span>。 <span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">当后端源服务器有多个时，反向代理服务器可以根据后端各个服务器当前负载情况，做负载均衡处理，有选择的将当前请求送给最空闲的后端服务器。</span><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial"><o:p></o:p></span></p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/95620.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-09-08 22:44 <a href="http://www.cppblog.com/woaidongmao/archive/2009/09/08/95620.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入浅出URL编码</title><link>http://www.cppblog.com/woaidongmao/archive/2009/09/08/95602.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Tue, 08 Sep 2009 10:33:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/09/08/95602.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/95602.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/09/08/95602.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/95602.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/95602.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 版权声明：如有转载请求，请注明出处：http://blog.csdn.net/yzhz&nbsp; 杨争&nbsp;&nbsp; 一、问题：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编码问题是JAVA初学者在web开发过程中经常会遇到问题，网上也有大量相关的文章介绍，但其中很多文章并没有对URL中使用了中文等非ASCII的字符造成服务器后台程序解析出...&nbsp;&nbsp;<a href='http://www.cppblog.com/woaidongmao/archive/2009/09/08/95602.html'>阅读全文</a><img src ="http://www.cppblog.com/woaidongmao/aggbug/95602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-09-08 18:33 <a href="http://www.cppblog.com/woaidongmao/archive/2009/09/08/95602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Keep-Alive: timeout=5, max=100</title><link>http://www.cppblog.com/woaidongmao/archive/2009/09/08/95544.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Tue, 08 Sep 2009 03:17:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/09/08/95544.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/95544.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/09/08/95544.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/95544.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/95544.html</trackback:ping><description><![CDATA[<p style="LINE-HEIGHT: 150%"><span lang=EN-US>Keep-Alive: timeout=5, max=100<br>timeout</span>：过期时间<span lang=EN-US>5</span>秒（对应<span lang=EN-US>httpd.conf</span>里的参数是：<span lang=EN-US>KeepAliveTimeout</span>），<span lang=EN-US>max</span>过了<span lang=EN-US>100</span>秒，强制断掉连接<span lang=EN-US><o:p></o:p></span></p>
<p style="LINE-HEIGHT: 150%"><span style="COLOR: red">就是在<span lang=EN-US>timeout</span>时间内又有新的连接过来，同时<span lang=EN-US>max</span>会自动减<span lang=EN-US>1</span>，直到为<span lang=EN-US>0</span>，强制断掉</span>。见下面的四个图，注意看<span lang=EN-US>Date</span>的值（前后时间差都是在<span lang=EN-US>5</span>秒之内）！<span lang=EN-US><br><a title=01.bmp href="http://www.ourlinux.net/wp-content/uploads/2008/04/01.bmp"><span style="TEXT-DECORATION: none; text-underline: none"><span style="mso-ignore: vglayout"><img title=clip_image002 style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=62 alt=clip_image002 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/KeepAlivetimeout5max100_9E35/clip_image002_69a53d7d-e3d6-4dd6-a068-b4166e105cea.jpg" width=244 border=0 v:shapes="_x0000_i1025"></span></span></a><a title=02.bmp href="http://www.ourlinux.net/wp-content/uploads/2008/04/02.bmp"><br><span style="TEXT-DECORATION: none; text-underline: none"><span style="mso-ignore: vglayout"><img title=clip_image004 style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=64 alt=clip_image004 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/KeepAlivetimeout5max100_9E35/clip_image004_6fc097d3-8f88-44ee-a6c4-3d4dee6464cd.jpg" width=244 border=0 v:shapes="_x0000_i1026"></span></span></a><a title=03.bmp href="http://www.ourlinux.net/wp-content/uploads/2008/04/03.bmp"><br><span style="TEXT-DECORATION: none; text-underline: none"><span style="mso-ignore: vglayout"><img title=clip_image006 style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=61 alt=clip_image006 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/KeepAlivetimeout5max100_9E35/clip_image006_ff481ec5-0e24-443a-9222-b0b291e984bb.jpg" width=244 border=0 v:shapes="_x0000_i1027"></span></span></a><a title=04.bmp href="http://www.ourlinux.net/wp-content/uploads/2008/04/04.bmp"><br><span style="TEXT-DECORATION: none; text-underline: none"><span style="mso-ignore: vglayout"><img title=clip_image008 style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=63 alt=clip_image008 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/KeepAlivetimeout5max100_9E35/clip_image008_9e0c530d-55c9-44aa-9670-aae8818bf404.jpg" width=244 border=0 v:shapes="_x0000_i1028"></span></span></a><o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 9pt; LINE-HEIGHT: 150%; FONT-FAMILY: arial; mso-bidi-font-size: 10.0pt"><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/95544.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-09-08 11:17 <a href="http://www.cppblog.com/woaidongmao/archive/2009/09/08/95544.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>支持gzip的爬虫 gzip zlib deflate 相关介绍</title><link>http://www.cppblog.com/woaidongmao/archive/2009/09/07/95496.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Mon, 07 Sep 2009 13:58:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/09/07/95496.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/95496.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/09/07/95496.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/95496.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/95496.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">最近给</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">Httpdownload </span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">封装了支持</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">gzip</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">传输</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">&nbsp;<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">从</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">HTTP</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">的角度</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">1 </span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">客户端</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt"> </span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">在</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">http Request&nbsp; Header</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">上带上</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt"> Accept-Encoding:gzip,deflate<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">2</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">服务器若是支持</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">gzip</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">压缩则在</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">http reponse eader<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">部分返回</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">Content-Encoding: gzip </span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">或者</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">Content-Type: application/x-gzip<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">3</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">将</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">body</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">部分用</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">gzip</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">解压缩</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt"> </span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">则得到网页内容</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">.<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">传说中</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">ie</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">有</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">bug </span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">在处理</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">js css</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">压缩的时候有</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">bug,</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">我不理解</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt"> </span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">挺简单的怎么会有</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">bug</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">呢</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">.<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">从</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">gzip</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">的角度</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">gzip</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">是一种数据格式</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt"> </span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">默认且目前仅使用</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">deflate</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">算法压缩</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">data</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">部分</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">zlib</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">也是一种数据格式</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">,</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">使用</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">defalte</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">算法压缩数据部分</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">.<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">deflate</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">是一种压缩算法</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">,</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">是</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">huffman</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">编码的一种加强</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">zlib</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">是一个开源库</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">, </span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">提供</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">deflate</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">压缩和对应的</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">infalte</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">解压缩</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">.<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">不过</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">zlib</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">默认的</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">deflate infalte</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">默认是处理</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">zlib</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">格式数据</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">.</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">必须使用</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">deflateInit2(&amp;strm, DEFAULT_COMPRESSION,Z_DEFLATED, DEFAULT_WINDOWSIZE,DEFAULT_MEMLEVEL, Z_DEFAULT_STRATEGY);<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">初始化才是处理</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">raw deflate data.(</span><span style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">这一点在</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">zlib manul</span><span style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">没有提</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">,</span><span style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">在</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">faq</span><span style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">中提到</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">,</span><span style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">困扰了我好久</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">,</span><span style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">还是同事</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">L</span><span style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">帮我调试发现</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">)<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">至于</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">gzip</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">格式解析</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt"> </span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">对着</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">RFC</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">写就可以了</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">.<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">参见</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">RFC 1950 </span><span style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">关于</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">zlib http://www.faqs.org/rfcs/rfc1950.html<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 1951 </span><span style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">关于</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">deflate http://www.faqs.org/rfcs/rfc1951.html<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC 1952 </span><span style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">关于</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">gzip http://www.faqs.org/rfcs/rfc1952.html&nbsp; <o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt"><br>nt&nbsp; CGzip::Ungzip(const std::string &amp; inStr , std::string &amp;outStr){<br>&nbsp;&nbsp;&nbsp; static int nFileCount=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nFileCount++;<br>&nbsp;&nbsp;&nbsp; string strZipFileName="test";<br>//&nbsp;&nbsp;&nbsp; CConvert::StrToFile(inStr,strZipFileName+CConvert::toString&lt;int&gt;(nFileCount)+"H.gzip"<a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/gzipgzipzlibdeflate_134D0/clip_image001_2.gif"><img title=clip_image001 style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=22 alt=clip_image001 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/gzipgzipzlibdeflate_134D0/clip_image001_thumb.gif" width=22 border=0 v:shapes="_x0000_i1025"></a>;<br>&nbsp;&nbsp;&nbsp; if(inStr.length()&lt;11){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; //process gzip header<br>&nbsp;&nbsp;&nbsp; unsigned int skipCt = 10;<br>&nbsp;&nbsp;&nbsp; unsigned int skipZeroCt = 0;<br>&nbsp;&nbsp;&nbsp; unsigned char ID1 = inStr[0];<br>&nbsp;&nbsp;&nbsp; unsigned char ID2 = inStr[1];<br>&nbsp;&nbsp;&nbsp; unsigned char XFL=inStr[8];<br>&nbsp;&nbsp;&nbsp; bool bFEXTRA = false ;<br>&nbsp;&nbsp;&nbsp; bool bFNAME = false ;<br>&nbsp;&nbsp;&nbsp; bool bFCOMMENT = false ;<br>&nbsp;&nbsp;&nbsp; bool bFHCRC = false ;<br>&nbsp;&nbsp;&nbsp; unsigned int XLEN = 0;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; if( (ID1!=31) &amp;&amp; (ID2!=139)){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;&nbsp; //</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">非</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">gzip</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">头部</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; unsigned char CM = inStr[2];<br>&nbsp;&nbsp;&nbsp; if(CM!=<a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/gzipgzipzlibdeflate_134D0/clip_image002_2.gif"><img title=clip_image002 style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=22 alt=clip_image002 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/gzipgzipzlibdeflate_134D0/clip_image002_thumb.gif" width=22 border=0 v:shapes="_x0000_i1026"></a>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1; //</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">现在都只处理</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt"> deflate</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">压缩的</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt"><br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; unsigned char FLG = inStr[3];<br>&nbsp;&nbsp;&nbsp; if( (FLG &amp; GZIP_HEAD_FEXTRA) != 0){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bFEXTRA = true ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skipCt += 2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XLEN = inStr[10]+ inStr[11]*256 ;//</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 'Lucida Sans Unicode'; mso-font-kerning: 0pt; mso-ascii-font-family: 'Lucida Sans Unicode'; mso-hansi-font-family: 'Lucida Sans Unicode'">按照小端字节序列处理</span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skipCt += XLEN;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; if( (FLG &amp; GZIP_HEAD_FNAME) != 0){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bFNAME = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skipZeroCt++;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; if( (FLG &amp; GZIP_HEAD_FCOMMENT) != 0){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bFCOMMENT = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skipZeroCt++;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; size_t passedZeroCt = 0;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; size_t iStep = skipCt ;<br>&nbsp;&nbsp;&nbsp; for( size_t iStep =&nbsp; skipCt ; iStep&lt;inStr.length(); iStep++){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(passedZeroCt&gt;=skipZeroCt){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(inStr[iStep]==''<a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/gzipgzipzlibdeflate_134D0/clip_image001_4.gif"><img title=clip_image001 style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=22 alt=clip_image001 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/gzipgzipzlibdeflate_134D0/clip_image001_thumb_1.gif" width=22 border=0 v:shapes="_x0000_i1027"></a>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; passedZeroCt++;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; skipCt = iStep ;<br>&nbsp;&nbsp;&nbsp; if( (FLG &amp; GZIP_HEAD_FHCRC) != 0){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bFHCRC = true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skipCt+=2 ;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string coreStr = inStr.substr(skipCt,inStr.length()-8-skipCt);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return CGzip::Inflate(coreStr,outStr);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>}<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: white; LINE-HEIGHT: 18pt; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">&nbsp;<o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Lucida Sans Unicode'; mso-font-kerning: 0pt">int&nbsp; CGzip:<a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/gzipgzipzlibdeflate_134D0/clip_image003_2.gif"><img title=clip_image003 style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=18 alt=clip_image003 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/gzipgzipzlibdeflate_134D0/clip_image003_thumb.gif" width=18 border=0 v:shapes="_x0000_i1028"></a>ogzip(const std::string &amp; inStr , std::string &amp;outStr){<br>&nbsp;&nbsp;&nbsp; char pAddHead[10];<br>&nbsp;&nbsp;&nbsp; unsigned long crc = 0;<br>&nbsp;&nbsp;&nbsp; // gzip header<br>&nbsp;&nbsp;&nbsp; static const char deflate_magic[2] = {'37', '\213'};<br>&nbsp;&nbsp;&nbsp; snprintf(pAddHead, 10,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "%c%c%c%c%c%c%c%c%c%c", deflate_magic[0],<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deflate_magic[1], Z_DEFLATED, 0 /* flags */,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0, 0, 0, 0 /* 4 chars for mtime */,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 /* xflags */, 0xff);<br>&nbsp;&nbsp;&nbsp; string addHead(pAddHead,10);<br>&nbsp;&nbsp;&nbsp; //gzip's raw deflate body<br>&nbsp;&nbsp;&nbsp; if(CGzip:<a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/gzipgzipzlibdeflate_134D0/clip_image003_4.gif"><img title=clip_image003 style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; DISPLAY: inline; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=18 alt=clip_image003 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/gzipgzipzlibdeflate_134D0/clip_image003_thumb_1.gif" width=18 border=0 v:shapes="_x0000_i1029"></a>eflate(inStr,outStr)&lt;0){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return - 1;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; //gzip trailer<br>&nbsp;&nbsp;&nbsp; crc = crc32(crc, (const Bytef*)inStr.data(), inStr.length());<br>&nbsp;&nbsp;&nbsp; char&nbsp; tailBuf[8];<br>&nbsp;&nbsp;&nbsp; memcpy(tailBuf, &amp;crc, 4);<br>&nbsp;&nbsp;&nbsp; int isize=inStr.size();<br>&nbsp;&nbsp;&nbsp; memcpy(tailBuf,&amp;isize,4);<br>&nbsp;&nbsp;&nbsp; string tailStr(tailBuf , 8 );<br>&nbsp;&nbsp;&nbsp; outStr = addHead + outStr+tailStr;&nbsp;&nbsp;&nbsp;&nbsp; //<br>&nbsp;&nbsp;&nbsp; return outStr.length(); //</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: black; FONT-FAMILY: arial; mso-bidi-font-size: 10.0pt"><o:p></o:p></span></p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/95496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-09-07 21:58 <a href="http://www.cppblog.com/woaidongmao/archive/2009/09/07/95496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP协议相关概述</title><link>http://www.cppblog.com/woaidongmao/archive/2009/09/04/95298.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 04 Sep 2009 06:09:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/09/04/95298.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/95298.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/09/04/95298.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/95298.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/95298.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">HTTP</span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">协议被设计得非常强大，但很多网络应用都没有利用这些强大之处。比如缓存和<span lang=EN-US>HTTP</span>方法。<span lang=EN-US>HTTP</span>为资源的增删改查分别提供了<span lang=EN-US> PUT,DELETE,POST,GET</span>等方法，确没有人用。所以，最近兴起的<span lang=EN-US>Restful</span>只是对优化<span lang=EN-US>web</span>架构、充分利用<span lang=EN-US>HTTP</span>协议的能力的一个回 归。下面是一些<span lang=EN-US>HTTP</span>协议的概述：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">消息：<span lang=EN-US>HTTP</span>协议中顶级数据单位，使用<span lang=EN-US>HTTP</span>协议通信的机器之间来回发送的数据包<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">实体：只出现在有消息体的消息中。它按照实体<span lang=EN-US>header</span>定义的格式和编码进行传输。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">方法：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">OPTIONS </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：客户端查询服务器对与某<span lang=EN-US>URL</span>允许的通信选项<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">GET </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：从服务器获取<span lang=EN-US>URL</span>对应的资源<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">HEAD </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：除了服务器响应中不能包含消息体，该方法与<span lang=EN-US>GET</span>一样。用于只需少数元信息的情况<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">POST </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：被设计用来注解、修改<span lang=EN-US>URL</span>所对应的资源<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">PUT </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：被设计用来修改或创建资源。当<span lang=EN-US>URL</span>对应的资源存在时，则提交的作为新版本，否则新建资源<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">DELETE </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：被设计用来删除<span lang=EN-US>URL</span>对应的资源<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">TRACE </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：主要用来测试。服务器将最终接收到的请求本身发送回来，作为客户端诊断依据<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">CONNECT </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：保留的方法名，用于代理切换隧道<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">header</span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">特殊参数：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="TEXT-INDENT: 24pt; LINE-HEIGHT: 150%; mso-char-indent-count: 2.0"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">q </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：在大多的各种<span lang=EN-US>header</span>值中，都可以看到一个名为<span lang=EN-US>q=0.2</span>、<span lang=EN-US>q=0.7</span>之类的参数。因为发送<span lang=EN-US>header</span>主要是一个和服务器的协商过程，所以能允许的选项一般不只一个，但具体哪个优先呢？这就需要为一些选项制定权重值。<span lang=EN-US>q</span>参数的值是一个从<span lang=EN-US>0</span>到<span lang=EN-US>1</span>的浮点数，默认是<span lang=EN-US>1</span>，为<span lang=EN-US>0</span>表示客户端无法接收，小数点后 不能超过<span lang=EN-US>3</span>位。另外，<span lang=EN-US>header</span>的多个值之间用逗号分隔而不是分号。比如这个<span lang=EN-US>header</span>：<span lang=EN-US>Accept:audio/*;q=0.2,audio /basic</span>，这表示客户端告诉服务器&#8220;我最喜欢的是一个<span lang=EN-US>audio/basic</span>类型的音频<span lang=EN-US>(</span>因为它没有设置<span lang=EN-US>q</span>参数，默认是<span lang=EN-US>1</span>），但如果没有，给我一个任 意类型<span lang=EN-US>(audio/*)</span>的音频也行&#8221;。当然，这只是<span lang=EN-US>q</span>参数一个比较简单的应用。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">常规<span lang=EN-US>header </span>：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Cache-Control </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：用于指出请求<span lang=EN-US>/</span>响应链上所有缓存必须服从的指令，它必须具有穿透各代理和网关的能力。<span lang=EN-US>HTTP1.0</span>可能不支持该<span lang=EN-US>header</span>和<span lang=EN-US>Pragma</span>：<span lang=EN-US>no-cache</span>。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Connection </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：允许客户端指出希望特定连接的选项，且禁止由代理在将来的连接中通讯 <span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Date </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：表示消息发生的日期和时间，与<span lang=EN-US>RFC 822</span>中的<span lang=EN-US>orig-date</span>语义一致 <span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Pragma </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：用来包括实现特定的指令，可能应用到请求<span lang=EN-US>/</span>响应链上所有接收方<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Trailer </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：指出给出的头部域集合在以<span lang=EN-US>chunked transfer-coding</span>编码的消息的尾部中存在<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Transfer-Encoding </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：指出应用什么类型的转换到消息主体上，与<span lang=EN-US>content-coding</span>不同，这不是指定实体的属性而是消息的<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Upgrade </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：允许客户端指出其支持的其他通讯协议，切愿意使用之，若服务器发现切换是可行的，必须在响应中回<span lang=EN-US>101<o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Via </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：必须由网关或代理来指出请求中的<span lang=EN-US>UA</span>和服务器、以及在响应中的原始服务器和客户端的中间协议和接收方。用于跟踪消息转发，避免请求循环<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Warning </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：用户携带关于消息的状态和转换的额外信息，可能不在消息中反映。一般用于警告应用到消息实体上的缓存操作或转换缺少语义透明度<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">请求<span lang=EN-US>header</span>：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Accept </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：客户端指出响应可以接受的媒体类型<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Accept-Charset </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：客户端指出响应可以接受的字符集<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Accept-Encoding </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：客户端指出响应可以接受的字符编码<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Accept-Language </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：客户端指出允许的语言<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Authorization </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：客户端在受到<span lang=EN-US>401</span>后，需要向服务器标明身份，包括此<span lang=EN-US>header</span>即可<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Expect : </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">客户端指出要求的特殊服务器行为。若服务器无法满足，可以返回<span lang=EN-US>417<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">From :<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Host : </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">客户端指出要请求的资源的因特网主机和端口号<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">If-Match : </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">用于与方法一起使其条件化<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">If-Modified-Since : </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">用于方法使其条件化，如果请求的变量在本域指定的时间从来不曾修改过，则实体将不会从服务器返回，改为<span lang=EN-US>304 <o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">If-None-Match : </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">用于与方法一起使其条件化<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">If-Range : </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">用于与方法一起使其条件化<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">If-Unmodified-Since : </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">用于与方法一起使其条件化，如果请求的资源自<span lang=EN-US>header</span>值时间以来未改变，则服务器执行该请求<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Max-Forwards : </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">提供某种机制，<span lang=EN-US>TRACE</span>和<span lang=EN-US>OPTIONS</span>方法用来限制可以转发给下个入界服务器代理或网关的数量，相当于客户端跟踪请求链<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Proxy-Authorization : </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">允许客户端向代理标识自己，该代理需要认证<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Range : </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">字节范围，可以指定单个实体中单个字节范围或范围集<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Referer : </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">允许服务器为感兴趣的资源、日志、优化缓存等生成向后链接清单<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">TE : </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">指出愿意在响应中接受任何扩展的<span lang=EN-US>transfer-coding<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">User-Agent : </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">包含发起请求的用户代理（浏览器和<span lang=EN-US>OS</span>）的信息<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">响应<span lang=EN-US>header</span>：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Accept-Ranges </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：服务器指出对请求的资源可接受的范围，可以是字节数或<span lang=EN-US>none<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Age </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：<span lang=EN-US>HTTP</span>使用改<span lang=EN-US>header</span>来传输从缓存服务器获取时的响应消息的估计年龄，是缓存服务器估计从响应产生或被原始服务器重新证实以来的总时间<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">ETag </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：提供所请求的实体标签的当前值<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Location </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：用来重定向接收<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">方到非<span lang=EN-US>URI</span>的位置来完成请求。对于<span lang=EN-US>201</span>，<span lang=EN-US>Location</span>是由请求创建的新资源的标识<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Proxy-Authenticate </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：该<span lang=EN-US>header</span>必须作为<span lang=EN-US>407</span>响应的一部分，指出认证方案和可应用到代理的<span lang=EN-US>URI</span>上的参数 <span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Retry-After </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：能与<span lang=EN-US>503</span>响应一起用于指出希望该服务对客户端可以维持多久，<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Server </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：指出服务器使用的软件信息<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Vary </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">WWW-Authenticate </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：必须包括在<span lang=EN-US>401</span>中，值至少有<span lang=EN-US>challenge</span>组成，它指出认证方案和可应用到<span lang=EN-US>URI</span>的参数<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">实体<span lang=EN-US>header</span>：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Allow </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：客户端指出对<span lang=EN-US>URI</span>的资源允许的方法<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Content-Encoding : </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">用作对<span lang=EN-US>media-type</span>的修饰符，其值将必须应用到实体<span lang=EN-US>body</span>上的额外内容编码。主要用来允许压缩而不丢失下层媒体类型标识<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Content-Language : </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">客户端指出自己所选的语言，指出目标观众对所封装实体的自然语言。这可能与实体<span lang=EN-US>body</span>内所有语言相同<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Content-Length </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：指出实体<span lang=EN-US>body</span>按十进制数的字节流的尺寸<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Content-Location </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：如果实体能从独立于请求<span lang=EN-US>URI</span>的位置访问，则服务器可以提供该实体自己的位置<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Content-MD5 </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：是实体<span lang=EN-US>body</span>的<span lang=EN-US>MD5</span>摘要，以便提供端到端的完整性检查<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Content-Range </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：与实体<span lang=EN-US>body</span>的一部分一起发送，用来指定该部分<span lang=EN-US>body</span>应用到全部<span lang=EN-US>body</span>的哪个地方<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Content-Type </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：指出发送给接收方的实体<span lang=EN-US>body</span>的媒体类型，媒体类型参见<span lang=EN-US>IANA<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Expires </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：指出响应被认为过期的日期<span lang=EN-US>/</span>时间<span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">Last-Modified </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：指出原始服务器认为该变量最后修改的日期和时间，确实意思取决于原是服务器的实现和资源的属性。对文件，可能只是文件系统内最后修改时间 <span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">extension-header </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">状态码：<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">100 : Continue<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">101 : Switching Protocols<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">200 : OK<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">201 : Created<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">202 : Accepted<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">203 : Non-Authoritative Information<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">204 : No Content<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">205 : Reset Content<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">206 : Partial Content<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">300 : Multiple Choices<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">301 : Moved Permanently<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">302 : Found<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">303 : See Other<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">304 : Not Modified<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">305 : Use Proxy<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">307 : Temporary Redirect<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">400 : Bad Request<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">401 : Unauthorized<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">402 : Payment Required<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">403 : Forbidden<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">404 : Not Found<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">405 : Method Not Allowed<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">406 : Not Acceptable<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">407 : Proxy Authentication Required<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">408 : Request Time-out<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">409 : Conflict<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">410 : Gone<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">411 : Length Required<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">412 : Precondition Failed<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">413 : Request Entity Too Large<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">414 : Request-URI Too Large<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">415 : Unsupported Media Type<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">416 : Requested range not satisfiable<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">417 : Expectation Failed<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">500 : Internal Server Error<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">501 : Not Implemented<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">502 : Bad Gateway<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">503 : Service Unavailable<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">504 : Gateway Time-out<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">505 : HTTP Version not supported<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">extension-code<o:p></o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="LINE-HEIGHT: 150%"><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial">关键字：<span lang=EN-US>HTTP<o:p></o:p></span></span></p>
<p class=MsoNormal><span lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: arial"><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/95298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-09-04 14:09 <a href="http://www.cppblog.com/woaidongmao/archive/2009/09/04/95298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于http的Last-Modified</title><link>http://www.cppblog.com/woaidongmao/archive/2009/09/04/95293.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 04 Sep 2009 03:47:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2009/09/04/95293.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/95293.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2009/09/04/95293.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/95293.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/95293.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="LINE-HEIGHT: 150%"><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">1) </span><span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体">什么是<span lang=EN-US>&#8221;Last-Modified&#8221;? <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>在浏览器第一次请求某一个<span lang=EN-US>URL</span>时，服务器端的返回状态会是<span lang=EN-US>200</span>，内容是你请求的资源，同时有一个<span lang=EN-US>Last-Modified</span>的属性标记此文件在服务期端最后被修改的时间，格式类似这样：<span lang=EN-US>&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Last-Modified: Fri, 12 May 2006 18:53:33 GMT <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><font color=#ff0000>客户端第二次请求此<span lang=EN-US>URL</span>时，根据<span lang=EN-US> HTTP </span>协议的规定，浏览器会向服务器传送<span lang=EN-US> If-Modified-Since </span>报头，询问该时间之后文件是否有被修改过：</font><span lang=EN-US><font color=#ff0000>&nbsp;<br></font><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><font color=#ff0000>如果服务器端的资源没有变化，则自动返回<span lang=EN-US> HTTP 304 </span>（<span lang=EN-US>Not Changed.</span>）状态码，内容为空，这样就节省了传输数据量。</font>当服务器端代码发生改变或者重启服务器时，则重新发出资源，返回和第一次请求时类似。从而保证不向客户端重复发出资源，也保证当服务器有变化时，客户端能够得到最新的资源。<span lang=EN-US>&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2) </span>什么是<span lang=EN-US>&#8221;Etag&#8221;? <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP </span>协议规格说明定义<font color=#ff0000><span lang=EN-US>ETag</span>为<span lang=EN-US>&#8220;</span>被请求变量的实体值<span lang=EN-US>&#8221; </span>（参见<span lang=EN-US> —— </span>章节<span lang=EN-US> 14.19</span>）。<span lang=EN-US>&nbsp;</span>另一种说法是，<span lang=EN-US>ETag</span>是一个可以与<span lang=EN-US>Web</span>资源关联的记号（<span lang=EN-US>token</span>）。</font>典型的<span lang=EN-US>Web</span>资源可以一个<span lang=EN-US>Web</span>页，但也可能是<span lang=EN-US>JSON</span>或<span lang=EN-US>XML</span>文档。服务器单独负责判断记号是什么及其含义，并在<span lang=EN-US>HTTP</span>响应头中将其传送到客户端，以下是服务器端返回的格式：<span lang=EN-US>&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=#ff0000>ETag: "50b<st1:chmetcnv unitname="C" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">1c</st1:chmetcnv>1d<st1:chmetcnv unitname="F" sourcevalue="4" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">4f</st1:chmetcnv><st1:chmetcnv unitname="C" sourcevalue="775" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">775c</st1:chmetcnv>61:df3" <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span><font color=#ff0000>客户端的查询更新格式是这样的：</font><span lang=EN-US><font color=#ff0000>&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If-None-Match: W/"50b<st1:chmetcnv unitname="C" sourcevalue="1" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">1c</st1:chmetcnv>1d<st1:chmetcnv unitname="F" sourcevalue="4" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">4f</st1:chmetcnv><st1:chmetcnv unitname="C" sourcevalue="775" hasspace="False" negative="False" numbertype="1" tcsc="0" w:st="on">775c</st1:chmetcnv>61:df3" <br><br></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>如果<span lang=EN-US>ETag</span>没改变，则返回状态<span lang=EN-US>304</span>然后不返回，这也和<span lang=EN-US>Last-Modified</span>一样。本人测试<span lang=EN-US>Etag</span>主要在断点下载时比较有用。<span lang=EN-US><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Last-Modified</span>和<span lang=EN-US>Etags</span>如何帮助提高性能<span lang=EN-US>?<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>聪明的开发者会把<span lang=EN-US>Last-Modified </span>和<span lang=EN-US>ETags</span>请求的<span lang=EN-US>http</span>报头一起使用，这样可利用客户端（例如浏览器）的缓存。因为服务器首先产生<span lang=EN-US> Last-Modified/Etag</span>标记，服务器可在稍后使用它来判断页面是否已经被修改。本质上，客户端通过将该记号传回服务器要求服务器验证其（客户端）缓存。<span lang=EN-US>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>过程如下<span lang=EN-US>:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. </span>客户端请求一个页面（<span lang=EN-US>A</span>）。<span lang=EN-US>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. </span>服务器返回页面<span lang=EN-US>A</span>，并在给<span lang=EN-US>A</span>加上一个<span lang=EN-US>Last-Modified/ETag</span>。<span lang=EN-US>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3. </span>客户端展现该页面，并将页面连同<span lang=EN-US>Last-Modified/ETag</span>一起缓存。<span lang=EN-US>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4. </span>客户再次请求页面<span lang=EN-US>A</span>，并将上次请求时服务器返回的<span lang=EN-US>Last-Modified/ETag</span>一起传递给服务器。<span lang=EN-US>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5. </span>服务器检查该<span lang=EN-US>Last-Modified</span>或<span lang=EN-US>ETag</span>，并判断出该页面自上次客户端请求之后还未被修改，直接返回响应<span lang=EN-US>304</span>和一个空的响应体</span><span lang=EN-US style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-bidi-font-family: arial"><o:p></o:p></span></p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/95293.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2009-09-04 11:47 <a href="http://www.cppblog.com/woaidongmao/archive/2009/09/04/95293.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RFC1738 - 统一资源定位器&amp;quot;URL&amp;quot;</title><link>http://www.cppblog.com/woaidongmao/archive/2008/12/28/70569.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Sun, 28 Dec 2008 09:17:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/12/28/70569.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/70569.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/12/28/70569.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/70569.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/70569.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &#160;这份备忘录的情况本备忘录详细说明了一种为因特网团体提供的因特网标准追踪协议（track protocol），恳请大家讨论并提出宝贵意见。如果你想了解这个协议的情况及标准化状态，请参考《因特网正式协议标准（Internet Official Protocol Standards）》（STD 1）的最新版本。本备忘录可以自由发布发布，不受任何限制。摘要该文档详细...&nbsp;&nbsp;<a href='http://www.cppblog.com/woaidongmao/archive/2008/12/28/70569.html'>阅读全文</a><img src ="http://www.cppblog.com/woaidongmao/aggbug/70569.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-12-28 17:17 <a href="http://www.cppblog.com/woaidongmao/archive/2008/12/28/70569.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>URL中间'/'的区别</title><link>http://www.cppblog.com/woaidongmao/archive/2008/06/19/54014.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Thu, 19 Jun 2008 06:39:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/06/19/54014.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/54014.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/06/19/54014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/54014.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/54014.html</trackback:ping><description><![CDATA[&lt;form <font color=#ff0000>action="UploadFile"</font> method="post" enctype="multipart/form-data" onSubmit="return validate()"&gt;
<p>对应URL:D:\New HY Code\HY Web Server\Debug\hy web root\Henyep\UploadFile</p>
&lt;form <font color=#ff0000>action="/UploadFile"</font> method="post" enctype="multipart/form-data" onSubmit="return validate()"&gt;
<p>对应URL:D:\UploadFile</p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/54014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-06-19 14:39 <a href="http://www.cppblog.com/woaidongmao/archive/2008/06/19/54014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP请求模型和头信息参考,很全</title><link>http://www.cppblog.com/woaidongmao/archive/2008/05/29/51491.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Thu, 29 May 2008 08:48:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/05/29/51491.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/51491.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/05/29/51491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/51491.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/51491.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、连接至Web服务器一个客户端应用（如Web浏览器）打开到Web服务器的HTTP端口的一个套接字（缺省为80）。例如：http://www.myweb.com:8080/index.html, 在Java中，这将等同于代码：Soceet socket=new Socket("www.myweb.com",8080);InputStream in=socket.getInputSt...&nbsp;&nbsp;<a href='http://www.cppblog.com/woaidongmao/archive/2008/05/29/51491.html'>阅读全文</a><img src ="http://www.cppblog.com/woaidongmao/aggbug/51491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-05-29 16:48 <a href="http://www.cppblog.com/woaidongmao/archive/2008/05/29/51491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP常用消息头</title><link>http://www.cppblog.com/woaidongmao/archive/2008/05/29/51486.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Thu, 29 May 2008 08:18:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/05/29/51486.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/51486.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/05/29/51486.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/51486.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/51486.html</trackback:ping><description><![CDATA[<p>&#160;</p>
<p>HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行（对于请求消息，开始行就是请求行，对于响应消息，开始行就是状态行），消息报头（可选），空行（只有CRLF的行），消息正文（可选）组成。
<p>HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。<br>每一个报头域都是由名字+&#8220;：&#8221;+空格+值 组成，消息报头域的名字是大小写无关的。
<p>1、普通报头<br>在普通报头中，有少数报头域用于所有的请求和响应消息，但并不用于被传输的实体，只用于传输的消息。<br>eg：<br>Cache-Control 用于指定缓存指令，缓存指令是单向的（响应中出现的缓存指令在请求中未必会出现），且是独立的（一个消息的缓存指令不会影响另一个消息处理的缓存机制），HTTP1.0使用的类似的报头域为Pragma。<br>请求时的缓存指令包括：no-cache（用于指示请求或响应消息不能缓存）、no-store、max-age、max-stale、min-fresh、only-if-cached;<br>响应时的缓存指令包括：public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage.<br>eg：为了指示IE浏览器（客户端）不要缓存页面，服务器端的JSP程序可以编写如下：response.sehHeader("Cache-Control","no-cache");<br>//response.setHeader("Pragma","no-cache");作用相当于上述代码，通常两者//合用<br>这句代码将在发送的响应消息中设置普通报头域：Cache-Control:no-cache
<p>Date普通报头域表示消息产生的日期和时间
<p>Connection普通报头域允许发送指定连接的选项。例如指定连接是连续，或者指定&#8220;close&#8221;选项，通知服务器，在响应完成后，关闭连接
<p>2、请求报头<br>请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。<br>常用的请求报头<br>Accept<br>Accept请求报头域用于指定客户端接受哪些类型的信息。eg：Accept：image/gif，表明客户端希望接受GIF图象格式的资源；Accept：text/html，表明客户端希望接受html文本。<br>Accept-Charset<br>Accept-Charset请求报头域用于指定客户端接受的字符集。eg：Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域，缺省是任何字符集都可以接受。<br>Accept-Encoding<br>Accept-Encoding请求报头域类似于Accept，但是它是用于指定可接受的内容编码。eg：Accept-Encoding:gzip.deflate.如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。<br>Accept-Language<br>Accept-Language请求报头域类似于Accept，但是它是用于指定一种自然语言。eg：Accept-Language:zh-cn.如果请求消息中没有设置这个报头域，服务器假定客户端对各种语言都可以接受。<br>Authorization<br>Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时，如果收到服务器的响应代码为401（未授权），可以发送一个包含Authorization请求报头域的请求，要求服务器对其进行验证。<br>Host（发送请求时，该报头域是必需的）<br>Host请求报头域主要用于指定被请求资源的Internet主机和端口号，它通常从HTTP URL中提取出来的，eg：<br>我们在浏览器中输入：<a href="http://www.guet.edu.cn/index.html">http://www.guet.edu.cn/index.html</a><br>浏览器发送的请求消息中，就会包含Host请求报头域，如下：<br>Host：www.guet.edu.cn<br>此处使用缺省端口号80，若指定了端口号，则变成：Host：www.guet.edu.cn:指定端口号<br>User-Agent<br>我们上网登陆论坛的时候，往往会看到一些欢迎信息，其中列出了你的操作系统的名称和版本，你所使用的浏览器的名称和版本，这往往让很多人感到很神奇，实际上，服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息。User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不过，这个报头域不是必需的，如果我们自己编写一个浏览器，不使用User-Agent请求报头域，那么服务器端就无法得知我们的信息了。<br>请求报头举例：<br>GET /form.html HTTP/1.1 (CRLF)<br>Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF)<br>Accept-Language:zh-cn (CRLF)<br>Accept-Encoding:gzip,deflate (CRLF)<br>If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)<br>If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF)<br>User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)<br>Host:www.guet.edu.cn (CRLF)<br>Connection:Keep-Alive (CRLF)<br>(CRLF)
<p>3、响应报头<br>响应报头允许服务器传递不能放在状态行中的附加响应信息，以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。<br>常用的响应报头<br>Location<br>Location响应报头域用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。<br>Server<br>Server响应报头域包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。下面是<br>Server响应报头域的一个例子：<br>Server：Apache-Coyote/1.1<br>WWW-Authenticate<br>WWW-Authenticate响应报头域必须被包含在401（未授权的）响应消息中，客户端收到401响应消息时候，并发送Authorization报头域请求服务器对其进行验证时，服务端响应报头就包含该报头域。<br>eg：WWW-Authenticate:Basic realm="Basic Auth Test!" //可以看出服务器对请求资源采用的是基本验证机制。<br>Content-Disposition就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名。具体的定义如下 Content-Disposition: attachment; filename=&#8220;filename.xls&#8221; <br>当然filename参数可以包含路径信息，但User-Agnet会忽略掉这些信息，只会把路径信息的最后一部分做为文件名。当你在响应类型为application/octet- stream情况下使用了这个头信息的话，那就意味着你不想直接显示内容，而是弹出一个&#8221;文件下载&#8221;的对话框，接下来就是由你来决定&#8220;打开&#8221;还是&#8220;保存&#8221;了。
<p>4、实体报头<br>请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成，但并不是说实体报头域和实体正文要在一起发送，可以只发送实体报头域。实体报头定义了关于实体正文（eg：有无实体正文）和请求所标识的资源的元信息。<br>常用的实体报头<br>Content-Encoding<br>Content -Encoding实体报头域被用作媒体类型的修饰符，它的值指示了已经被应用到实体正文的附加内容的编码，因而要获得Content-Type报头域中所引用的媒体类型，必须采用相应的解码机制。Content-Encoding这样用于记录文档的压缩方法，eg：Content-Encoding： gzip<br>Content-Language<br>Content-Language实体报头域描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言阅读<br>者。eg：Content-Language:da<br>Content-Length<br>Content-Length实体报头域用于指明实体正文的长度，以字节方式存储的十进制数字来表示。<br>Content-Type<br>Content-Type实体报头域用语指明发送给接收者的实体正文的媒体类型。eg：<br>Content-Type:text/html;charset=ISO-8859-1<br>Content-Type:text/html;charset=GB2312<br>Last-Modified<br>Last-Modified实体报头域用于指示资源的最后修改日期和时间。<br>Expires<br>Expires 实体报头域给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中(再次访问曾访问过的页面时，直接从缓存中加载，缩短响应时间和降低服务器负载)的页面，我们可以使用Expires实体报头域指定页面过期的时间。eg：Expires：Thu，15 Sep 2006 16:23:12 GMT<br>HTTP1.1的客户端和缓存必须将其他非法的日期格式（包括0）看作已经过期。eg：为了让浏览器不要缓存页面，我们也可以利用Expires实体报头域，设置为0，jsp中程序如下：response.setDateHeader("Expires","0");</p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/51486.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-05-29 16:18 <a href="http://www.cppblog.com/woaidongmao/archive/2008/05/29/51486.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP状态消息列表</title><link>http://www.cppblog.com/woaidongmao/archive/2008/05/29/51485.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Thu, 29 May 2008 08:16:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/05/29/51485.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/51485.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/05/29/51485.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/51485.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/51485.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1xx: 信息                                                                                                消息:                                                                        描述: ...&nbsp;&nbsp;<a href='http://www.cppblog.com/woaidongmao/archive/2008/05/29/51485.html'>阅读全文</a><img src ="http://www.cppblog.com/woaidongmao/aggbug/51485.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-05-29 16:16 <a href="http://www.cppblog.com/woaidongmao/archive/2008/05/29/51485.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>理解HTTP消息头</title><link>http://www.cppblog.com/woaidongmao/archive/2008/05/29/51483.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Thu, 29 May 2008 08:13:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/05/29/51483.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/51483.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/05/29/51483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/51483.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/51483.html</trackback:ping><description><![CDATA[<p>一）初识HTTP消息头
<p>但凡搞WEB开发的人都离不开HTTP（超文本传输协议），而要了解HTTP，除了HTML本身以外，还有一部分不可忽视的就是HTTP消息头。<br>做过Socket编程的人都知道，当我们设计一个通信协议时，&#8220;消息头/消息体&#8221;的分割方式是很常用的，消息头告诉对方这个消息是干什么的，消息体告诉对方怎么干。HTTP传输的消息也是这样规定的，每一个HTTP包都分为HTTP头和HTTP体两部分，后者是可选的，而前者是必须的。每当我们打开一个网页，在上面点击右键，选择&#8220;查看源文件&#8221;，这时看到的HTML代码就是HTTP的消息体，那么消息头又在哪呢？IE浏览器不让我们看到这部分，但我们可以 通过截取数据包等方法看到它。<br>下面就来看一个简单的例子：<br>首先制作一个非常简单的网页，它的内容只有一行：<br>&lt;html&gt;&lt;body&gt;hello world&lt;/body&gt;&lt;/html&gt;<br>把它放到WEB服务器上，比如IIS，然后用IE浏览器请求这个页面（<a href="http://localhost:8080/simple.htm">http://localhost:8080/simple.htm</a>），当我们请求这个页面时，浏览器实际做了以下四项工作：<br>1 解析我们输入的地址，从中分解出协议名、主机名、端口、对象路径等部分，对于我们的这个地址，解析得到的结果如下：<br>协议名：http<br>主机名：localhost<br>端口：8080<br>对象路径：/simple.htm<br>2 把以上部分结合本机自己的信息，封装成一个HTTP请求数据包<br>3 使用TCP协议连接到主机的指定端口（localhost, 8080），并发送已封装好的数据包<br>4 等待服务器返回数据，并解析返回数据，最后显示出来<br>由截取到的数据包我们不难发现浏览器生成的HTTP数据包的内容如下：<br>GET /simple.htm HTTP/1.1&lt;CR&gt;<br>Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*&lt;CR&gt;<br>Accept-Language: zh-cn&lt;CR&gt;<br>Accept-Encoding: gzip, deflate&lt;CR&gt;<br>User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)&lt;CR&gt;<br>Host: localhost:8080&lt;CR&gt;<br>Connection: <a name=baidusnap4></a><strong>Keep</strong>-<a name=baidusnap5></a><strong>Alive</strong>&lt;CR&gt;<br>&lt;CR&gt;<br>为了显示清楚我把所有的回车的地方都加上了&#8220;&lt;CR&gt;&#8221;，注意最后还有一个空行加一个回车，这个空行正是HTTP规定的消息头和消息体的分界线，第一个空行以下的内容就是消息体，这个请求数据包是没有消息体的。<br>消息的第一行&#8220;GET&#8221;表示我们所使用的HTTP动作，其他可能的还有&#8220;POST&#8221;等，GET的消息没有消息体，而POST消息是有消息体的，消息体的内容就是要POST的数据。后面/simple.htm就是我们要请求的对象，之后<a name=baidusnap0></a><strong>HTTP1.1</strong>表示使用的是<strong>HTTP1.1</strong>协议。<br>第二行表示我们所用的浏览器能接受的Content-type，三四两行则是语言和编码信息，第五行显示出本机的相关系信息，包括浏览器类型、操作系统信息等，很多网站可以显示出你所使用的浏览器和操作系统版本，就是因为可以从这里获取到这些信息。<br>第六行表示我们所请求的主机和端口，第七行表示使用<strong>Keep</strong>-<strong>Alive</strong>方式，即数据传递完并不立即关闭连接。<br>服务器接收到这样的数据包以后会根据其内容做相应的处理，例如查找有没有&#8220;/simple.htm&#8221;这个对象，如果有，根据服务器的设置来决定如何处理，如果是HTM，则不需要什么复杂的处理，直接返回其内容即可。但在直接返回之前，还需要加上HTTP消息头。<br>服务器发回的完整HTTP消息如下：<br>HTTP/1.1 200 OK&lt;CR&gt;<br>Server: Microsoft-IIS/5.1&lt;CR&gt;<br>X-Powered-By: ASP.NET&lt;CR&gt;<br>Date: Fri, 03 Mar 2006 06:34:03 GMT&lt;CR&gt;<br>Content-Type: text/html&lt;CR&gt;<br>Accept-Ranges: bytes&lt;CR&gt;<br>Last-Modified: Fri, 03 Mar 2006 06:33:18 GMT&lt;CR&gt;<br>ETag: "5ca4f75b8c3ec61:9ee"&lt;CR&gt;<br>Content-Length: 37&lt;CR&gt;<br>&lt;CR&gt;<br>&lt;html&gt;&lt;body&gt;hello world&lt;/body&gt;&lt;/html&gt;<br>同样，我用&#8220;&lt;CR&gt;&#8221;来表示回车。可以看到，这个消息也是用空行切分成消息头和消息体两部分，消息体的部分正是我们前面写好的HTML代码。<br>消息头第一行&#8220;HTTP/1.1&#8221;也是表示所使用的协议，后面的&#8220;200 OK&#8221;是HTTP返回代码，200就表示操作成功，还有其他常见的如404表示对象未找到，500表示服务器错误，403表示不能浏览目录等等。<br>第二行表示这个服务器使用的WEB服务器软件，这里是IIS 5.1。第三行是ASP.Net的一个附加提示，没什么实际用处。第四行是处理此请求的时间。第五行就是所返回的消息的content-type，浏览器 会根据它来决定如何处理消息体里面的内容，例如这里是text/html，那么浏览器就会启用HTML解析器来处理它，如果是image/jpeg，那么 就会使用JPEG的解码器来处理。<br>消息头最后一行&#8220;Content-Length&#8221;表示消息体的长度，从空行以后的内容算起，以字节为单位，浏览器接收到它所指定的字节数的内容以后就会认为这个消息已经被完整接收了。
<p><strong>理解HTTP消息头 （二）</strong>
<p><strong>常见的HTTP返回码</strong>
<p>上一篇文章里我简要的说了说HTTP消息头的格式，注意到在服务器返回的HTTP消息头里有一个&#8220;HTTP/1.1 200 OK&#8221;，这里的200是HTTP规定的返回代码，表示请求已经被正常处理完成。浏览器通过这个返回代码就可以知道服务器对所发请求的处理情况是什么，每一种返回代码都有自己的含义。这里列举几种常见的返回码。
<p><strong>1 403 Access Forbidden</strong>
<p>如果我们试图请求服务器上一个文件夹，而在WEB服务器上这个文件夹并没有允许对这个文件夹列目录的话，就会返回这个代码。一个完整的403回复可能是这样的：（IIS5.1）<br>HTTP/1.1 403 Access Forbidden<br>Server: Microsoft-IIS/5.1<br>Date: Mon, 06 Mar 2006 08:57:39 GMT<br>Connection: close<br>Content-Type: text/html<br>Content-Length: 172
<p>&lt;html&gt;&lt;head&gt;&lt;title&gt;Directory Listing Denied&lt;/title&gt;&lt;/head&gt;<br>&lt;body&gt;&lt;h1&gt;Directory Listing Denied&lt;/h1&gt;This Virtual Directory does not allow contents to be listed.&lt;/body&gt;&lt;/html&gt;
<p><strong>2 404 Object not found</strong>
<p>当我们请求的对象在服务器上并不存在时，就会给出这个返回代码，这可能也是最常见的错误代码了。IIS给出的404消息内容很长，除了消息头以外还有一个完整的说明&#8220;为什么会这样&#8221;的网页。APACHE服务器的404消息比较简短，如下：<br>HTTP/1.1 404 Not Found<br>Date: Mon, 06 Mar 2006 09:03:14 GMT<br>Server: Apache/2.0.55 (Unix) PHP/5.0.5<br>Content-Length: 291<br><strong>Keep</strong>-<strong>Alive</strong>: timeout=15, max=100<br>Connection: <strong>Keep</strong>-<strong>Alive</strong><br>Content-Type: text/html; charset=iso-8859-1
<p>&lt;!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"&gt;<br>&lt;html&gt;&lt;head&gt;<br>&lt;title&gt;404 Not Found&lt;/title&gt;<br>&lt;/head&gt;&lt;body&gt;<br>&lt;h1&gt;Not Found&lt;/h1&gt;<br>&lt;p&gt;The requested URL /notexist was not found on this server.&lt;/p&gt;<br>&lt;hr&gt;<br>&lt;address&gt;Apache/2.0.55 (Unix) PHP/5.0.5 Server at localhost Port 8080&lt;/address&gt;<br>&lt;/body&gt;&lt;/html&gt;
<p>也许你会问，无论是404还是200，都会在消息体内给出一个说明网页，那么对于客户端来说二者有什么区别呢？一个比较明显的区别在于200是 成功请求，浏览器会记录下这个地址，以便下次再访问时可以自动提示该地址，而404是失败请求，浏览器只会显示出返回的页面内容，并不会记录此地址，要再次访问时还需要输入完整的地址。
<p><strong>3 401 Access Denied</strong>
<p>当WEB服务器不允许匿名访问，而我们又没有提供正确的用户名/密码时，服务器就会给出这个返回代码。在IIS中，设置IIS的安全属性为不允许匿名访问（如下图），此时直接访问的话就会得到以下返回结果：
<p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/HTTP_E40D/clip_image001_3.gif"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=36 alt=clip_image001 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/HTTP_E40D/clip_image001_thumb.gif" width=36 border=0></a><br>HTTP/1.1 401 Access Denied<br>Server: Microsoft-IIS/5.1<br>Date: Mon, 06 Mar 2006 09:15:55 GMT<br>WWW-Authenticate: Negotiate<br>WWW-Authenticate: NTLM<br>Connection: close<br>Content-Length: 3964<br>Content-Type: text/html
<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"&gt;<br>&lt;html dir=ltr&gt;<br>&#8230;&#8230;<br>此时浏览器上给出的提示如下图，让我们输入用户名和密码：
<p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/HTTP_E40D/clip_image001%5B1%5D.gif"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=36 alt=clip_image001[1] src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/HTTP_E40D/clip_image001%5B1%5D_thumb.gif" width=36 border=0></a>
<p>因返回信息中消息体较长，只取前面两行内容。注意，如果是用localhost来访问本机的IIS，因IE可以直接取得当前用户的身份，它会和服务器间直接进行协商，所以不会看到401提示。<br>当我们在输入了用户名和密码以后，服务器与客户端会再进行两次对话。首先客户端向服务器索取一个公钥，服务器端会返回一个公钥，二者都用BASE64编码，相应的消息如下（编码部分已经做了处理）：
<p>GET / HTTP/1.1<br>Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*<br>Accept-Language: zh-cn<br>Accept-Encoding: gzip, deflate<br>User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)<br>Host: 192.168.0.55:8080<br>Connection: <strong>Keep</strong>-<strong>Alive</strong><br>Authorization: Negotiate ABCDEFG&#8230;&#8230;
<p>HTTP/1.1 401 Access Denied<br>Server: Microsoft-IIS/5.1<br>Date: Mon, 06 Mar 2006 09:20:53 GMT<br>WWW-Authenticate: Negotiate HIJKLMN&#8230;&#8230;<br>Content-Length: 3715<br>Content-Type: text/html
<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"&gt;<br>&lt;html dir=ltr&gt;<br>&#8230;&#8230;<br>客户端拿到公钥之后使用公钥对用户名和密码进行加密码，然后把加密以后的结果重新发给服务器：<br>GET / HTTP/1.1<br>Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*<br>Accept-Language: zh-cn<br>Accept-Encoding: gzip, deflate<br>User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)<br>Host: 192.168.0.55:8080<br>Connection: <strong>Keep</strong>-<strong>Alive</strong><br>Authorization: Negotiate OPQRST&#8230;&#8230;
<p>这样，如果验证通过，服务器端就会把请求的内容发送过来了，也就是说禁止匿名访问的网站会经过三次请求才可以看到页面。但因为客户端浏览器已经缓存了公钥，用同一个浏览器窗口再次请求这个网站上的其它页面时就可以直接发送验证信息，从而一次交互就可以完成了。
<p><strong>4 302 Object Moved</strong>
<p>用过ASP的人都知道ASP中页面重定向至少有Redirect和Transfer两种方法。二的区别在于Redirect是客户端重定向，而Transfer是服务器端重定向，那么它们具体是如何通过HTTP消息头实现的呢？<br>先来看一下Transfer的例子：<br>例如ASP文件1.asp只有一行<br>&lt;% Server.Transfer "1.htm" %&gt;<br>HTML文件1.htm也只有一行：<br>&lt;p&gt;this is 1.htm&lt;/p&gt;<br>如果我们从浏览器里请求1.asp，发送的请求是：<br>GET /1.asp HTTP/1.1<br>Accept: */*<br>Accept-Language: zh-cn<br>Accept-Encoding: gzip, deflate<br>User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)<br>Host: localhost:8080<br>Connection: <strong>Keep</strong>-<strong>Alive</strong><br>Cookie: ASPSESSIONIDACCTRTTT=PKKDJOPBAKMAMBNANIPIFDAP
<p>注意请求的文件确实是1.asp，而得到的回应则是：<br>HTTP/1.1 200 OK<br>Server: Microsoft-IIS/5.1<br>Date: Mon, 06 Mar 2006 12:52:44 GMT<br>X-Powered-By: ASP.NET<br>Content-Length: 20<br>Content-Type: text/html<br>Cache-control: private
<p>&lt;p&gt;this is 1.htm&lt;/p&gt;<br>不难看出，通过Server.Transfer语句服务器端已经做了页面重定向，而客户端对此一无所知，表面上看上去得到的就是1.asp的结果。<br>如果把1.asp的内容改为：<br>&lt;% Response.Redirect "1.htm" %&gt;<br>再次请求1.asp，发送的请求没有变化，得到的回应却变成了：<br>HTTP/1.1 302 Object moved<br>Server: Microsoft-IIS/5.1<br>Date: Mon, 06 Mar 2006 12:55:57 GMT<br>X-Powered-By: ASP.NET<br>Location: 1.htm<br>Content-Length: 121<br>Content-Type: text/html<br>Cache-control: private
<p>&lt;head&gt;&lt;title&gt;Object moved&lt;/title&gt;&lt;/head&gt;<br>&lt;body&gt;&lt;h1&gt;Object Moved&lt;/h1&gt;This object may be found &lt;a HREF=""&gt;here&lt;/a&gt;.&lt;/body&gt;
<p>注意HTTP的返回代码由200变成了302，表示这是一个重定向消息，客户端需要根据消息头中Location字段的值重新发送请求，于是就有了下面一组对话：<br>GET /1.htm HTTP/1.1<br>Accept: */*<br>Accept-Language: zh-cn<br>Accept-Encoding: gzip, deflate<br>User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)<br>Host: localhost:8080<br>Connection: <strong>Keep</strong>-<strong>Alive</strong><br>If-Modified-Since: Thu, 02 Mar 2006 06:50:13 GMT<br>If-None-Match: "b224758ec53dc61:9f0"<br>Cookie: ASPSESSIONIDACCTRTTT=PKKDJOPBAKMAMBNANIPIFDAP
<p>HTTP/1.1 200 OK<br>Server: Microsoft-IIS/5.1<br>X-Powered-By: ASP.NET<br>Date: Mon, 06 Mar 2006 12:55:57 GMT<br>Content-Type: text/html<br>Accept-Ranges: bytes<br>Last-Modified: Mon, 06 Mar 2006 12:52:32 GMT<br>ETag: "76d85bd51c41c61:9f0"<br>Content-Length: 20
<p>&lt;p&gt;this is 1.htm&lt;/p&gt;<br>很明显，两种重定向方式虽然看上去结果很像，但在实现原理上有很大的不同。
<p><strong>5 500 Internal Server Error</strong>
<p>500号错误发生在服务器程序有错误的时候，例如，ASP程序为<br>&lt;% if %&gt;<br>显然这个程序并不完整，于是得到的结果为：<br>HTTP/1.1 500 Internal Server Error<br>Server: Microsoft-IIS/5.1<br>Date: Mon, 06 Mar 2006 12:58:55 GMT<br>X-Powered-By: ASP.NET<br>Content-Length: 4301<br>Content-Type: text/html<br>Expires: Mon, 06 Mar 2006 12:58:55 GMT<br>Set-Cookie: ASPSESSIONIDACCTRTTT=ALKDJOPBPPKNPCNOEPCNOOPD; path=/<br>Cache-control: private
<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"&gt;
<p>&lt;html dir=ltr&gt;<br>&#8230;&#8230;
<p>服务器发送了500号错误，并且后面通过HTML的方式说明了错误的原因。
<p><strong>理解HTTP消息头 （三）</strong>
<p>（三） 客户端发送的内容<br>这一次主要来观察HTTP消息头中客户端的请求，从中找到一些有意思的内容。
<p><strong>1 HTTP_REFERER<br></strong>写两个简单的网页：<br>a.htm：<br>&lt;a href=b.htm&gt;to page b&lt;/a&gt;<br>b.htm：<br>haha<br>内容很简单，就是网页A中有一个到B的链接。把它们放到IIS上，并访问网页A，从中再点击到B的链接，于是看到了B页的&#8220;haha&#8221;。那么这两次请求有什么不同吗？观察它们所发送的HTTP消息头，最明显的区别就是访问B页时比访问A页时多了一行：<br>Referer: <a href="http://localhost/a.htm">http://localhost/a.htm</a><br>这一行就表示，用户要访问的B页是从A页链接过来的。<br>服务器端要想取得这个值也是很容易的，以ASP为例，只需要写一句<br>&lt;% =Request.ServerVariables("HTTP_REFERER") %&gt;<br>就可以了。<br>一些网站通过HTTP_REFERER来做安全验证，判断用户是不是从允许的页面链接来的，而不是直接从浏览器上打URL或从其他页面链接过来，这样可以 从一定程度上防止网页被做非法使用。但从上述原理来看，想要骗过服务器也并不困难，只要手工构造输入的HTTP消息头就可以了，其他常用的手段还有通过 HOSTS文件伪造域名等。<br>除了超链接以外，还有其他几种方式会导致HTTP_REFERER信息被发送，如：<br>内联框架：&lt;iframe src=b.asp&gt;&lt;/iframe&gt;<br>框架集：&lt;frameset&gt;&lt;frame src=b.asp&gt;&lt;/frameset&gt;<br>表单提交：&lt;form action=b.asp&gt;&lt;input type=submit&gt;&lt;/form&gt;<br>SCRIPT引用：&lt;script src=b.asp&gt;&lt;/script&gt;<br>CSS引用：&lt;link rel=stylesheet type=text/css href=b.asp&gt;<br>XML数据岛：&lt;xml src=b.asp&gt;&lt;/xml&gt;
<p>而以下形式不会发送HTTP_REFERER：<br>script转向：&lt;script&gt;location.href="b.asp"&lt;/script&gt;<br>script开新窗口：&lt;script&gt;window.open("b.asp");&lt;/script&gt;<br>META转向：&lt;meta http-equiv="refresh" content="0;URL=b.asp"&gt;<br>引入图片：&lt;img src=b.asp&gt;
<p><strong>2 COOKIE</strong><br>COOKIE是大家都非常熟悉的了，通过它可以在客户端保存用户状态，即使用户关闭浏览器也能继续保存。那么客户端与服务器端是如何交换COOKIE信息的呢？没错，也是通过HTTP消息头。<br>首先写一个简单的ASP网页：<br>&lt;%<br>Dim i<br>i = Request.Cookies("key")<br>Response.Write i<br>Response.Cookies("key") = "haha"<br>Response.Cookies("key").Expires = #2007-1-1#<br>%&gt;<br>第一次访问此网页时，屏幕上一片白，第二次访问时，则会显示出&#8220;haha&#8221;。通过阅读程序不难发现，屏幕上显示的内容实际上是COOKIE 的内容，而第一次访问时还没有设置COOKIE的值，所以不会有显示，第二次显示的是第一次设置的值。那么对应的HTTP消息头应该是什么样的呢？<br>第一次请求时没什么不同，略过<br>第一次返回时消息内容多了下面这一行：<br>Set-Cookie: key=haha; expires=Sun, 31-Dec-2006 16:00:00 GMT; path=/<br>很明显，key=haha表示键名为&#8220;key&#8221;的COOKIE的值为&#8220;haha&#8221;，后面是这则COOKIE的过期时间，因为我用的中文操作系统的时区是东八区，2007年1月1日0点对应的GMT时间就是2006年12月31日16点。<br>第二次再访问此网页时，发送的内容多了如下一行：<br>Cookie: key=haha<br>它的内容就是刚才设的COOKIE的内容。可见，客户端在从服务器端得到COOKIE值以后就保存在硬盘上，再次访问时就会把它发送到服务器。发送时并没有发送过期时间，因为服务器对过期时间并不关心，当COOKIE过期后浏览器就不会再发送它了。<br>如果使用IE6.0浏览器并且禁用COOKIE功能，可以发现服务器端的set-cookie还是有的，但客户端并不会接受它，也不会发送它。有些网站， 特别是在线投票网站通过记录COOKIE防止用户重复投票，破解很简单，只要用IE6浏览器并禁用COOKIE就可以了。也有的网站通过COOKIE值为 某值来判断用户是否合法，这种判断也非常容易通过手工构造HTTP消息头来欺骗，当然用HOSTS的方式也是可以欺骗的。
<p><strong>3 SESSION<br></strong>HTTP协议本身是无状态的，服务器和客户端都不保证用户访问期间连接会一直保持，事实上保持连接是<strong>HTTP1.1</strong>才有的新内容，当客户端发送的消息头中有&#8220;Connection: <strong>Keep</strong>-<strong>Alive</strong>&#8221; 时表示客户端浏览器支持保持连接的工作方式，但这个连接也会在一段时间没有请求后自动断开，以节省服务器资源。为了在服务器端维持用户状态，SESSION就被发明出来了，现在各主流的动态网页制做工具都支持SESSION，但支持的方式不完全相同，以下皆以ASP为例。<br>当用户请求一个ASP网页时，在返回的HTTP消息头中会有一行：<br>Set-Cookie: ASPSESSIONIDCSQCRTBS=KOIPGIMBCOCBFMOBENDCAKDP; path=/<br>服务器通过COOKIE的方式告诉客户端你的SESSIONID是多少，在这里是&#8220;KOIPGIMBCOCBFMOBENDCAKDP&#8221;，并且服务器上保 留了和此SESSIONID相关的数据，当同一用户再次发送请求时，还会把这个COOKIE再发送回去，服务器端根据此ID找到此用户的数据，也就实现了 服务器端用户状态的保存。所以我们用ASP编程时可以使用&#8220;session("name")=user&#8221;这样的方式保存用户信息。注意此COOKIE内容 里并没有过期时间，这表示这是一个当关闭浏览器时立即过期的COOKIE，它不会被保存到硬盘上。这种工作方式比单纯用COOKIE的方式要安全很多，因 为在客户端并没有什么能让我们修改和欺骗的值，唯一的信息就是SESSIONID，而这个ID在浏览器关闭时会立即失效，除非别人能在你浏览网站期间或关闭浏览器后很短时间内知道此ID的值，才能做一些欺骗活动。因为服务器端判断SESSION过期的方式并不是断开连接或关闭浏览器，而是通过用户手工结束 SESSION或等待超时，当用户关闭浏览器后的一段时间里SESSION还没有超时，所以这时如果知道了刚才的SESSIONID，还是可以欺骗的。因 此最安全的办法还是在离开网站之前手工结束SESSION，很多网站都提供&#8220;Logout&#8221;功能，它会通过设置SESSION中的值为已退出状态或让 SESSION立即过期从而起到安全的目的。<br>SESSION和COOKIE的方式各有优缺点。SESSION的优点是比较安全，不容易被欺骗，缺点是过期时间短，如果用过在超过过期时间里没有向服务器发送任何信息，就会被认为超过过期了；COOKIE则相反，根据服务器端设置的超时时间，可以长时间保留信息，即使关机再开机也可能保留状态，而安全性自然大打折扣。很多网站都提供两种验证方式相结合，如果用户临时用这台电脑访问此访问则需要输入用户名和密码，不保存COOKIE；如果用户使用的是自己的个人电脑，则可以让网站在自己硬盘上保留COOKIE，以后访问时就不需要重新输入用户名和密码了。
<p><strong>4 POST<br></strong>浏览器访问服务器常用的方式有GET和POST两种，GET方式只发送HTTP消息头，没有消息体，也就是除了要GET的基本信息之外 不向服务器提供其他信息，网页表单（FROM）的默认提交方式就是用GET方式，它会把所有向服务器提交的信息都作为URL后面的参数，如 a.asp?a=1&amp;b=2这样的方式。而当要提交的数据量很大，或者所提交内容不希望别人直接看到时，应该使用POST方式。POST方式提交 的数据是作为HTTP消息体存在的，例如，写一个网页表单：<br>&lt;form method=post&gt;<br>&lt;input type=text name=text1&gt;<br>&lt;input type=submit&gt;<br>&lt;/form&gt;<br>访问此网页，并在表单中填入一个&#8220;haha&#8221;，然后提交，可以看到此次提交所发送的信息如下：<br>POST /form.asp HTTP/1.1<br>Accept: */*<br>Referer: <a href="http://localhost:8080/form.asp">http://localhost:8080/form.asp</a><br>Accept-Language: zh-cn<br>Content-Type: application/x-www-form-urlencoded<br>Accept-Encoding: gzip, deflate<br>User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; InfoPath.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)<br>Host: localhost:8080<br>Content-Length: 10<br>Connection: <strong>Keep</strong>-<strong>Alive</strong><br>Cache-Control: no-cache<br>Cookie: key=haha; ASPSESSIONIDCSQCRTBS=LOIPGIMBLMNOGCOBOMPJBOKP
<p>text1=haha<br>前面关键字从&#8220;GET&#8221;变为了&#8220;POST&#8221;，Content-Type变成了&#8220;application/x-www-form- urlencoded&#8221;，后面内容并无大变化，只是多了一行：Content-Length: 10，表示提交的内容的长度。空行后面是消息体，内容就是表单中所填的内容。注意此时发送的内容只是&#8220;Name=Value&#8221;的形式，表单上其他的信息不 会被发送，所以想直接从服务器端取得list box中所有的list item是办不到的，除非在提交前用一段script把所有的item内容都连在一起放到一个隐含表单域中。<br>如果是用表单上传文件，情况就要复杂一些了，首先是表单声明中要加上一句话：enctype='multipart/form-data'，表示这个表单将提交多段数据，并用HTML：input type=file来声明一个文件提交域。<br>表单内容如下：<br>&lt;form method=post enctype='multipart/form-data'&gt;<br>&lt;input type=text name=text1&gt;<br>&lt;input type=file name=file1&gt;<br>&lt;input type=submit&gt;<br>&lt;/form&gt;<br>我们为text1输入文字：hehe，为file1选择文件haha.txt，其内容为&#8220;ABCDEFG&#8221;，然后提交此表单。提交的完全信息为：<br>POST /form.asp HTTP/1.1<br>Accept: */*<br>Referer: <a href="http://localhost:8080/form.asp">http://localhost:8080/form.asp</a><br>Accept-Language: zh-cn<br>Content-Type: multipart/form-data; boundary=---------------------------7d62bf2f9066c<br>Accept-Encoding: gzip, deflate<br>User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; InfoPath.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)<br>Host: localhost:8080<br>Content-Length: 337<br>Connection: <strong>Keep</strong>-<strong>Alive</strong><br>Cache-Control: no-cache<br>Cookie: key=haha; ASPSESSIONIDCSQCRTBS=LOIPGIMBLMNOGCOBOMPJBOKP
<p>-----------------------------7d62bf2f9066c<br>Content-Disposition: form-data; name="text1"
<p>hehe<br>-----------------------------7d62bf2f9066c<br>Content-Disposition: form-data; name="file1"; filename="H:\Documents and Settings\Administrator\桌面\haha.txt"<br>Content-Type: text/plain
<p>ABCDEFG<br>-----------------------------7d62bf2f9066c--
<p>显然这个提交的信息要比前述的复杂很多。Content-Type变成了&#8220;multipart/form-data&#8221;，后面还多了一个 boundary，此值是为了区分POST的内容的区段用的，只要在内容中遇到了此值，就表示下面要开始一个新的区段了，每个区段的内容相对独立。如果遇 到的是此值后面连着两个减号，则表示全部内容到此结束。每个段也分为段头和段体两部分，用空行隔开，每段都有自己的类型和相关信息。如第一区段是 text1的值，它的名称是&#8220;text1&#8221;，值为&#8220;hehe&#8221;。第二段是文件内容，段首里表明了此文件域的名称&#8220;file1&#8221;和此文件在用户磁盘上的位置，后面就是文件的内容。<br>如果我们想要自己写一个上传文件组件来接收HTML表单传送的文件数据，那么最核心的任务就是解析此数据包，从中取得需要的信息。
<p><strong>理解HTTP消息头 （四）<br>服务器返回的消息</strong>
<p>服务器返回的HTTP消息也分为消息头和消息体两部分。前面连载的第二篇里已经介绍了返回消息中常见返回代码的含义。对于非正常的返回代码的处理比较简单，只要照着要求去做就好了，而对于正常的返回代码（200），其处理方式就多种多样了。
<p><strong>1 Content-Type</strong>
<p>Content-Type是返回消息中非常重要的内容，它标识出这个返回内容的类型，其值为&#8220;主类型/子类型&#8221;的格式，例如最常见的就是 text/html，它的意思是说返回的内容是文本类型，这个文本又是HTML格式的。原则上浏览器会根据Content-Type来决定如何显示返回的 消息体内容。常见的内容类型有：<br>text/html HTML文本<br>image/jpeg JPG图片<br>image/gif GIF图片<br>application/xml XML文档<br>audio/x-mpegurl MP3文件列表，如果安装了Winamp，则可以直接把它当面M3U文件来打开<br>更多的内容类型可以在注册表&#8220;HKCR\MIME\Database\Content Type&#8221;下看到<br>对于IE6浏览器来说，如果Content-Type中的类型和实际的消息体类型不一致，那么它会根据内容中的类型来分析实际应该是什么类型，对于JPG、GIF等常用图片格式都可以正确的识别出来，而不管Content-Type中写的是什么。<br>如果Content-Type中指定的是浏览器可以直接打开的类型，那么浏览器就会直接打开其内容显示出来，如果是被关联到其它应用程序的类型，这时就要查找注册表中关于这种类型的注册情况，如果是允许直接打开而不需要询问的，就会直接调出这个关联的应用程序来打开这个文件，但如果是不允许直接打开的，就 会询问是否打开。对于没有关联到任何应用程序的类型，IE浏览器不知道它该如何打开，此时IE6就会把它当成XML来尝试打开。
<p><strong>2 Content-Disposition</strong>
<p>如果用AddHeader的方法在HTTP消息头中加入Content-Disposition段，并指定其值为&#8220;attachment&#8221;，那么无论这个文件是何类型，浏览器都会提示我们下载此文件，因为此时它认为后面的消息体是一个&#8220;附件&#8221;，不需要由浏览器来处理了。例如，在ASP.Net中 写入如下语句：<br>Response.AddHeader("Content-Disposition: attachment");<br>请求此页面是得到的结果如：<br>HTTP/1.1 200 OK<br>Server: Microsoft-IIS/5.1<br>Date: Thu, 23 Mar 2006 07:54:53 GMT<br>Content-Disposition: attachment<br>Cache-Control: private<br>Content-Type: text/html; charset=utf-8<br>&#8230;&#8230;<br>也就是说，通过AddHeader函数可以为HTTP消息头加入我们自定义的内容。使用这种方法可以强制让浏览器提示下载文件，即使这个文件是我们已知的 类型，基于是HTML网页。如果想要让用户下载时提示一个默认的文件名，只需要在前面一句话后加上&#8220;filename=文件名&#8221;即可。例如：<br>Response.AddHeader("Content-Disposition: attachment; filename=mypage.htm");
<p><strong>3 Content-Type</strong><strong>与Content-Disposition</strong>
<p>如果把Content-Type和Content-Disposition结合在一起使用会怎么样呢？<br>打开一个网页时，浏览器会首先看是否有Content-Disposition: attachment这一项，如果有，无论Content-Type的值是什么，都会提示文件下载。<br>如果指定了filename，就会提示默认的文件名为此文件名。注意到在IE6中除了&#8220;保存&#8221;按扭外还有&#8220;打开&#8221;按扭，此时打开文件的类型是由在 filename中指定的文件扩展名决定的，例如让filename=mypic.jpg，浏览器就会查找默认的图片查看器来打开此文件。<br>如果没有指定filename，那么浏览器就根据Content-Type中的类型来决定文件的类型，例如Content-Type类型为 image/gif，那么就会去查找默认的看GIF图片的工具，并且设置此文件的名字为所请求的网页的主名（不带扩展名）加上对应于此文件类弄扩展名，例 如请求的mypage.aspx，就会自动变成mypage.gif。如果并没有指定Content-Type值，那么就默认它为 &#8220;text/html&#8221;，并且保存的文件名就是所请求的网页文件名。<br>但如果没有指定Content-Disposition，那么就和前面关于Content-Type中所讨论的情况是一样的了。
<p><strong>4 Cache</strong>
<p>返回消息中的Cache用于指定网页缓存。我们经常可以看到这样的情况，打开一个网页时速度不快，但再次打开时就会快很多，原因是浏览器已经对此页面进行了缓存，那么在同一浏览器窗口中再次打开此页时不会重新从服务器端获取。网页的缓存是由HTTP消息头中的&#8220;Cache-control&#8221;来控制 的，常见的取值有private、no-cache、max-age、must-revalidate等，默认为private。其作用根据不同的重新浏 览方式分为以下几种情况：<br><strong>（1） 打开新窗口</strong><br>如果指定cache-control的值为private、no-cache、must-revalidate，那么打开新窗口访问时都会重新访问服务器。而如果指定了max-age值，那么在此值内的时间里就不会重新访问服务器，例如：<br>Cache-control: max-age=5<br>表示当访问此网页后的5秒内再次访问不会去服务器<br><strong>（2） 在地址栏回车</strong><br>如果值为private或must-revalidate（和网上说的不一样），则只有第一次访问时会访问服务器，以后就不再访问。如果值为no-cache，那么每次都会访问。如果值为max-age，则在过期之前不会重复访问。<br><strong>（3） 按后退按扭</strong><br>如果值为private、must-revalidate、max-age，则不会重访问，而如果为no-cache，则每次都重复访问<br><strong>（4） 按刷新按扭<br></strong>无论为何值，都会重复访问
<p>当指定Cache-control值为&#8220;no-cache&#8221;时，访问此页面不会在Internet临时文章夹留下页面备份。<br>另外，通过指定&#8220;Expires&#8221;值也会影响到缓存。例如，指定Expires值为一个早已过去的时间，那么访问此网时若重复在地址栏按回车，那么每次都会重复访问：<br>Expires: Fri, 31 Dec 1999 16:00:00 GMT
<p>在ASP中，可以通过Response对象的Expires、ExpiresAbsolute属性控制Expires值；通过Response对象的CacheControl属性控制Cache-control的值，例如：<br>Response.ExpiresAbsolute = #2000-1-1# ' 指定绝对的过期时间，这个时间用的是服务器当地时间，会被自动转换为GMT时间<br>Response.Expires = 20 ' 指定相对的过期时间，以分钟为单位，表示从当前时间起过多少分钟过期。<br>Response.CacheControl = "no-cache" <br>Expires值是可以通过在Internet临时文件夹中查看临时文件的属性看到的，如：
<p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/HTTP_E40D/clip_image003_2.jpg"><img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: 0px" height=227 alt=clip_image003 src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/HTTP_E40D/clip_image003_thumb.jpg" width=203 border=0></a> </p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/51483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-05-29 16:13 <a href="http://www.cppblog.com/woaidongmao/archive/2008/05/29/51483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP Keep-Alive</title><link>http://www.cppblog.com/woaidongmao/archive/2008/05/29/51481.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Thu, 29 May 2008 08:02:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/05/29/51481.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/51481.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/05/29/51481.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/51481.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/51481.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Keep-Alive功能使客户端到服务器端的连接持续有效，当出现对服务器的后继请求时，Keep-Alive功能避免了建立或者重新建立连接。市场上的大部分Web服务器，包括iPlanet、IIS和Apache，都支持HTTP Keep-Alive。对于提供静态内容的网站来说，这个功能通常很有用。但是，对于负担较重的网站来说，这里存在另外一个问题：虽然为客户保留打开的连接有一定的好处，但它同样影响了性能，因为在处理暂停期间，本来可以释放的资源仍旧被占用。当Web服务器和应用服务器在同一台机器上运行时，Keep- Alive功能对资源利用的影响尤其突出。 此功能为HTTP 1.1预设的功能，HTTP 1.0加上Keep-Alive header也可以提供HTTP的持续作用功能。 </p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/51481.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-05-29 16:02 <a href="http://www.cppblog.com/woaidongmao/archive/2008/05/29/51481.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP POST和GET的区别</title><link>http://www.cppblog.com/woaidongmao/archive/2008/05/29/51476.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Thu, 29 May 2008 07:33:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/05/29/51476.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/51476.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/05/29/51476.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/51476.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/51476.html</trackback:ping><description><![CDATA[<p>1、HTTP 只有POST和GET 两种命令模式；
<p>2、POST是被设计用来向上放东西的，而GET是被设计用来从服务器取东西的，GET也能够向服务器传送较少的数据，而Get之所以也能传送数据,只是用来设计告诉服务器,你到底需要什么样的数据.POST的信息作为HTTP 请求的内容，而GET是在HTTP 头部传输的；
<p>3、POST与GET在HTTP 中传送的方式不同，GET的参数是在HTTP 的头部传送的，而Post的数据则是在HTTP 请求的内容里传送;
<p>4、POST传输数据时，不需要在URL中显示出来，而GET方法要在URL中显示；
<p>5、GET方法由于受到URL长度的限制,只能传递大约1024字节；POST传输的数据量大，可以达到2M，而根据微软方面的说法，微软对用 Request.Form() 可接收的最大数据有限制，IIS 4 中为 80 KB 字节，IIS 5 中为 100 KB 字节；
<p>6、SOAP是依赖于HTTP POST模式实现的；
<p>&nbsp;
<p>例子：
<p><strong>HTTP GET</strong></p>
<p>发送 </p>
<p>GET /DEMOWebServices2.8/Service.asmx/CancelOrder?UserID=string&amp;PWD=string&amp;OrderConfirmation=string HTTP/1.1<br>Host: api.efxnow.com</p>
<p>回复</p>
<p>HTTP/1.1 200 OK<br>Content-Type: text/xml; charset=utf-8<br>Content-Length: length </p>
<p>&lt;?xml version="1.0" encoding="utf-8"?&gt;<br>&lt;objPlaceOrderResponse xmlns="<a href="https://api.efxnow.com/webservices2.3%22" href_cetemp='https://api.efxnow.com/webservices2.3"'>https://api.efxnow.com/webservices2.3"</a>&gt;<br>&nbsp; &lt;Success&gt;boolean&lt;/Success&gt;<br>&nbsp; &lt;ErrorDescription&gt;string&lt;/ErrorDescription&gt;<br>&nbsp; &lt;ErrorNumber&gt;int&lt;/ErrorNumber&gt;<br>&nbsp; &lt;CustomerOrderReference&gt;long&lt;/CustomerOrderReference&gt;<br>&nbsp; &lt;OrderConfirmation&gt;string&lt;/OrderConfirmation&gt;<br>&nbsp; &lt;CustomerDealRef&gt;string&lt;/CustomerDealRef&gt;<br>&lt;/objPlaceOrderResponse&gt;</p>
<p>&nbsp;</p>
<p><strong>HTTP POST</strong></p>
<p>发送 </p>
<p>POST /DEMOWebServices2.8/Service.asmx/CancelOrder HTTP/1.1<br>Host: api.efxnow.com<br>Content-Type: application/x-www-form-urlencoded<br>Content-Length: length
<p>UserID=string&amp;PWD=string&amp;OrderConfirmation=string</p>
<p>回复</p>
<p>HTTP/1.1 200 OK<br>Content-Type: text/xml; charset=utf-8<br>Content-Length: length </p>
<p>&lt;?xml version="1.0" encoding="utf-8"?&gt;<br>&lt;objPlaceOrderResponse xmlns="<a href="https://api.efxnow.com/webservices2.3%22" href_cetemp='https://api.efxnow.com/webservices2.3"'>https://api.efxnow.com/webservices2.3"</a>&gt;<br>&nbsp; &lt;Success&gt;boolean&lt;/Success&gt;<br>&nbsp; &lt;ErrorDescription&gt;string&lt;/ErrorDescription&gt;<br>&nbsp; &lt;ErrorNumber&gt;int&lt;/ErrorNumber&gt;<br>&nbsp; &lt;CustomerOrderReference&gt;long&lt;/CustomerOrderReference&gt;<br>&nbsp; &lt;OrderConfirmation&gt;string&lt;/OrderConfirmation&gt;<br>&nbsp; &lt;CustomerDealRef&gt;string&lt;/CustomerDealRef&gt;<br>&lt;/objPlaceOrderResponse&gt;</p>
<p>&nbsp;</p>
<p><strong>SOAP 1.2</strong></p>
<p>发送 </p>
<p>POST /DEMOWebServices2.8/Service.asmx HTTP/1.1<br>Host: api.efxnow.com<br>Content-Type: application/soap+xml; charset=utf-8<br>Content-Length: length
<p>&lt;?xml version="1.0" encoding="utf-8"?&gt;<br>&lt;soap12:Envelope xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance%22" href_cetemp='http://www.w3.org/2001/XMLSchema-instance"'>http://www.w3.org/2001/XMLSchema-instance"</a> xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema%22" href_cetemp='http://www.w3.org/2001/XMLSchema"'>http://www.w3.org/2001/XMLSchema"</a> xmlns:soap12="<a href="http://www.w3.org/2003/05/soap-envelope%22" href_cetemp='http://www.w3.org/2003/05/soap-envelope"'>http://www.w3.org/2003/05/soap-envelope"</a>&gt;<br>&nbsp; &lt;soap12:Body&gt;<br>&nbsp;&nbsp;&nbsp; &lt;CancelOrder xmlns="<a href="https://api.efxnow.com/webservices2.3%22" href_cetemp='https://api.efxnow.com/webservices2.3"'>https://api.efxnow.com/webservices2.3"</a>&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;UserID&gt;string&lt;/UserID&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;PWD&gt;string&lt;/PWD&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;OrderConfirmation&gt;string&lt;/OrderConfirmation&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/CancelOrder&gt;<br>&nbsp; &lt;/soap12:Body&gt;<br>&lt;/soap12:Envelope&gt;</p>
<p>回复</p>
<p>HTTP/1.1 200 OK<br>Content-Type: application/soap+xml; charset=utf-8<br>Content-Length: length </p>
<p>&lt;?xml version="1.0" encoding="utf-8"?&gt;<br>&lt;soap12:Envelope xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance%22" href_cetemp='http://www.w3.org/2001/XMLSchema-instance"'>http://www.w3.org/2001/XMLSchema-instance"</a> xmlns:xsd="<a href="http://www.w3.org/2001/XMLSchema%22" href_cetemp='http://www.w3.org/2001/XMLSchema"'>http://www.w3.org/2001/XMLSchema"</a> xmlns:soap12="<a href="http://www.w3.org/2003/05/soap-envelope%22" href_cetemp='http://www.w3.org/2003/05/soap-envelope"'>http://www.w3.org/2003/05/soap-envelope"</a>&gt;<br>&nbsp; &lt;soap12:Body&gt;<br>&nbsp;&nbsp;&nbsp; &lt;CancelOrderResponse xmlns="<a href="https://api.efxnow.com/webservices2.3%22" href_cetemp='https://api.efxnow.com/webservices2.3"'>https://api.efxnow.com/webservices2.3"</a>&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;CancelOrderResult&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Success&gt;boolean&lt;/Success&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ErrorDescription&gt;string&lt;/ErrorDescription&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ErrorNumber&gt;int&lt;/ErrorNumber&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;CustomerOrderReference&gt;long&lt;/CustomerOrderReference&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;OrderConfirmation&gt;string&lt;/OrderConfirmation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;CustomerDealRef&gt;string&lt;/CustomerDealRef&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/CancelOrderResult&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/CancelOrderResponse&gt;<br>&nbsp; &lt;/soap12:Body&gt;<br>&lt;/soap12:Envelope&gt;
<div id=content><span><span>
<div id=content><span><span>
<pre>&nbsp;</pre>
</span></span></div>
</span></span></div>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/51476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-05-29 15:33 <a href="http://www.cppblog.com/woaidongmao/archive/2008/05/29/51476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RFC1945&amp;mdash;&amp;mdash;HTTP 1.0中文版(全)</title><link>http://www.cppblog.com/woaidongmao/archive/2008/05/28/51411.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Wed, 28 May 2008 09:12:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/05/28/51411.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/51411.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/05/28/51411.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/51411.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/51411.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 超文本传输协议 -- HTTP/1.0（Hyptertext Transfer Protocol &#8211; HTTP/1.0）关于下段备忘（Status of This Memo）本段文字为Internet团体提供信息，并没有以任何方式指定Internet标准。本段文字没有分发限制。IESG提示（IESG Note）：IESG已在关注此协议，并期待该文档能尽快被标准跟踪文档所替代。...&nbsp;&nbsp;<a href='http://www.cppblog.com/woaidongmao/archive/2008/05/28/51411.html'>阅读全文</a><img src ="http://www.cppblog.com/woaidongmao/aggbug/51411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-05-28 17:12 <a href="http://www.cppblog.com/woaidongmao/archive/2008/05/28/51411.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP/1.1协议规范(中文归纳版）</title><link>http://www.cppblog.com/woaidongmao/archive/2008/05/28/51408.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Wed, 28 May 2008 09:05:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/05/28/51408.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/51408.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/05/28/51408.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/51408.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/51408.html</trackback:ping><description><![CDATA[<p>一、介绍（introduction）
<p>1. 目的——HTTP/0.9-〉HTTP/1.0-〉HTTP/1.1
<p>2. 要求——MUST、REQUIRED、SHOULD
<p>3. 术语——连接(Connection)、消息(Message)、请求(Request)、应答(Response)、资源(Resource)、实体(Entity)、表示方法(Representation)、内容协商(Content Negotiation)、变量（Variant)、客户机（Client）、用户代理(User agent)、服务器(Server)、原服务器（Origin server)、代理服务器（ Proxy）、网关（gateway）、高速缓存（Cache）、可缓存（Cacheable）、直接（first-hand）、明确终止时间（explicit expiration time）、探索终止时间（heuristic expiration time）、年龄（Age）、保鲜寿命（Freshness lifetime）、保鲜（Fresh）、陈旧（Stale）、语义透明（semantically transparent）、有效性判别器（Validator）、实体标记（entity tag）或最终更改时间（Last-Modified time))、上游/下游（upstream/downstream）、向内/向外（inbound/outbound）
<p>4. 总体操作——请求/应答、中介
<p>二、符号惯例与一般语法（notational conversions and generic grammar）
<p>1. 扩充BNF——name = definition,"literal",rule1 | rule2,(rule1 rule2),*rule,[rule],N rule, #rule,; comment, implied *LWS
<p>2. 基本规则——OCTET,CHAR,UPALPHA,LOALPHA,ALPHA,DIGIT,CTL,CR,LF,SP,HT,&lt;"&gt;
<p>三、协议参数（protocol parameters）
<p>1. HTTP版本——HTTP-Version = "HTTP" "/" 1*DIGIT "." 1*DIGIT
<p>2. 统一资源标示符（URI）——统一资源定位器(URL)和统一资源名称(URN)的结合，http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]
<p>3. 日期/时间格式——Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123，<br>Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036，<br>Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
<p>4. 字符集——本文档中的术语"字符集"指一种用一个或更多表格将一个八字节序列转换成一个字符序列的方法，<br>charset=token<br>失踪字符集
<p>5. 内容编码——内容编码主要用来允许文档压缩（信源编码）<br>content-coding= token<br>注册表包含下列标记：gzip，compress，deflate，identity
<p>6. 传输编码——目的是能够确保通过网络安全传输（信道编码）<br>transfer-coding = "chunked" | transfer-extension<br>transfer-extension = token *( ";" parameter )，<br>成块传输代码
<p>7. 媒体类型——media-type = type "/" subtype *( ";" parameter )<br>type = token<br>subtype = token<br>规范化和原文缺省<br>多部分类型
<p>8. 产品标记——product = token ["/" product-version]<br>product-version = token
<p>9. 质量值——qvalue = ( "0" [ "." 0*3DIGIT ] )| ( "1" [ "." 0*3("0") ] )
<p>10. 语言标记——language-tag = primary-tag *( "-" subtag )<br>primary-tag = 1*8ALPHA<br>subtag = 1*8ALPHA
<p>11. 实体标记——entity-tag = [ weak ] opaque-tag<br>weak = "W/"<br>opaque-tag = quoted-string
<p>12. 范围单位——range-unit = bytes-unit | other-range-unit<br>bytes-unit = "bytes"<br>other-range-unit = token
<p>四、 HTTP消息（HTTP message）
<p>1. 消息类型——HTTP-message = Request | Response ; HTTP/1.1 messages<br>generic-message = start-line *(message-header CRLF) CRLF [ message-body ]<br>start-line = Request-Line | Status-Line
<p>2. 消息头——HTTP头域包括常规头,请求头,应答头和实体头域<br>message-header = field-name ":" [ field-value ]<br>field-name = token<br>field-value = *( field-content | LWS )<br>field-content = &lt;the OCTETs making up the field-value and consisting of either *TEXT or combinations of token, separators, and quoted-string&gt;
<p>3. 消息体——message-body = entity-body| &lt;entity-body encoded as per Transfer-Encoding&gt;
<p>4. 消息的长度——决定因素
<p>5. 常规头域——general-header = Cache-Control| Connection| Date| Pragma| Transfer-Encoding
<p>五、 请求（request）
<p>首行包括利用资源的方式,区分资源的标识,以及协议的版本号<br>Request = Request-Line * (( general-header| request-header| entity-header ) CRLF) CRLF [ message-body ]
<p>1. 请求行——Request-Line = Method SP Request-URI SP HTTP-Version CRLF<br>方法——方法标记指的是在请求URI所指定的资源上所实现的方式<br>Method = "OPTIONS"| "GET"| "POST"| "PUT"| "DELETE"| "TRACE"| "CONNECT"| extension-method<br>extension-method = token<br>请求URL——请求URL是一种全球统一的应用于资源请求的资源标识符<br>Request-URI = "*" | absoluteURI | abs_path | authority<br>请求行举例：GET <a href="http://www.w3.org/pub/WWW/TheProject.html">http://www.w3.org/pub/WWW/TheProject.html</a> HTTP/1.1<br>GET /pub/WWW/TheProject.html HTTP/1.1<br>Host: www.w3.org
<p>2. 请求定义的资源——一个INTERNET请求所定义的精确资源由请求URL和主机报头域所决定
<p>3. 请求报头域——request-header = Accept| Accept-Charset| Accept-Encoding| Accept-Language| Authorization| Expect| From| Host| If-Match| If-Modified-Since| If-None-Match| If-Range| If-Unmodified-Since| Max-Forwards| Proxy-Authorization| Range| Referer| TE| User-Agent
<p>六、 应答（response）
<p>接收和翻译一个请求信息后，服务器发出一个HTTP应答信息<br>Response = Status-Line*(( general-header| response-header| entity-header ) CRLF) CRLF [ message-body ]
<p>1. 状态行——Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF<br>状态码——状态码是试图理解和满足请求的三位数字的整数码，1xx,2xx,3xx,4xx,5xx，100-〉505-〉扩展码
<p>2. 应答报头域——response-header = Accept-Ranges| Age| Location| Proxy-Authenticate| Retry-After| Server| Vary| WWW-Authenticate
<p>七、 实体（entity）
<p>在未经特别规定的情况下，请求与应答的消息也可以传送实体。 实体包括实体报头域与实体正文，而有些应答只包括实体报头。
<p>1. 实体报头域——entity-header = Allow | Content-Encoding| Content-Language| Content-Length | Content-Location| Content-MD5| Content-Range| Content-Type| Expires| Last-Modified| extension-header<br>extension-header = message-header
<p>2. 实体正文——entity-body = *OCTET<br>entity-body := Content-Encoding( Content-Type( data ) )
<p>八、 连接（connection）
<p>1. 持续连接——优点<br>持续连接是任何HTTP连接的缺省方式，支持持续连接的客户机可以以流水线方式发送请求<br>代理服务器
<p>2. 消息传递要求——持续连接与流量控制<br>监视连接中出错状态的消息<br>100号状态的用途<br>服务器过早关闭连接时客户机的动作
<p>九、 方法定义（method definitions）
<p>1. 安全和等幂方法<br>安全方法——GET和HEAD方法除了补救外不应该有别的采取措施的含义<br>等幂方法——没有副作用的序列是等幂的
<p>2. OPTIONS——OPTIONS方法代表在请求URI确定的请求/应答过程中通信条件是否可行的信息
<p>3. GET——GET方法说明了重建信息的内容由请求URI来确定
<p>4. HEAD——除了应答中禁止返回消息正文外,HEAD方法与GET方法一样
<p>5. POST——POST方法实现的实际功能取决于服务器
<p>6. PUT——PUT方法要求所附实体存储在提供的请求URI下
<p>7. DELETE——DELELE方法要求原服务器释放请求URI指向的资源
<p>8. TRACE——TRACE方法用于调用远程的应用层循环请求消息
<p>9. CONNECT——CONNECT方法用于能动态建立起隧道的代理服务器
<p>十、 状态码定义（status code definitions）
<p>1. 信息1XX——<br>100继续<br>101转换协议
<p>2. 成功2XX——<br>200请求成功<br>201创建<br>202接受<br>203非权威信息<br>204无内容<br>205重置内容<br>206局部内容
<p>3. 重新定向3XX——<br>300多样选择<br>301永久移动<br>302创立<br>303观察别的部分<br>304只读<br>306(没有用的)<br>307临时重发
<p>4. 客户错误4xx——<br>400坏请求<br>401未授权的<br>402必需的支付<br>403禁用<br>404没有找到<br>405不被允许的方法<br>406不接受<br>407代理服务器认证所必需<br>408请求超时<br>409冲突<br>410停止<br>411必需的长度<br>412预处理失败<br>413请求实体太大<br>414请求的URI过长<br>415不被支持的媒体类型<br>416请求范围不满足<br>417期望失败
<p>5. 服务器错误5xx——<br>500服务器内部错误<br>501不能实现<br>502坏网关<br>503难以获得的服务<br>504网关超时<br>505 HTTP版本不支持
<p>十一、 访问验证（access authentication）——可选择
<p>十二、 内容谈判（content negotiation）
<p>HTTP为了"内容谈判"提供了一些机制，即当有很多种可能的表示时如何选择对于一个请求的最佳的表示。
<p>1. 服务器驱动谈判——一个请求的最佳表示的选择由服务器提供的运算法则来完成
<p>2. 代理驱动谈判——对于一个应答的最佳表示法的选择是在代理从原服务器端收到最初的应答后实现的
<p>3. 透明谈判——透明的判断是服务器驱动和代理驱动谈判的结合体
<p>十三、 HTTP中的缓存（caching in HTTP）
<p>HTTP典型应用于能通过采用缓存技术而提高性能的分布式信息系统
<p>1. 缓存——<br>缓存正确性<br>警告信息<br>缓存控制机制<br>直接的用户代理警告<br>规则和警告的例外情况<br>由客户控制的行为
<p>2. 过期模型——<br>服务器指定模型<br>启发式过期<br>年龄计算<br>过期计算<br>澄清过期值<br>澄清多重响应
<p>3. 确认模型——当缓存器想要用一个失时效的条目来相应客户的请求,他首先必须向源服务器检验这一缓存条目是否仍然可用<br>最后修改日期<br>标签缓存确认器<br>强弱控制器<br>关于何时使用实体标签和最后修改时间的规则<br>不确认条件
<p>4. 响应的缓存能力——除非被明确限制,缓存系统可以将一成功的响应作为缓存实体一直存储
<p>5. 从缓存构造响应——<br>端到端和Hop-by-hop报头<br>不可更改报头<br>联合报头<br>联合字节范围
<p>6. 缓存谈判响应
<p>7. 共享与非共享缓存
<p>8. 错误和不完全响应缓存行为
<p>9. GET和 HEAD的副作用
<p>10. 刷新或删除后的无效性
<p>11. 强制写通过
<p>12. 缓存替换
<p>13. 历史纪录
<p>十四、 报头域定义（header field definitions）
<p>1. Accept——Accept = "Accept" ":" #( media-range [ accept-params ] )<br>media-range = ( "*/*"| ( type "/" "*" )| ( type "/" subtype )) *( ";" parameter )<br>accept-params = ";" "q" "=" qvalue *( accept-extension )<br>accept-extension = ";" token [ "=" ( token | quoted-string ) ]<br>例1：Accept: audio/*; q=0.2, audio/basic<br>例2：Accept: text/plain; q=0.5, text/html, text/x-dvi; q=0.8, text/x-c
<p>2. Accept-Charset——Accept-Charset = "Accept-Charset" ":" 1#( ( charset | "*" )[ ";" "q" "=" qvalue ] )<br>例：Accept-Charset: iso-8859-5, unicode-1-1;q=0.8
<p>3. Accept-Encoding——Accept-Encoding = "Accept-Encoding" ":" 1#( codings [ ";" "q" "=" qvalue ] )<br>codings = ( content-coding | "*" )<br>例：Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0
<p>4. Accept-Language——Accept-Language = "Accept-Language" ":" 1#( language-range [ ";" "q" "=" qvalue ] )<br>language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )<br>例：Accept-Language: da, en-gb;q=0.8, en;q=0.7
<p>5. Accept-Range——Accept-Ranges = "Accept-Ranges" ":" acceptable-ranges<br>acceptable-ranges = 1#range-unit | "none"<br>例：Accept-Ranges: bytes
<p>6. Age——Age = "Age" ":" age-value<br>age-value = delta-seconds
<p>7. Allow——Allow = "Allow" ":" #Method<br>例：Allow: GET, HEAD, PUT
<p>8. Authorization——Authorization = "Authorization" ":" credentials
<p>9. Cache-Control——Cache-Control = "Cache-Control" ":" 1#cache-directive<br>cache-directive = cache-request-directive| cache-response-directive<br>cache-request-directive ="no-cache"| "no-store"| "max-age" "=" delta-seconds| "max-stale" [ "=" delta-seconds ]| "min-fresh" "=" delta-seconds| "no-transform"| "only-if-cached"| cache-extension<br>cache-response-directive ="public"| "private" [ "=" &lt;"&gt; 1#field-name &lt;"&gt; ]| "no-cache" [ "=" &lt;"&gt; 1#field-name &lt;"&gt; ]| "no-store"| "no-transform"| "must-revalidate"| "proxy-revalidate"| "max-age" "=" delta-seconds| "s-maxage" "=" delta-seconds| cache-extension<br>cache-extension = token [ "=" ( token | quoted-string ) ]<br>什么是可缓存的<br>哪些可能被缓存保存<br>对基本过期失效机制的改进<br>缓存重新确认有效和重载控制<br>不得转换的指令<br>缓存控制扩展
<p>10. Connection——Connection = "Connection" ":" 1#(connection-token)<br>connection-token = token<br>例：Connection: close
<p>11. Content-Encoding——Content-Encoding = "Content-Encoding" ":" 1#content-coding<br>例：Content-Encoding: gzip
<p>12. Content-Language——Content-Language = "Content-Language" ":" 1#language-tag<br>例：Content-Language: mi, en
<p>13. Content-Length——Content-Length = "Content-Length" ":" 1*DIGIT<br>Content-Length: 3495
<p>14. Content-Location——Content-Location = "Content-Location" ":"( absoluteURI | relativeURI )
<p>15. Content-MD5——Content-MD5 = "Content-MD5" ":" md5-digest<br>md5-digest = &lt;base64 of 128 bit MD5 digest as per RFC 1864&gt;
<p>16. Content-Range——Content-Range = "Content-Range" ":" content-range-spec<br>content-range-spec = byte-content-range-spec<br>byte-content-range-spec = bytes-unit SP byte-range-resp-spec "/"( instance-length | "*" )<br>byte-range-resp-spec = (first-byte-pos "-" last-byte-pos) | "*"<br>instance-length = 1*DIGIT<br>例：The first 500 bytes:bytes 0-499/1234
<p>17. Content-Type——Content-Type = "Content-Type" ":" media-type<br>例：Content-Type: text/html; charset=ISO-8859-4
<p>18. Date——Date = "Date" ":" HTTP-date<br>例：Date: Tue, 15 Nov 1994 08:12:31 GMT<br>没有时钟的原服务器的运作
<p>19. Etag——ETag = "ETag" ":" entity-tag<br>例：ETag: W/"xyzzy"
<p>20. Expect——Expect = "Expect" ":" 1#expectation<br>expectation = "100-continue" | expectation-extension<br>expectation-extension = token [ "=" ( token | quoted-string )*expect-params ]<br>expect-params = ";" token [ "=" ( token | quoted-string ) ]
<p>21. Expires——Expires = "Expires" ":" HTTP-date<br>例：Expires: Thu, 01 Dec 1994 16:00:00 GMT
<p>22. From——From = "From" ":" mailbox<br>例：From: webmaster@w3.org
<p>23. Host——Host = "Host" ":" host [ ":" port ] ; Section 3.2.2
<p>24. If-Match——If-Match = "If-Match" ":" ( "*" | 1#entity-tag )<br>例：If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
<p>25. If-Modified-Since——If-Modified-Since = "If-Modified-Since" ":" HTTP-date<br>例：If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
<p>26. If-None-Match ——If-None-Match = "If-None-Match" ":" ( "*" | 1#entity-tag )<br>例：If-None-Match: W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz"
<p>27. If-Range ——If-Range = "If-Range" ":" ( entity-tag | HTTP-date )
<p>28. If-Unmodified-Since ——If-Unmodified-Since = "If-Unmodified-Since" ":" HTTP-date<br>例：If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT
<p>29. Last-Modified ——Last-Modified = "Last-Modified" ":" HTTP-date<br>例：Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT
<p>30. Location ——Location = "Location" ":" absoluteURI<br>Location: <a href="http://www.w3.org/pub/WWW/People.html">http://www.w3.org/pub/WWW/People.html</a>
<p>31. Max-Forwards ——Max-Forwards = "Max-Forwards" ":" 1*DIGIT
<p>32. Pragma ——Pragma = "Pragma" ":" 1#pragma-directive<br>pragma-directive = "no-cache" | extension-pragma<br>extension-pragma = token [ "=" ( token | quoted-string ) ]
<p>33. Proxy-Authenticate ——Proxy-Authenticate = "Proxy-Authenticate" ":" 1#challenge
<p>34. Proxy-Authorization ——Proxy-Authorization = "Proxy-Authorization" ":" credentials
<p>35. Range——字节范围<br>范围检索请求<br>Range = "Range" ":" ranges-specifier
<p>36. Referer——Referer = "Referer" ":" ( absoluteURI | relativeURI )
<p>37. Retry-After ——Retry-After = "Retry-After" ":" ( HTTP-date | delta-seconds )
<p>38. Server ——Server = "Server" ":" 1*( product | comment )
<p>39. TE ——TE = "TE" ":" #( t-codings )<br>t-codings = "trailers" | ( transfer-extension [ accept-params ] )<br>例：TE: trailers, deflate;q=0.5
<p>40. Trailer ——Trailer = "Trailer" ":" 1#field-name
<p>41. Transfer-Encoding ——Transfer-Encoding = "Transfer-Encoding" ":" 1#transfer-coding<br>例：Transfer-Encoding: chunked
<p>42. Upgrade——Upgrade = "Upgrade" ":" 1#product<br>例：Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
<p>43. User-Agent ——User-Agent = "User-Agent" ":" 1*( product | comment )<br>例：User-Agent: CERN-LineMode/2.15 libwww/2.17b3
<p>44. Vary ——Vary = "Vary" ":" ( "*" | 1#field-name )
<p>45. Via ——Via = "Via" ":" 1#( received-protocol received-by [ comment ] )<br>received-protocol = [ protocol-name "/" ] protocol-version<br>protocol-name = token<br>protocol-version = token<br>received-by = ( host [ ":" port ] ) | pseudonym<br>pseudonym = token<br>例：Via: 1.0 ricky, 1.1 ethel, 1.1 fred, 1.0 lucy
<p>46. Warning = "Warning" ":" 1#warning-value<br>warning-value = warn-code SP warn-agent SP warn-text [SP warn-date]<br>warn-code = 3DIGIT<br>warn-agent = ( host [ ":" port ] ) | pseudonym<br>warn-text = quoted-string<br>warn-date = &lt;"&gt; HTTP-date &lt;"&gt;
<p>47. WWW-Authenticate ——WWW-Authenticate = "WWW-Authenticate" ":" 1#challenge
<p>十五、 安全考虑（security considerations）
<p>一些建议，但是并不包括最终解决方案
<p>1. 个人信息<br>服务器日志信息的滥用<br>敏感信息的传输<br>URI中敏感信息的编码<br>连接到Accept报头的机要问题
<p>2. 基于文件和路径名称的攻击
<p>3. DNS欺骗
<p>4. Location（位置）报头和欺骗
<p>5. 内容倾向问题
<p>6. 鉴定证书和空闲的客户机
<p>7. 代理服务器和高速缓存<br>对代理服务器的拒绝服务攻击
<p>十六、 感谢
<p>十七、 参考文献
<p>十八、 作者地址
<p>十九、 附录</p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/51408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-05-28 17:05 <a href="http://www.cppblog.com/woaidongmao/archive/2008/05/28/51408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP深入浅出</title><link>http://www.cppblog.com/woaidongmao/archive/2008/05/28/51407.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Wed, 28 May 2008 09:02:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/05/28/51407.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/51407.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/05/28/51407.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/51407.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/51407.html</trackback:ping><description><![CDATA[<p>HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则。计算机专家设计出HTTP，使HTTP客户（如Web浏览器）能够从HTTP服务器(Web服务器)请求信息和服务，HTTP目前协议的版本是1.1.HTTP是一种无状态的协议，无状态是指Web浏览器和Web服务器之间不需要建立持久的连接，这意味着当一个客户端向服务器端发出请求，然后Web服务器返回响应(response)，连接就被关闭了，在服务器端不保留连接的有关信息.HTTP遵循请求(Request)/应答(Response)模型。Web浏览器向Web服务器发送请求，Web服务器处理请求并返回适当的应答。所有HTTP连接都被构造成一套请求和应答。
<p>HTTP使用内容类型，是指Web服务器向Web浏览器返回的文件都有与之相关的类型。所有这些类型在MIME　Internet邮件协议上模型化，即Web服务器告诉Web浏览器该文件所具有的种类，是HTML文档、GIF格式图像、声音文件还是独立的应用程序。大多数Web浏览器都拥有一系列的可配置的辅助应用程序，它们告诉浏览器应该如何处理Web服务器发送过来的各种内容类型。
<p>HTTP通信机制是在一次完整的HTTP通信过程中，Web浏览器与Web服务器之间将完成下列7个步骤：
<p>（1）&nbsp;&nbsp;&nbsp; 建立TCP连接
<p>在HTTP工作开始之前，Web浏览器首先要通过网络与Web服务器建立连接，该连接是通过TCP来完成的，该协议与IP协议共同构建Internet，即著名的TCP/IP协议族，因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议，根据规则，只有低层协议建立之后才能，才能进行更层协议的连接，因此，首先要建立TCP连接，一般TCP连接的端口号是80
<p>（2）&nbsp;&nbsp;&nbsp; Web浏览器向Web服务器发送请求命令
<p>一旦建立了TCP连接，Web浏览器就会向Web服务器发送请求命令
<p>例如：GET/sample/hello.jsp HTTP/1.1
<p>（3）&nbsp;&nbsp;&nbsp; Web浏览器发送请求头信息
<p>浏览器发送其请求命令之后，还要以头信息的形式向Web服务器发送一些别的信息，之后浏览器发送了一空白行来通知服务器，它已经结束了该头信息的发送。
<p>（4）&nbsp;&nbsp;&nbsp; Web服务器应答
<p>客户机向服务器发出请求后，服务器会客户机回送应答，
<p>HTTP/1.1 200 OK
<p>应答的第一部分是协议的版本号和应答状态码
<p>（5）&nbsp;&nbsp;&nbsp; Web服务器发送应答头信息
<p>正如客户端会随同请求发送关于自身的信息一样，服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。
<p>（6）&nbsp;&nbsp;&nbsp; Web服务器向浏览器发送数据
<p>Web服务器向浏览器发送头信息后，它会发送一个空白行来表示头信息的发送到此为结束，接着，它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据
<p>（7）&nbsp;&nbsp;&nbsp; Web服务器关闭TCP连接
<p>一般情况下，一旦Web服务器向浏览器发送了请求数据，它就要关闭TCP连接，然后如果浏览器或者服务器在其头信息加入了这行代码
<p>Connection:keep-alive
<p>TCP连接在发送后将仍然保持打开状态，于是，浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间，还节约了网络带宽。
<p>HTTP请求格式
<p>当浏览器向Web服务器发出请求时，它向服务器传递了一个数据块，也就是请求信息，HTTP请求信息由3部分组成：
<p>l&nbsp;&nbsp; 请求方法URI协议/版本
<p>l&nbsp;&nbsp; 请求头(Request Header)
<p>l&nbsp;&nbsp; 请求正文
<p>下面是一个HTTP请求的例子：
<p>GET/sample.jspHTTP/1.1
<p>Accept:image/gif.image/jpeg,*/*
<p>Accept-Language:zh-cn
<p>Connection:Keep-Alive
<p>Host:localhost
<p>User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
<p>Accept-Encoding:gzip,deflate
<p>username=jinqiao&amp;password=1234
<p>（1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 请求方法URI协议/版本
<p>请求的第一行是&#8220;方法URL议/版本&#8221;：GET/sample.jsp HTTP/1.1
<p>以上代码中&#8220;GET&#8221;代表请求方法，&#8220;/sample.jsp&#8221;表示URI，&#8220;HTTP/1.1代表协议和协议的版本。
<p>根据HTTP标准，HTTP请求可以使用多种请求方法。例如：HTTP1.1支持7种请求方法：GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。在Internet应用中，最常用的方法是GET和POST。
<p>URL完整地指定了要访问的网络资源，通常只要给出相对于服务器的根目录的相对目录即可，因此总是以&#8220;/&#8221;开头，最后，协议版本声明了通信过程中使用HTTP的版本。
<p>（2）　请求头(Request Header)
<p>请求头包含许多有关的客户端环境和请求正文的有用信息。例如，请求头可以声明浏览器所用的语言，请求正文的长度等。
<p>Accept:image/gif.image/jpeg.*/*
<p>Accept-Language:zh-cn
<p>Connection:Keep-Alive
<p>Host:localhost
<p>User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)
<p>Accept-Encoding:gzip,deflate.
<p>（3）　请求正文
<p>请求头和请求正文之间是一个空行，这个行非常重要，它表示请求头已经结束，接下来的是请求正文。请求正文中可以包含客户提交的查询字符串信息：
<p>username=jinqiao&amp;password=1234
<p>在以上的例子的HTTP请求中，请求的正文只有一行内容。当然，在实际应用中，HTTP请求正文可以包含更多的内容。
<p>HTTP请求方法我这里只讨论GET方法与POST方法
<p>GET方法
<p>GET方法是默认的HTTP请求方法，我们日常用GET方法来提交表单数据，然而用GET方法提交的表单数据只经过了简单的编码，同时它将作为URL的一部分向Web服务器发送，因此，如果使用GET方法来提交表单数据就存在着安全隐患上。例如
<p><a href="http://127.0.0.1/login.jsp?Name=zhangshi&amp;Age=30&amp;Submit=%cc%E+%BD%BB">Http://127.0.0.1/login.jsp?Name=zhangshi&amp;Age=30&amp;Submit=%cc%E+%BD%BB</a>
<p>从上面的URL请求中，很容易就可以辩认出表单提交的内容。（？之后的内容）另外由于GET方法提交的数据是作为URL请求的一部分所以提交的数据量不能太大
<p>POST方法
<p>POST方法是GET方法的一个替代方法，它主要是向Web服务器提交表单数据，尤其是大批量的数据。POST方法克服了GET方法的一些缺点。通过POST方法提交表单数据时，数据不是作为URL请求的一部分而是作为标准数据传送给Web服务器，这就克服了GET方法中的信息无法保密和数据量太小的缺点。因此，出于安全的考虑以及对用户隐私的尊重，通常表单提交时采用POST方法。
<p>从编程的角度来讲，如果用户通过GET方法提交数据，则数据存放在QUERY＿STRING环境变量中，而POST方法提交的数据则可以从标准输入流中获取。
<p>HTTP应答与HTTP请求相似，HTTP响应也由3个部分构成，分别是：
<p>l 　协议状态版本代码描述
<p>l 　响应头(Response Header)
<p>l 　响应正文
<p>&nbsp;
<p>下面是一个HTTP响应的例子：
<p>HTTP/1.1 200 OK
<p>Server:Apache Tomcat/5.0.12
<p>Date:Mon,6Oct2003 13:23:42 GMT
<p>Content-Length:112
<p>&lt;html&gt;<br>&lt;head&gt;
<p>&lt;title&gt;HTTP响应示例&lt;title&gt;
<p>&lt;/head&gt;
<p>&lt;body&gt;
<p>Hello HTTP!
<p>&lt;/body&gt;
<p>&lt;/html&gt;</p>
<p><br>协议状态代码描述HTTP响应的第一行类似于HTTP请求的第一行，它表示通信所用的协议是HTTP1.1服务器已经成功的处理了客户端发出的请求（200表示成功）: </p>
<p>HTTP/1.1 200 OK<br>响应头(Response Header)响应头也和请求头一样包含许多有用的信息，例如服务器类型、日期时间、内容类型和长度等：
<p>Server:Apache Tomcat/5.0.12
<p>Date:Mon,6Oct2003 13:13:33 GMT
<p>Content-Type:text/html
<p>Last-Moified:Mon,6 Oct 2003 13:23:42 GMT
<p>Content-Length:112
<p>响应正文响应正文就是服务器返回的HTML页面：
<p>&lt;html&gt;<br>&lt;head&gt;
<p>&lt;title&gt;HTTP响应示例&lt;title&gt;
<p>&lt;/head&gt;
<p>&lt;body&gt;
<p>Hello HTTP!
<p>&lt;/body&gt;
<p>&lt;/html&gt;
<p>响应头和正文之间也必须用空行分隔。　　
<p>HTTP应答码
<p>HTTP应答码也称为状态码，它反映了Web服务器处理HTTP请求状态。HTTP应答码由3位数字构成，其中首位数字定义了应答码的类型：
<p>1XX－信息类(Information),表示收到Web浏览器请求，正在进一步的处理中
<p>2XX－成功类（Successful）,表示用户请求被正确接收，理解和处理例如：200 OK
<p>3XX-重定向类(Redirection),表示请求没有成功，客户必须采取进一步的动作。
<p>4XX-客户端错误(Client Error)，表示客户端提交的请求有错误 例如：404 NOT&nbsp; Found，意味着请求中所引用的文档不存在。
<p>5XX-服务器错误(Server Error)表示服务器不能完成对请求的处理：如 500
<p>对于我们Web开发人员来说掌握HTTP应答码有助于提高Web应用程序调试的效率和准确性。
<p>安全连接
<p>Web应用最常见的用途之一是电子商务，可以利用Web服务器端程序使人们能够网络购物，需要指出一点是，缺省情况下，通过Internet发送信息是不安全的，如果某人碰巧截获了你发给朋友的一则消息，他就能打开它，假想在里面有你的信用卡号码，这会有多么糟糕，幸运的是，很多Web服务器以及Web浏览器都有创立安全连接的能力，这样它们就可以安全的通信了。
<p>通过Internet提供安全连接最常见的标准是安全套接层(Secure Sockets layer,SSl)协议。SSL协议是一个应用层协议(和HTTP一样)，用于安全方式在Web上交换数据，SSL使用公开密钥编码系统。从本质讲，这意味着业务中每一方都拥有一个公开的和一个私有的密钥。当一方使用另一方公开密钥进行编码时，只有拥有匹配密钥的人才能对其解码。简单来讲，公开密钥编码提供了一种用于在两方之间交换数据的安全方法，SSL连接建立之后，客户和服务器都交换公开密钥，并在进行业务联系之前进行验证，一旦双方的密钥都通过验证，就可以安全地交换数据。 </p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/51407.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-05-28 17:02 <a href="http://www.cppblog.com/woaidongmao/archive/2008/05/28/51407.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP客户请求的数据格式说明</title><link>http://www.cppblog.com/woaidongmao/archive/2008/05/28/51405.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Wed, 28 May 2008 08:58:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/05/28/51405.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/51405.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/05/28/51405.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/51405.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/51405.html</trackback:ping><description><![CDATA[<p>HTTP请求包括三部分：请求行(Request Line)，头部（Headers）和数据体（Body)。其中，请求行由请求方法(method)，请求网址Request-URI和协议 (Protocol)构成，而请求头包括多个属性，数据体则可以被认为是附加在请求之后的文本或二进制文件。</p>
<p>下面这个例子显示了一个HTTP请求的Header内容，这些数据是真正以网络HTTP协议从IE浏览器传递到Apache服务器上的。</p>
<p>GET /icwork/? search=product HTTP/1.1</p>
<p>Accept:image/gif,image/x-xbitmap,image/jpeg,image/pjpeg,application/vnd.ms-powerpoint,application/vnd.ms-excel,application/msword,*.*</p>
<p>Accept-Language:en-us</p>
<p>Accept-Encoding:gzip,deflate</p>
<p>User-Agent:Mozilla/4.0(compatible;MSIE 5.01;Windows NT 5.0;DigExt)</p>
<p>Host:www.icconcept.com:8080</p>
<p>Referer:http://www.yoursite.com/header.html</p>
<p>Connection:Keep-Alive</p>
<p>这段程序使用了6个Header，还有一些Header没有出现。我们参考这个例子具体解释HTTP请求格式。</p>
<p>1.HTTP请求行：请求行格式为Method Request-URI Protocol。在上面这个例子里，&#8220;GET /icwork/? search=pruduct HTTP/1.1&#8221;是请求行。</p>
<p>2.Accept:指浏览器或其他客户可以接爱的MIME文件格式。Servlet可以根据它判断并返回适当的文件格式。</p>
<p>3.Accept-Charset：指出浏览器可以接受的字符编码。英文浏览器的默认值是ISO-8859-1.</p>
<p>4.Accept-Language：指出浏览器可以接受的语言种类，如en或en-us，指英语。</p>
<p>5.Accept-Encoding：指出浏览器可以接受的编码方式。编码方式不同于文件格式，它是为了压缩文件并加速文件传递速度。浏览器在接收到Web响应之后先解码，然后再检查文件格式。</p>
<p>6.Authorization：当使用密码机制时用来标识浏览器。</p>
<p>7.Cache-Control：设置关于请求被代理服务器存储的相关选项。一般servlet用不到。</p>
<p>8.Connection：用来告诉服务器是否可以维持固定的HTTP连接。HTTP/1.1使用Keep-Alive为默认值，这样，当浏览器需要多个文件时(比如一个HTML文件和相关的图形文件)，不需要每次都建立连接。</p>
<p>9.Content-Type：用来表名request的内容类型。可以用HttpServletRequest的getContentType()方法取得。</p>
<p>10.Cookie：浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体，它可以记载和服务器相关的用户信息，也可以用来实现会话功能。</p>
<p>11.Expect：表时客户预期的响应状态。</p>
<p>12.From：给出客户端HTTP请求负责人的email地址。</p>
<p>13.Host：对应网址URL中的Web名称和端口号。</p>
<p>14.If-Match：供PUT方法使用。</p>
<p>15.If-Modified-Since：客户使用这个属性表明它只需要在指定日期之后更改过的网页。因为浏览器可以使用其存储的文件而不必从服务器请求，这样节省了Web资源。由于Servlet是动态生成的网页，一般不需要使用这个属性。</p>
<p>16.If-None-Match：和If-Match相反的操作，供PUT方法使用。</p>
<p>17.If-Unmodified-Since：和If-Match-Since相反。</p>
<p>18.Pragma：这个属性只有一种值，即Pragma：no-cache,表明如果servlet充当代理服务器，即使其有已经存储的网页，也要将请求传递给目的服务器。</p>
<p>19.Proxy-Authorization：代理服务器使用这个属性，Servlet一般用不到。</p>
<p>20.Range：如果客户有部分网页，这个属性可以请求剩余部分。</p>
<p>21.Referer：表明产生请求的网页URL。如比从网页/icconcept/index.jsp中点击一个链接到网页/icwork/search，在向服务器发送的GET/icwork/search中的请求中，Referer是<a href="http://hostname:8080/icconcept/index.php">http://hostname:8080/icconcept/index.php</a>。这个属性可以用来跟踪Web请求是从什么网站来的。</p>
<p>22.Upgrage：客户通过这个属性设定可以使用与HTTP/1.1不同的协议。</p>
<p>23.User-Agent：是客户浏览器名称。</p>
<p>24.Via：用来记录Web请求经过的代理服务器或Web通道。</p>
<p>25.Warning：用来由客户声明传递或存储(cache)错误。</p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/51405.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-05-28 16:58 <a href="http://www.cppblog.com/woaidongmao/archive/2008/05/28/51405.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SOAP, HTTP GET, HTTP POST</title><link>http://www.cppblog.com/woaidongmao/archive/2008/05/28/51389.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Wed, 28 May 2008 07:32:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/05/28/51389.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/51389.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/05/28/51389.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/51389.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/51389.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在web服务中，有三种可供选择的发送和接受信息的协议：SOAP,HTTP GET,HTTP POST,但是SOAP支持的数据类型更为广泛
<blockquote>
<p><strong>SOAP=RPC+HTTP+XML</strong></p>
</blockquote>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOAP简单的理解，就是这样的一个开放协议SOAP=RPC+HTTP+XML：<font color=#800000>采用HTTP作为底层通讯协议；RPC作为一致性的调用途径，ＸＭＬ作为数据传送的格式，允许服务提供者和服务客户经过防火墙在INTERNET进行通讯交互。</font>RPC的描叙可能不大准确，因为SOAP一开始构思就是要实现平台与环境的无关性和独立性，每一个通过网络的远程调用都可以通过SOAP封装起来，包括DCE（Distributed Computing Environment ）　RPC CALLS，COM/DCOM CALLS, CORBA CALLS, JAVA CALLS，etc。
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SOAP 使用 HTTP 传送 XML，尽管HTTP 不是有效率的通讯协议，而且 XML 还需要额外的文件解析（parse），两者使得交易的速度大大低于其它方案。但是XML 是一个开放、健全、有语义的讯息机制，而 HTTP 是一个广泛又能避免许多关于防火墙的问题，从而使SOAP得到了广泛的应用。但是如果效率对你来说很重要，那么你应该多考虑其它的方式，而不要用 SOAP。 </p>
<img src ="http://www.cppblog.com/woaidongmao/aggbug/51389.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-05-28 15:32 <a href="http://www.cppblog.com/woaidongmao/archive/2008/05/28/51389.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>