<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>梁剑的Blog &#187; Web</title>
	<atom:link href="http://icomes.net/category/%e6%8a%80%e6%9c%af%e7%ac%94%e8%ae%b0/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://icomes.net</link>
	<description>做有趣的事，做有用的人</description>
	<lastBuildDate>Wed, 23 Jun 2010 16:04:55 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Web实现服务器推的三种技术</title>
		<link>http://icomes.net/2009/10/24/web%e5%ae%9e%e7%8e%b0%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%8e%a8%e7%9a%84%e4%b8%89%e7%a7%8d%e6%8a%80%e6%9c%af/</link>
		<comments>http://icomes.net/2009/10/24/web%e5%ae%9e%e7%8e%b0%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%8e%a8%e7%9a%84%e4%b8%89%e7%a7%8d%e6%8a%80%e6%9c%af/#comments</comments>
		<pubDate>Sat, 24 Oct 2009 07:07:00 +0000</pubDate>
		<dc:creator>梁剑</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[技术笔记]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Server Push]]></category>
		<category><![CDATA[服务器推]]></category>

		<guid isPermaLink="false">http://icomes.net/?p=468</guid>
		<description><![CDATA[1. Hidden iframe
将iframe的src指向一个url，server收到请求后，Keep-Alive。
数据直接以script的方式下发到Browser，Browser收到数据后直接执行。
只要不超时，链接会一直保留。
优：感觉这是真正的长连接，对stream也有完整的支持。
劣：Browser状态栏会一直处于“连接中”，ESC会导致链接断开，会有跨域问题
2. Script Tag
用JS创建一个script对象，将该对象的src指向一个url，Keep-Alive。
在一定时间内（超时前），如果sever有数据下发，则用script的方式发送到Browser。
Browser收到数据后直接执行，此时需要重建script对象，建立另一个链接。
优：没有Hidden iframe的缺点，也比较轻量
劣：不是真正的长链接，每收到一个新的下发数据，都需要重新建立链接
3 AJAX
用JS创建一个XHR对象，将该对象的src指向一个url，Keep-Alive。
在一定时间内（超时前），如果sever有数据下发，则通过已建立的链接发送到Browser。
Browser收到数据后直接执行，此时需要重建XHR对象，建立另一个链接。
优：没有Hidden iframe的缺点
劣：存在跨域问题，不是真正的长链接，每收到一个新的下发数据，都需要重新建立链接
2 和 3也可以叫做Long Polling
除了这三种方法，还可以用Flash，由Flash和Server通信，页面用过JS和Flash通信。
这可以实现真正的下发，甚至不需要维护长链接。
但也可能存在被防火墙屏蔽的问题。
三种方法都用php模拟了一下：
Hidden Iframe

&#60;html&#62;
&#60;head&#62;
&#60;script&#62;
function callback&#40;data&#41;
&#123;
	document.getElementById&#40;&#34;t&#34;&#41;.value = data + &#34;\n&#34; + document.getElementById&#40;&#34;t&#34;&#41;.value;
&#125;
&#160;
callback&#40;&#34;abc&#34;&#41;;
&#60;/script&#62;
&#60;/head&#62;
&#60;body&#62;
hello
&#60;textarea id=&#34;t&#34;&#62;&#60;/textarea&#62;
&#60;iframe src=&#34;/hiddeniframe.php&#34; width=&#34;0&#34; height=&#34;0&#34;&#62;&#60;/iframe&#62;
&#60;/body&#62;
&#60;/html&#62;


&#60;?php
	ob_end_flush&#40;&#41;;
	echo &#34;&#60;script&#62;&#34;;
	echo &#34;domain=serverpush&#34;;
	echo &#34;&#60;/script&#62;&#34;;
	for&#40; ; ; &#41;
	&#123;
		$t = time&#40;&#41;;
		echo &#34;&#60;script&#62;&#34;;
		echo &#34;parent.callback($t);&#34;;
		echo &#34;&#60;/script&#62;&#34;;
		flush&#40;&#41;;
		sleep&#40;1&#41;;
	&#125;
?&#62;

Script Tag

&#60;html&#62;
&#60;head&#62;
&#60;script&#62;
function callback&#40;data&#41;
&#123;
	document.getElementById&#40;&#34;t&#34;&#41;.value = data + &#34;\n&#34; + document.getElementById&#40;&#34;t&#34;&#41;.value;
&#125;
&#160;
function connect&#40;&#41;
&#123;
    var _script = document.createElement&#40;&#34;script&#34;&#41;;
    _script.setAttribute&#40;&#34;type&#34;, &#34;text/javascript&#34;&#41;;
 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>1. Hidden iframe</strong></p>
<p>将iframe的src指向一个url，server收到请求后，Keep-Alive。<br />
数据直接以script的方式下发到Browser，Browser收到数据后直接执行。<br />
只要不超时，链接会一直保留。</p>
<p>优：感觉这是真正的长连接，对stream也有完整的支持。<br />
劣：Browser状态栏会一直处于“连接中”，ESC会导致链接断开，会有跨域问题</p>
<p><strong>2. Script Tag</strong></p>
<p>用JS创建一个script对象，将该对象的src指向一个url，Keep-Alive。<br />
在一定时间内（超时前），如果sever有数据下发，则用script的方式发送到Browser。<br />
Browser收到数据后直接执行，此时需要重建script对象，建立另一个链接。</p>
<p>优：没有Hidden iframe的缺点，也比较轻量<br />
劣：不是真正的长链接，每收到一个新的下发数据，都需要重新建立链接</p>
<p><strong>3 AJAX</strong></p>
<p>用JS创建一个XHR对象，将该对象的src指向一个url，Keep-Alive。<br />
在一定时间内（超时前），如果sever有数据下发，则通过已建立的链接发送到Browser。<br />
Browser收到数据后直接执行，此时需要重建XHR对象，建立另一个链接。</p>
<p>优：没有Hidden iframe的缺点<br />
劣：存在跨域问题，不是真正的长链接，每收到一个新的下发数据，都需要重新建立链接</p>
<p>2 和 3也可以叫做Long Polling</p>
<p>除了这三种方法，还可以用Flash，由Flash和Server通信，页面用过JS和Flash通信。<br />
这可以实现真正的下发，甚至不需要维护长链接。<br />
但也可能存在被防火墙屏蔽的问题。</p>
<p>三种方法都用php模拟了一下：</p>
<p>Hidden Iframe</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>html<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>head<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #003366; font-weight: bold;">function</span> callback<span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;t&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">value</span> <span style="color: #339933;">=</span> data <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #339933;">+</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;t&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">value</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
callback<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;abc&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>head<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>body<span style="color: #339933;">&gt;</span>
hello
<span style="color: #339933;">&lt;</span>textarea id<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;t&quot;</span><span style="color: #339933;">&gt;&lt;/</span>textarea<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>iframe src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;/hiddeniframe.php&quot;</span> width<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;0&quot;</span> height<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;0&quot;</span><span style="color: #339933;">&gt;&lt;/</span>iframe<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>body<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>html<span style="color: #339933;">&gt;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
	<span style="color: #990000;">ob_end_flush</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;script&gt;&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;domain=serverpush&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;/script&gt;&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">;</span> <span style="color: #339933;">;</span> <span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$t</span> <span style="color: #339933;">=</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;script&gt;&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;parent.callback(<span style="color: #006699; font-weight: bold;">$t</span>);&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;/script&gt;&quot;</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">flush</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #990000;">sleep</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Script Tag</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>html<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>head<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #003366; font-weight: bold;">function</span> callback<span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;t&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">value</span> <span style="color: #339933;">=</span> data <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #339933;">+</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;t&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">value</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> connect<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> _script <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;script&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    _script.<span style="color: #660066;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;type&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    _script.<span style="color: #660066;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;src&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;script.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    document.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;head&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>_script<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
<span style="color: #009900;">&#125;</span>
&nbsp;
connect<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>head<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>body<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>textarea id<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;t&quot;</span><span style="color: #339933;">&gt;&lt;/</span>textarea<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>body<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>html<span style="color: #339933;">&gt;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
	<span style="color: #990000;">sleep</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$r</span> <span style="color: #339933;">=</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;callback(<span style="color: #006699; font-weight: bold;">$r</span>);&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;setTimeout(connect, 1000)&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>AJAX</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>html<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>head<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #003366; font-weight: bold;">function</span> callback<span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;t&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">value</span> <span style="color: #339933;">=</span> data <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #339933;">+</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;t&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">value</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> connect<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #003366; font-weight: bold;">var</span> ajax <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> XMLHttpRequest<span style="color: #339933;">;</span>
	ajax.<span style="color: #000066;">open</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;POST&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;ajax.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	ajax.<span style="color: #660066;">onreadystatechange</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>       
		<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>ajax.<span style="color: #660066;">readyState</span> <span style="color: #339933;">==</span> <span style="color: #CC0000;">4</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>       
			<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>ajax.<span style="color: #000066;">status</span> <span style="color: #339933;">==</span> <span style="color: #CC0000;">200</span><span style="color: #009900;">&#41;</span> 
			<span style="color: #009900;">&#123;</span>       
				callback<span style="color: #009900;">&#40;</span>ajax.<span style="color: #660066;">responseText</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	
				setTimeout<span style="color: #009900;">&#40;</span>connect<span style="color: #339933;">,</span> <span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>       
		<span style="color: #009900;">&#125;</span>       
	<span style="color: #009900;">&#125;</span>
	ajax.<span style="color: #660066;">send</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
connect<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>head<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>body<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>textarea id<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;t&quot;</span><span style="color: #339933;">&gt;&lt;/</span>textarea<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>body<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>html<span style="color: #339933;">&gt;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
	<span style="color: #990000;">sleep</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://icomes.net/2009/10/24/web%e5%ae%9e%e7%8e%b0%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%8e%a8%e7%9a%84%e4%b8%89%e7%a7%8d%e6%8a%80%e6%9c%af/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RFC2616中关于HTTP Status Code的定义</title>
		<link>http://icomes.net/2009/10/12/rfc2616%e4%b8%ad%e5%85%b3%e4%ba%8ehttp-status-code%e7%9a%84%e5%ae%9a%e4%b9%89/</link>
		<comments>http://icomes.net/2009/10/12/rfc2616%e4%b8%ad%e5%85%b3%e4%ba%8ehttp-status-code%e7%9a%84%e5%ae%9a%e4%b9%89/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 14:09:02 +0000</pubDate>
		<dc:creator>梁剑</dc:creator>
				<category><![CDATA[Protocol]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[技术笔记]]></category>
		<category><![CDATA[读书笔记]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[rfc]]></category>

		<guid isPermaLink="false">http://icomes.net/?p=450</guid>
		<description><![CDATA[花了半天时间，看了一次http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
下面是相关的笔记和理解，
感觉很多Status Code在实际的BS通信中都不常见，
更多像是为了定义完备的协议语义，
而这些语义现在已经部分由更上层的协议或者应用实现。
1xx     Informational
100     Continue
&#160;&#160;&#160;&#160;如果server可能拒绝request，则client只发送header部分，试探server的反应
&#160;&#160;&#160;&#160;如果server接受，则返回100，于是client再发送剩余的body部分
101     Switch Protocol
2xx     Successful
200     OK
201     Created
&#160;&#160;&#160;&#160;有资源因Request而产生
202     Accepted
&#160;&#160;&#160;&#160;Request要求的动作已经被记录，但真正的动作要等待若干时间才执行，而且不保证一定执行
203     Non-Authoritative Information
204     No Content
&#160;&#160;&#160;&#160;google.cn的web server会返回
205     [...]]]></description>
			<content:encoded><![CDATA[<p>花了半天时间，看了一次<a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html" target="_blank">http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html</a></p>
<p>下面是相关的笔记和理解，<br />
感觉很多Status Code在实际的BS通信中都不常见，<br />
更多像是为了定义完备的协议语义，<br />
而这些语义现在已经部分由更上层的协议或者应用实现。</p>
<h3>1xx     Informational</h3>
<p><strong>100     Continue</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;如果server可能拒绝request，则client只发送header部分，试探server的反应<br />
&nbsp;&nbsp;&nbsp;&nbsp;如果server接受，则返回100，于是client再发送剩余的body部分<br />
<strong>101     Switch Protocol</strong></p>
<h3>2xx     Successful</h3>
<p><strong>200     OK<br />
201     Created</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;有资源因Request而产生<br />
<strong>202     Accepted</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;Request要求的动作已经被记录，但真正的动作要等待若干时间才执行，而且不保证一定执行<br />
<strong>203     Non-Authoritative Information<br />
204     No Content</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;google.cn的web server会返回<br />
<strong>205     Reset Content<br />
206     Partial Content</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;用于断点续传，起始位置由Range指定。（可以参考迅雷的输出）</p>
<h3>3xx     Redirection</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;User Agent需要处理循环的问题<br />
<strong>300     Multiple Choices</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;目标已变，有若干个替代品可供选择<br />
<strong>301     Moved Permanently</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;目标URI在Location里定义，除了HEAD和GET请求外，不能自动重定向<br />
&nbsp;&nbsp;&nbsp;&nbsp;对SEO不会有负面作用<br />
<strong>302     Found</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;临时重定向，是否用Moved Temporarily这个名字比较合适？<br />
&nbsp;&nbsp;&nbsp;&nbsp;目标URI在Location里定义，除了HEAD和GET请求外，不能自动重定向<br />
&nbsp;&nbsp;&nbsp;&nbsp;对SEO有负面作用<br />
<strong>303     See Other</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;和302类似，但期待User Agent用GET来请求Location里指定的URI<br />
<strong>304     Not Modified</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;通常Request会带If-Modified-Since<br />
&nbsp;&nbsp;&nbsp;&nbsp;不能带message-body<br />
<strong>305     Use Proxy</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;期待User Agent会使用Location中指定的Proxy地址，来访问数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;只能由origin server产生<br />
<strong>306     (not used)</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;之前的版本用过，已经废弃，作为保留字<br />
<strong>307     Temporary Redirect</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;没看出和302有什么不同<br />
&nbsp;&nbsp;&nbsp;&nbsp;只有HTTP/1.1支持</p>
<h3>4xx     Client Error</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;在message-body中，可以自定义给User的提示<br />
<strong>400     Bad Request</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;server不能理解Request的格式<br />
&nbsp;&nbsp;&nbsp;&nbsp;用telnet可以很容易模拟<br />
<strong>401     Unauthorized</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;不能通过HTTP Authentication<br />
&nbsp;&nbsp;&nbsp;&nbsp;response header必须包含WWW-Authoricate，request header可能包含Authorization<br />
<strong>402     Payment Required</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;保留字<br />
<strong>403     Forbidden</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;如果不希望暴露过多的信息，可以用404代替<br />
<strong>404     Not Found</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;最常见的4字头Status Code，通常会自定义<br />
<strong>405     Method Not Allowed</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;response header需要包含Allow，列出支持的method<br />
<strong>406     Not Acceptable</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;response不被request header中的Accept做支持<br />
&nbsp;&nbsp;&nbsp;&nbsp;除了HEAD，response会给出包含更多信息的entity<br />
&nbsp;&nbsp;&nbsp;&nbsp;entity format由request header中的Content-Type决定<br />
<strong>407     Proxy Authentication Required</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;与401类似<br />
&nbsp;&nbsp;&nbsp;&nbsp;Proxy的response header必须包含Proxy-Authenticate<br />
<strong>408     Request Timeout<br />
409     Conflict</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;需要User干预解决<br />
&nbsp;&nbsp;&nbsp;&nbsp;在PUT的时候可能遇到<br />
<strong>410     Gone</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;URI已经不存在，且不提供3xx来重定向<br />
&nbsp;&nbsp;&nbsp;&nbsp;如果server没有足够的信息来判断URI的不存在是temporary还是permanent，可以用404代替<br />
<strong>411     Length Required</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;request header中缺少Content-Length<br />
<strong>412     Precondition Failed<br />
413     Request Entity Too Large</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;如果只是temporary，可以包含Retry-After，指定重试的时间间隔<br />
<strong>414     Request-URI Too Long</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;有几种可能导致这个返回码的情况<br />
&nbsp;&nbsp;&nbsp;&nbsp;将POST当成了GET<br />
&nbsp;&nbsp;&nbsp;&nbsp;循环重定向，每次都append上当前URI<br />
&nbsp;&nbsp;&nbsp;&nbsp;攻击<br />
<strong>415     Unsupported Media Type<br />
&nbsp;&nbsp;&nbsp;&nbsp;416     Requested Range Not Satisfiable</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;参考206<br />
<strong>417     Expectation Failed</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;不能满足request header中的Expect，参考100</p>
<h3>5xx     Server Error</h3>
<p><strong>500     Internal Server Error</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;在server没有输出正确的response header的时候会出现<br />
<strong>501     Not Implemented<br />
502     Bad Gateway</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;由gateway或者proxy返回，表明上游server不能返回请求的URI<br />
<strong>503     Service Unavailable</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;server可能过载，或者正在维护<br />
&nbsp;&nbsp;&nbsp;&nbsp;可以返回Retry-After，如果没有，则视作500<br />
<strong>504     Gateway Timeout</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;上游server不能及时返回<br />
<strong>505     HTTP Version Not Supported</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://icomes.net/2009/10/12/rfc2616%e4%b8%ad%e5%85%b3%e4%ba%8ehttp-status-code%e7%9a%84%e5%ae%9a%e4%b9%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>浏览器战争</title>
		<link>http://icomes.net/2009/01/13/%e6%b5%8f%e8%a7%88%e5%99%a8%e6%88%98%e4%ba%89/</link>
		<comments>http://icomes.net/2009/01/13/%e6%b5%8f%e8%a7%88%e5%99%a8%e6%88%98%e4%ba%89/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 02:18:13 +0000</pubDate>
		<dc:creator>梁剑</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[photo]]></category>

		<guid isPermaLink="false">http://icomes.net/?p=256</guid>
		<description><![CDATA[还是挺形象的，不过名字叫浏览器战争史会贴切一点
]]></description>
			<content:encoded><![CDATA[<div class="mceTemp">还是挺形象的，不过名字叫浏览器战争史会贴切一点</div>
<div id="attachment_255" class="wp-caption alignleft" style="width: 258px"><a href="http://www.pixellabs.com/images/browserwars.png"><img class="size-medium wp-image-255 " title="browserwars" src="http://icomes.net/wp-content/uploads/2009/01/browserwars-248x300.png" alt="浏览器战争" width="248" height="300" /></a><p class="wp-caption-text">浏览器战争</p></div>
]]></content:encoded>
			<wfw:commentRss>http://icomes.net/2009/01/13/%e6%b5%8f%e8%a7%88%e5%99%a8%e6%88%98%e4%ba%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>修改IE默认的查看源代码程序</title>
		<link>http://icomes.net/2008/12/15/%e4%bf%ae%e6%94%b9ie%e9%bb%98%e8%ae%a4%e7%9a%84%e6%9f%a5%e7%9c%8b%e6%ba%90%e4%bb%a3%e7%a0%81%e7%a8%8b%e5%ba%8f/</link>
		<comments>http://icomes.net/2008/12/15/%e4%bf%ae%e6%94%b9ie%e9%bb%98%e8%ae%a4%e7%9a%84%e6%9f%a5%e7%9c%8b%e6%ba%90%e4%bb%a3%e7%a0%81%e7%a8%8b%e5%ba%8f/#comments</comments>
		<pubDate>Mon, 15 Dec 2008 02:26:51 +0000</pubDate>
		<dc:creator>梁剑</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[技术笔记]]></category>
		<category><![CDATA[Editor]]></category>
		<category><![CDATA[IE]]></category>

		<guid isPermaLink="false">http://tridot.cn/?p=207</guid>
		<description><![CDATA[用没有语法高亮、只有黑白的notepad来看html代码是比较痛苦的，
还好默认的查看程序可以修改。
打开注册表项“HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft\Internet Explorer\View Source Editor\Editor Name”，
修改的“默认”字符串，在数值数据栏中写入其他编辑器的执行文件位置。
如果注册表里没有这个表项，可以自己创建。
修改之后不需要重启，马上生效。
]]></description>
			<content:encoded><![CDATA[<p>用没有语法高亮、只有黑白的notepad来看html代码是比较痛苦的，<br />
还好默认的查看程序可以修改。</p>
<p>打开注册表项“HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft\Internet Explorer\View Source Editor\Editor Name”，<br />
修改的“默认”字符串，在数值数据栏中写入其他编辑器的执行文件位置。</p>
<p>如果注册表里没有这个表项，可以自己创建。<br />
修改之后不需要重启，马上生效。</p>
]]></content:encoded>
			<wfw:commentRss>http://icomes.net/2008/12/15/%e4%bf%ae%e6%94%b9ie%e9%bb%98%e8%ae%a4%e7%9a%84%e6%9f%a5%e7%9c%8b%e6%ba%90%e4%bb%a3%e7%a0%81%e7%a8%8b%e5%ba%8f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>为什么IE的User-Agent里有Moziila？</title>
		<link>http://icomes.net/2008/10/16/%e4%b8%ba%e4%bb%80%e4%b9%88ie%e7%9a%84user-agent%e9%87%8c%e6%9c%89moziila%ef%bc%9f/</link>
		<comments>http://icomes.net/2008/10/16/%e4%b8%ba%e4%bb%80%e4%b9%88ie%e7%9a%84user-agent%e9%87%8c%e6%9c%89moziila%ef%bc%9f/#comments</comments>
		<pubDate>Thu, 16 Oct 2008 14:48:16 +0000</pubDate>
		<dc:creator>梁剑</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[技术笔记]]></category>

		<guid isPermaLink="false">http://tridot.cn/?p=180</guid>
		<description><![CDATA[下面是一个比较典型的IE发出的HTTP请求，其中UA部分含有Mozilla。

GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, */*
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; CIBA; .NET CLR 2.0.50727; InfoPath.1)
Host: g.cn
Connection: Keep-Alive

But why，微软为什么会对Firefox这么好？我一直都很好奇。
Google发现世界上有其他人也有同样的疑问，而且找到了wikipedia上的解释。
简单说明一下，因为这里的Mozilla不是现在的mozilla.org，而是当年Netscape Navigator的codename。
而IE这样做，是为了表示和Navigator的兼容，毕竟但是Navigator才是主流。
只是不知道为什么，这样的做法会延续了下来，造成了今天的疑问。
]]></description>
			<content:encoded><![CDATA[<p>下面是一个比较典型的IE发出的HTTP请求，其中UA部分含有Mozilla。<br />
<code><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, application/x-silverlight, */*<br />
Accept-Language: zh-cn<br />
UA-CPU: x86<br />
Accept-Encoding: gzip, deflate<br />
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; CIBA; .NET CLR 2.0.50727; InfoPath.1)<br />
Host: g.cn<br />
Connection: Keep-Alive<br />
</code><br />
But why，微软为什么会对Firefox这么好？我一直都很好奇。<br />
Google发现世界上有其他人也有同样的疑问，而且找到了<a title="UserAgent" href="http://en.wikipedia.org/wiki/Useragent" target="_blank">wikipedia上的解释</a>。</p>
<p>简单说明一下，因为这里的Mozilla不是现在的<a title="mozilla.org" href="http://www.mozilla.org/" target="_blank">mozilla.org</a>，而是当年Netscape Navigator的codename。<br />
而IE这样做，是为了表示和Navigator的兼容，毕竟但是Navigator才是主流。<br />
只是不知道为什么，这样的做法会延续了下来，造成了今天的疑问。</p>
]]></content:encoded>
			<wfw:commentRss>http://icomes.net/2008/10/16/%e4%b8%ba%e4%bb%80%e4%b9%88ie%e7%9a%84user-agent%e9%87%8c%e6%9c%89moziila%ef%bc%9f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
