本文為原創(chuàng),如需轉(zhuǎn)載,請(qǐng)注明作者和出處,謝謝!
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="ProgId" content="Word.Document"> <meta name="Generator" content="Microsoft Word 11"> <meta name="Originator" content="Microsoft Word 11"> <link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> <!--[if gte mso 9]><xml> Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 </xml><![endif]--><!--[if gte mso 9]><![endif]--><!--[if !mso]> <style> st1":*{behavior:url(#ieooui) } </style> <![endif]--><style> <!-- /* Font Definitions */ @font-face {font-family:宋體; panose-1:2 1 6 0 3 1 1 1 1 1;} @font-face {font-family:""@宋體"; panose-1:2 1 6 0 3 1 1 1 1 1;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; font-family:"Times New Roman";} /* Page Definitions */ @page {} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt;} div.Section1 {page:Section1;} --> </style> <!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable { mso-style-parent:""; font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} </style> <![endif]-->
上一篇:
Java網(wǎng)絡(luò)編程從入門到精通(19):套接字(Socket)的異常
一、
什么是HTTP協(xié)議
HTTP
協(xié)議是一種應(yīng)用層協(xié)議,HTTP是HyperText Transfer Protocol(超文本傳輸協(xié)議)的英文縮寫。HTTP可以通過(guò)傳輸層的TCP協(xié)議在客戶端和服務(wù)器之間傳輸數(shù)據(jù)。HTTP協(xié)議主要用于Web瀏覽器和Web服務(wù)器之間的數(shù)據(jù)交換。我們?cè)谑褂肐E或Firefox瀏覽網(wǎng)頁(yè)或下載Web資源時(shí),通過(guò)在地址欄中輸入http://host:port/path,開(kāi)頭的4個(gè)字母http就相當(dāng)于通知瀏覽器使用HTTP協(xié)議來(lái)和host所確定的服務(wù)器進(jìn)行通訊。
HTTP
協(xié)議誕生于上世紀(jì)90年代初;第一個(gè)被廣泛使用的版本是HTTP0.9。這個(gè)最初的版本非常簡(jiǎn)陋,它只向服務(wù)器發(fā)送一個(gè)非常簡(jiǎn)單的請(qǐng)求,而服務(wù)器也會(huì)返回一個(gè)很簡(jiǎn)單的響應(yīng)以及相應(yīng)的HTML文本。在隨后的HTTP1.0中,增加了很多在HTTP0.9中沒(méi)有的特性,如增加了資源重定位,大量的狀態(tài)響應(yīng)碼等。在最新的HTTP1.1中,對(duì)HTTP1.0做了更進(jìn)一步的改進(jìn),除了增加了一些請(qǐng)求方法外,最大的改進(jìn)就是可以使HTTP保持連接狀態(tài)。這對(duì)于一些頻繁傳輸數(shù)據(jù)的應(yīng)用是非常有益的。由于HTTP協(xié)議已經(jīng)達(dá)到了它的目標(biāo),因此,負(fù)責(zé)制定規(guī)范的W3C已經(jīng)停止了對(duì)HTTP的改進(jìn)(和HTTP相關(guān)的協(xié)議或擴(kuò)展并未停止),所以,HTTP1.1將是HTTP協(xié)議的最后一個(gè)版本。
無(wú)論你是從事網(wǎng)絡(luò)程序開(kāi)發(fā),還是Web開(kāi)發(fā),或是網(wǎng)站的維護(hù)人員;都必須對(duì)HTTP協(xié)議有一個(gè)比較深入的了解。因此,HTTP協(xié)議不僅是Internet上應(yīng)用最為廣泛的協(xié)議,也是應(yīng)用協(xié)議家族中比較簡(jiǎn)單的一種入門級(jí)協(xié)議;而且所有的Web服務(wù)器無(wú)一例外地都支持HTTP協(xié)議。這也充分地說(shuō)明,對(duì)于那些開(kāi)發(fā)網(wǎng)絡(luò)程序,尤其是開(kāi)發(fā)各種類型的Web服務(wù)器的開(kāi)發(fā)人員,透徹地掌握HTTP協(xié)議將對(duì)你所開(kāi)發(fā)的基于HTTP協(xié)議的系統(tǒng)產(chǎn)生直接的影響。
由于本文的目的并不是講解HTTP協(xié)議,因此,只討論了HTTP協(xié)議的主要部分,如果讀者對(duì)HTTP協(xié)議感性趣,并想深入了解HTTP協(xié)議,請(qǐng)查看RFC2616或通過(guò)www.w3c.org來(lái)了解HTTP協(xié)議的詳情。
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="ProgId" content="Word.Document"><meta name="Generator" content="Microsoft Word 11"><meta name="Originator" content="Microsoft Word 11"><link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"><!--[if gte mso 9]><xml> Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 </xml><![endif]--><!--[if gte mso 9]><![endif]--><!--[if !mso]> <style> st1":*{behavior:url(#ieooui) } </style> <![endif]--><style> <!-- /* Font Definitions */ @font-face {font-family:宋體; panose-1:2 1 6 0 3 1 1 1 1 1;} @font-face {font-family:""@宋體"; panose-1:2 1 6 0 3 1 1 1 1 1;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; font-family:"Times New Roman";} /* Page Definitions */ @page {} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt;} div.Section1 {page:Section1;} --> </style><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable { mso-style-parent:""; font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} </style> <![endif]-->
二、HTTP
的工作方式
HTTP
協(xié)議采用了請(qǐng)求/響應(yīng)的工作方式。基于HTTP1.0協(xié)議的客戶端在每次向服務(wù)器發(fā)出請(qǐng)求后,服務(wù)器就會(huì)向客戶端返回響應(yīng)消息(包括請(qǐng)求是否正確以及所請(qǐng)求的數(shù)據(jù)),在確認(rèn)客戶端已經(jīng)收到響應(yīng)消息后,服務(wù)端就會(huì)關(guān)閉網(wǎng)絡(luò)連接(其實(shí)是關(guān)閉TCP連接)。在這個(gè)數(shù)據(jù)傳輸過(guò)程中,并不保存任何歷史信息和狀態(tài)信息,因此,HTTP協(xié)議也被認(rèn)為是無(wú)狀態(tài)的協(xié)議,圖1描繪了HTTP1.0協(xié)議的通訊過(guò)程。
圖1 HTTP1.0協(xié)議的通訊過(guò)程
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="ProgId" content="Word.Document"><meta name="Generator" content="Microsoft Word 11"><meta name="Originator" content="Microsoft Word 11"><link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"><!--[if gte mso 9]><xml> Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 </xml><![endif]--><!--[if gte mso 9]><![endif]--><style> <!-- /* Font Definitions */ @font-face {font-family:宋體; panose-1:2 1 6 0 3 1 1 1 1 1;} @font-face {font-family:""@宋體"; panose-1:2 1 6 0 3 1 1 1 1 1;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; font-family:"Times New Roman";} /* Page Definitions */ @page {} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt;} div.Section1 {page:Section1;} --> </style><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable { mso-style-parent:""; font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} </style> <![endif]-->
在
HTTP1.0
協(xié)議中,當(dāng)
Web
瀏覽器發(fā)出請(qǐng)求時(shí),就意味著一個(gè)請(qǐng)求
/
響應(yīng)會(huì)話已經(jīng)開(kāi)始。在請(qǐng)求、響應(yīng)結(jié)束后,服務(wù)器就會(huì)立刻關(guān)閉這個(gè)連接。這種會(huì)話方式雖然簡(jiǎn)便,但它會(huì)帶來(lái)另外一個(gè)問(wèn)題。如果客戶端瀏覽器訪問(wèn)的某個(gè)
HTML
或其他類型的
Web
頁(yè)中包含有其他的
Web
資源,如
JavaScript
文件、圖像文件、
CSS
文件等;當(dāng)瀏覽器每遇到這樣一個(gè)
Web
資源,就會(huì)建立一個(gè)
HTTP
會(huì)話。如果這樣的資源很多的話,就會(huì)加重服務(wù)器的負(fù)擔(dān),同時(shí)也會(huì)影響客戶端瀏覽器加載
HTML
等
Web
資源的效率。
在對(duì)上述的缺陷進(jìn)行改進(jìn)和完善后,HTTP1.1協(xié)議進(jìn)入了我們的視線。HTTP1.1和HTTP1.0相比較而言,最大的區(qū)別就是增加了持久連接支持。當(dāng)客戶端使用HTTP1.1協(xié)議連接到服務(wù)器后,服務(wù)器就將關(guān)閉客戶端連接的主動(dòng)權(quán)交還給客戶端;也就是說(shuō),在客戶端向服務(wù)器發(fā)送一個(gè)請(qǐng)求并接收以一個(gè)響應(yīng)后,只要不調(diào)用Socket類的close方法關(guān)閉網(wǎng)絡(luò)連接,就可以繼續(xù)向服務(wù)器發(fā)送HTTP請(qǐng)求。當(dāng)HTML中含有其他的Web資源時(shí),瀏覽器就可以使用同一個(gè)網(wǎng)絡(luò)連接向下載這些資源,這樣就可以大大減輕服務(wù)器的壓力。圖2演示了這一過(guò)程。
圖2 HTTP1.1協(xié)議的通訊過(guò)程
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="ProgId" content="Word.Document"> <meta name="Generator" content="Microsoft Word 11"> <meta name="Originator" content="Microsoft Word 11"> <link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> <!--[if gte mso 9]><xml> Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 </xml><![endif]--><!--[if gte mso 9]><![endif]--><style> <!-- /* Font Definitions */ @font-face {font-family:宋體; panose-1:2 1 6 0 3 1 1 1 1 1;} @font-face {font-family:""@宋體"; panose-1:2 1 6 0 3 1 1 1 1 1;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; font-family:"Times New Roman";} /* Page Definitions */ @page {} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt;} div.Section1 {page:Section1;} --> </style> <!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable { mso-style-parent:""; font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} </style> <![endif]-->
HTTP1.1
除了支持持久連接外,還將HTTP1.0的請(qǐng)求方法從原來(lái)的三個(gè)(GET、POST和HEAD)擴(kuò)展到了八個(gè)(OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE和CONNECT)。而且還增加了很多請(qǐng)求和響應(yīng)字段,如上述的持久連接的字段Connection。這個(gè)字段有兩個(gè)值,Close和Keep-Alive。如果使用Connection:Close,則關(guān)閉HTTP1.1的持久連接的功能,要打開(kāi)HTTP1.1的持久連接的功能,必須使用Connection:Keep-Alive,或者不加Connection字段(因?yàn)镠TTP1.1在默認(rèn)情況下就是持久連接的)。除了這些,還提供了身份認(rèn)證、狀態(tài)管理和緩存(Cache)等相關(guān)的請(qǐng)求頭和響應(yīng)頭。
下一篇:
Java網(wǎng)絡(luò)編程從入門到精通(21):HTTP消息的格式
國(guó)內(nèi)最棒的Google Android技術(shù)社區(qū)(eoeandroid),歡迎訪問(wèn)!
《銀河系列原創(chuàng)教程》
發(fā)布
《Java Web開(kāi)發(fā)速學(xué)寶典》
出版,歡迎定購(gòu)
Java網(wǎng)絡(luò)編程從入門到精通(20):HTTP協(xié)議簡(jiǎn)介