生活随笔
收集整理的這篇文章主要介紹了
HTTP协议整理
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、概念 1.HTTP協(xié)議:即超文本傳輸協(xié)議(Hypertext transfer protocol)。是一種詳細(xì)規(guī)定了瀏覽器和Web服務(wù)器之間互相通信的規(guī)則,它允許將超文本標(biāo)記語(yǔ)言(HTML)文檔從Web服務(wù)器傳送到客戶(hù)端的瀏覽器。 它可以使瀏覽器更加高效,使網(wǎng)絡(luò)傳輸減少。它不僅保證計(jì)算機(jī)正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分,以及哪部分內(nèi)容首先顯示(如文本先于圖形)等。 HTTP是一個(gè)應(yīng)用層協(xié)議,由請(qǐng)求和響應(yīng)構(gòu)成,是一個(gè)標(biāo)準(zhǔn)的客戶(hù)端服務(wù)器模型。HTTP是一個(gè)無(wú)狀態(tài)的協(xié)議。 在Internet中所有的傳輸都是通過(guò)TCP/IP進(jìn)行的。HTTP協(xié)議作為T(mén)CP/IP模型中應(yīng)用層的協(xié)議也不例外。HTTP協(xié)議通常承載于TCP協(xié)議之上,有時(shí)也承載于TLS或SSL協(xié)議層之上,這個(gè)時(shí)候,就成了我們常說(shuō)的HTTPS。 HTTP是一個(gè)屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議,由于其簡(jiǎn)捷、快速的方式,適用于分布式超媒體信息系統(tǒng)。它于1990年提出,經(jīng)過(guò)幾年的使用與發(fā)展,得到不斷地完善和擴(kuò)展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的規(guī)范化工作正在進(jìn)行之中,而且HTTP-NG(Next Generation of HTTP)的建議已經(jīng)提出。 2.無(wú)狀態(tài)協(xié)議: 協(xié)議的狀態(tài)是指下一次傳輸可以“記住”這次傳輸信息的能力。 HTTP是不會(huì)為了下一次連接而維護(hù)這次連接所傳輸?shù)男畔?為了保證服務(wù)器內(nèi)存。 比如客戶(hù)獲得一張網(wǎng)頁(yè)之后關(guān)閉瀏覽器,然后再一次啟動(dòng)瀏覽器,再登陸該網(wǎng)站,但是服務(wù)器并不知道客戶(hù)關(guān)閉了一次瀏覽器。 由于Web服務(wù)器要面對(duì)很多瀏覽器的并發(fā)訪問(wèn),為了提高Web服務(wù)器對(duì)并發(fā)訪問(wèn)的處理能力,在設(shè)計(jì)HTTP協(xié)議時(shí)規(guī)定Web服務(wù)器發(fā)送HTTP應(yīng)答報(bào)文和文檔時(shí),不保存發(fā)出請(qǐng)求的Web瀏覽器進(jìn)程的任何狀態(tài)信息。這有可能出現(xiàn)一個(gè)瀏覽器在短短幾秒之內(nèi)兩次訪問(wèn)同一對(duì)象時(shí),服務(wù)器進(jìn)程不會(huì)因?yàn)橐呀?jīng)給它發(fā)過(guò)應(yīng)答報(bào)文而不接受第二期服務(wù)請(qǐng)求。由于Web服務(wù)器不保存發(fā)送請(qǐng)求的Web瀏覽器進(jìn)程的任何信息,因此HTTP協(xié)議屬于無(wú)狀態(tài)協(xié)議(Stateless Protocol)。 3.HTTP協(xié)議是無(wú)狀態(tài)的和Connection: keep-alive的區(qū)別: 無(wú)狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒(méi)有記憶能力,服務(wù)器不知道客戶(hù)端是什么狀態(tài)。從另一方面講,打開(kāi)一個(gè)服務(wù)器上的網(wǎng)頁(yè)和你之前打開(kāi)這個(gè)服務(wù)器上的網(wǎng)頁(yè)之間沒(méi)有任何聯(lián)系。 HTTP是一個(gè)無(wú)狀態(tài)的面向連接的協(xié)議,無(wú)狀態(tài)不代表HTTP不能保持TCP連接,更不能代表HTTP使用的是UDP協(xié)議(無(wú)連接)。 從HTTP/1.1起,默認(rèn)都開(kāi)啟了Keep-Alive,保持連接特性,簡(jiǎn)單地說(shuō),當(dāng)一個(gè)網(wǎng)頁(yè)打開(kāi)完成后,客戶(hù)端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會(huì)關(guān)閉,如果客戶(hù)端再次訪問(wèn)這個(gè)服務(wù)器上的網(wǎng)頁(yè),會(huì)繼續(xù)使用這一條已經(jīng)建立的連接。 Keep-Alive不會(huì)永久保持連接,它有一個(gè)保持時(shí)間,可以在不同的服務(wù)器軟件(如Apache)中設(shè)定這個(gè)時(shí)間。 4.HTTP中文譯名問(wèn)題 HTTP超文本傳輸協(xié)議,聽(tīng)上去像是傳輸層的協(xié)議一樣,但事實(shí)上大家都知道HTTP和FTP一樣都是屬于應(yīng)用層的協(xié)議。既然是應(yīng)用層的協(xié)議,怎 么就取這樣一個(gè)誤導(dǎo)人的名稱(chēng)?在對(duì)TCP/IP協(xié)議還不熟悉的時(shí)候,這很容易讓人誤解和納悶的。在wiki上有這么一段話: HTTP在中國(guó)大陸被翻譯為“超文本傳輸協(xié)議”,因?yàn)椤皌ransfer”在中文里有“傳輸”的含意。但依據(jù) HTTP 定制者之一的 Roy Fielding博士的論文[1](6.5.3節(jié)),作者專(zhuān)門(mén)強(qiáng)調(diào)“transfer”表示的是“(表述狀態(tài)的)轉(zhuǎn)移” (Representational State Transfer),而不是“傳輸”(transport)。故其中文譯名“超文本傳輸協(xié)議”恰恰反映了這種誤解。更符合原義的譯名應(yīng)該為“超文本轉(zhuǎn)移協(xié)議”。
二、特點(diǎn) HTTP協(xié)議的主要特點(diǎn)可概括如下: 1.支持客戶(hù)/服務(wù)器模式。支持基本認(rèn)證和安全認(rèn)證。 2.簡(jiǎn)單快速:客戶(hù)向服務(wù)器請(qǐng)求服務(wù)時(shí),只需傳送請(qǐng)求方法和路徑。請(qǐng)求方法常用的有GET、HEAD、POST。每種方法規(guī)定了客戶(hù)與服務(wù)器聯(lián)系的類(lèi)型不同。由于HTTP協(xié)議簡(jiǎn)單,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快。 3.靈活:HTTP允許傳輸任意類(lèi)型的數(shù)據(jù)對(duì)象。正在傳輸?shù)念?lèi)型由Content-Type加以標(biāo)記。 4.HTTP 0.9和1.0使用非持續(xù)連接:限制每次連接只處理一個(gè)請(qǐng)求,服務(wù)器處理完客戶(hù)的請(qǐng)求,并收到客戶(hù)的應(yīng)答后,即斷開(kāi)連接。 HTTP 1.1使用持續(xù)連接:不必為每個(gè)Web對(duì)象創(chuàng)建一個(gè)新的連接,一個(gè)連接可以傳送多個(gè)對(duì)象,采用這種方式可以節(jié)省傳輸時(shí)間。 5.無(wú)狀態(tài):HTTP協(xié)議是無(wú)狀態(tài)協(xié)議。無(wú)狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒(méi)有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快。 6.永遠(yuǎn)都是客戶(hù)端發(fā)起請(qǐng)求,服務(wù)器回送響應(yīng)。這樣就限制了使用HTTP協(xié)議,無(wú)法實(shí)現(xiàn)在客戶(hù)端沒(méi)有發(fā)起請(qǐng)求的時(shí)候,服務(wù)器將消息推送給客戶(hù)端。 7.HTTP默認(rèn)的端口號(hào)為80,HTTPS的端口號(hào)為443。
三、工作流程 一次HTTP操作稱(chēng)為一個(gè)事務(wù),其工作過(guò)程可分為四步: 1.首先客戶(hù)機(jī)與服務(wù)器需要建立連接。只要單擊某個(gè)超級(jí)鏈接,HTTP的工作開(kāi)始。 2.建立連接后,客戶(hù)機(jī)發(fā)送一個(gè)請(qǐng)求給服務(wù)器,請(qǐng)求方式的格式為:統(tǒng)一資源標(biāo)識(shí)符(URL)、協(xié)議版本號(hào),后邊是MIME信息包括請(qǐng)求修飾符、客戶(hù)機(jī)信息和可能的內(nèi)容。 3.服務(wù)器接到請(qǐng)求后,給予相應(yīng)的響應(yīng)信息,其格式為一個(gè)狀態(tài)行,包括信息的協(xié)議版本號(hào)、一個(gè)成功或錯(cuò)誤的代碼,后邊是MIME信息包括服務(wù)器信息、實(shí)體信息和可能的內(nèi)容。 4.客戶(hù)端接收服務(wù)器所返回的信息通過(guò)瀏覽器顯示在用戶(hù)的顯示屏上,然后客戶(hù)機(jī)與服務(wù)器斷開(kāi)連接。 如果在以上過(guò)程中的某一步出現(xiàn)錯(cuò)誤,那么產(chǎn)生錯(cuò)誤的信息將返回到客戶(hù)端,有顯示屏輸出。對(duì)于用戶(hù)來(lái)說(shuō),這些過(guò)程是由HTTP自己完成的,用戶(hù)只要用鼠標(biāo)點(diǎn)擊,等待信息顯示就可以了。 HTTP是基于傳輸層的TCP協(xié)議,而TCP是一個(gè)端到端的面向連接的協(xié)議。所謂的端到端可以理解為進(jìn)程到進(jìn)程之間的通信。所以HTTP在開(kāi)始傳輸之前,首先需要建立TCP連接,而TCP連接的過(guò)程需要所謂的“三次握手”。在TCP三次握手之后,建立了TCP連接,此時(shí)HTTP就可以進(jìn)行傳輸了。一個(gè)重要的概念是面向連接,既HTTP在傳輸完成之間并不斷開(kāi)TCP連接。在HTTP1.1中(通過(guò)Connection頭設(shè)置)這是默認(rèn)行為。
四、頭域 每個(gè)頭域由一個(gè)域名,冒號(hào)(:)和域值三部分組成。域名是大小寫(xiě)無(wú)關(guān)的,域值前可以添加任何數(shù)量的空格符,頭域可以被擴(kuò)展為多行,在每行開(kāi)始處,使用至少一個(gè)空格或制表符。 HTTP消息由客戶(hù)端到服務(wù)器的請(qǐng)求和服務(wù)器到客戶(hù)端的響應(yīng)組成。請(qǐng)求消息和響應(yīng)消息都是由開(kāi)始行(對(duì)于請(qǐng)求消息,開(kāi)始行就是請(qǐng)求行,對(duì)于響應(yīng)消息,開(kāi)始行就是狀態(tài)行),消息報(bào)頭(可選),空行(只有CRLF的行),消息正文(可選)組成。 1.請(qǐng)求消息 HTTP請(qǐng)求由三部分組成,分別是:請(qǐng)求行、消息報(bào)頭、請(qǐng)求正文。發(fā)出的請(qǐng)求消息格式如下: 請(qǐng)求行,例如GET /images/logo.gif HTTP/1.1,表示從/images目錄下請(qǐng)求logo.gif這個(gè)文件。 請(qǐng)求頭,每一個(gè)報(bào)頭域都是由名字+“:”+空格+值 組成,消息報(bào)頭域的名字是大小寫(xiě)無(wú)關(guān)的。例如Accept-Language: en 空行 可選的消息體 請(qǐng)求行和標(biāo)題必須以<CR><LF>作為結(jié)尾(也就是,回車(chē)然后換行)。空行內(nèi)必須只有<CR><LF>而無(wú)其他空格。在HTTP/1.1協(xié)議中,所有的請(qǐng)求頭,除post外,都是可選的。 (1)請(qǐng)求行 以一個(gè)請(qǐng)求方法開(kāi)頭,以空格分開(kāi),后面跟著請(qǐng)求的URI和協(xié)議的版本。 格式如下:Method Request-URI HTTP-Version CRLF ? Method表示請(qǐng)求方法; Request-URI是一個(gè)統(tǒng)一資源標(biāo)識(shí)符; HTTP-Version表示請(qǐng)求的HTTP協(xié)議版本; CRLF表示回車(chē)和換行(除了作為結(jié)尾的CRLF外,不允許出現(xiàn)單獨(dú)的CR或LF字符)。 a.請(qǐng)求方法:
HTTP/1.1協(xié)議中共定義了八種方法(有時(shí)也叫“動(dòng)作”)來(lái)表明Request-URI指定的資源的不同操作方式:
GET 向特定的資源發(fā)出請(qǐng)求。注意:GET方法不應(yīng)當(dāng)被用于產(chǎn)生“副作用”的操作中,例如在web app.中。其中一個(gè)原因是GET可能會(huì)被網(wǎng)絡(luò)蜘蛛等隨意訪問(wèn)。
POST 向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請(qǐng)求體中。POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立和/或已有資源的修改。
HEAD 向服務(wù)器索要與GET請(qǐng)求相一致的響應(yīng),只不過(guò)響應(yīng)體將不會(huì)被返回。這一方法可以在不必傳輸整個(gè)響應(yīng)內(nèi)容的情況下,就可以獲取包含在響應(yīng)消息頭中的元信息。該方法常用于測(cè)試超鏈接的有效性,是否可以訪問(wèn),以及最近是否更新。
PUT 向指定資源位置上傳其最新內(nèi)容。
DELETE 請(qǐng)求服務(wù)器刪除Request-URI所標(biāo)識(shí)的資源。
TRACE 回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷。
CONNECT HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。
OPTIONS 返回服務(wù)器針對(duì)特定資源所支持的HTTP請(qǐng)求方法。也可以利用向Web服務(wù)器發(fā)送'*'的請(qǐng)求來(lái)測(cè)試服務(wù)器的功能性。
注:HTTP服務(wù)器至少應(yīng)該實(shí)現(xiàn)GET和HEAD方法,其他方法都是可選的。此外,除了上述方法,特定的HTTP服務(wù)器還能夠擴(kuò)展自定義的方法。
b.GET和POST的區(qū)別: GET提交的數(shù)據(jù)會(huì)放在URL之后,以?分割URL和傳輸數(shù)據(jù),參數(shù)之間以&相連,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的數(shù)據(jù)放在HTTP包的Body中。 GET提交的數(shù)據(jù)大小有限制,最多只能有1024字節(jié)(因?yàn)闉g覽器對(duì)URL的長(zhǎng)度有限制),而POST方法提交的數(shù)據(jù)沒(méi)有限制。 GET方式需要使用Request.QueryString來(lái)取得變量的值,而POST方式通過(guò)Request.Form來(lái)獲取變量的值。 GET方式提交數(shù)據(jù),會(huì)帶來(lái)安全問(wèn)題,比如一個(gè)登錄頁(yè)面,通過(guò)GET方式提交數(shù)據(jù)時(shí),用戶(hù)名和密碼將出現(xiàn)在URL上,如果頁(yè)面可以被緩存或者其他人可以訪問(wèn)這臺(tái)機(jī)器,就可以從歷史記錄獲得該用戶(hù)的賬號(hào)和密碼。 (2)請(qǐng)求報(bào)頭 請(qǐng)求報(bào)頭允許客戶(hù)端向服務(wù)器端傳遞請(qǐng)求的附加信息以及客戶(hù)端自身的信息。 常用的請(qǐng)求報(bào)頭:
Accept:瀏覽器端可以接受的MIME類(lèi)型。例如:Accept:image/gif,表明客戶(hù)端希望接受GIF圖象格式的資源;Accept:text/html,表明客戶(hù)端希望接受html文本。
Accept-Charset:Accept-Charset請(qǐng)求報(bào)頭域用于指定客戶(hù)端接受的字符集。例如:Accept-Charset:iso-8859-1,gb2312.如果在請(qǐng)求消息中沒(méi)有設(shè)置這個(gè)域,缺省是任何字符集都可以接受。
Accept-Encoding:瀏覽器申明自己可接收的編碼方法,通常指定壓縮方法,是否支持壓縮,支持什么壓縮方法(gzip,deflate)
Accept-Language :瀏覽器申明自己接收的語(yǔ)言。語(yǔ)言跟字符集的區(qū)別:中文是語(yǔ)言,中文有多種字符集,比如big5,gb2312,gbk等等;例如:Accept-Language: en-us。如果請(qǐng)求消息中沒(méi)有設(shè)置這個(gè)報(bào)頭域,服務(wù)器假定客戶(hù)端對(duì)各種語(yǔ)言都可以接受。
Accept-Charset:瀏覽器可接受的字符集。如果在請(qǐng)求消息中沒(méi)有設(shè)置這個(gè)域,缺省表示任何字符集都可以接受。
User-Agent:告訴HTTP服務(wù)器,客戶(hù)端使用的操作系統(tǒng)和瀏覽器的名稱(chēng)和版本。
例如:User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)
Authorization:授權(quán)信息,通常出現(xiàn)在對(duì)服務(wù)器發(fā)送的WWW-Authenticate頭的應(yīng)答中。主要用于證明客戶(hù)端有權(quán)查看某個(gè)資源。當(dāng)瀏覽器訪問(wèn)一個(gè)頁(yè)面時(shí),如果收到服務(wù)器的響應(yīng)代碼為401(未授權(quán)),可以發(fā)送一個(gè)包含Authorization請(qǐng)求報(bào)頭域的請(qǐng)求,要求服務(wù)器對(duì)其進(jìn)行驗(yàn)證。
Host:(發(fā)送請(qǐng)求時(shí),該頭域是必需的)主要用于指定被請(qǐng)求資源的Internet主機(jī)和端口號(hào),它通常從HTTP URL中提取出來(lái)的,發(fā)送請(qǐng)求時(shí),該報(bào)頭域是必需的。HTTP/1.1請(qǐng)求必須包含主機(jī)頭域,否則系統(tǒng)會(huì)以400狀態(tài)碼返回。
例如: 我們?cè)跒g覽器中輸入:http://luyucheng.cnblogs.com/index.html
瀏覽器發(fā)送的請(qǐng)求消息中,就會(huì)包含Host請(qǐng)求報(bào)頭域,如下:
Host:luyucheng.cnblogs.com
此處使用缺省端口號(hào)80,若指定了端口號(hào),則變成:Host:luyucheng.cnblogs.com:指定端口號(hào)
Cookie:最重要的請(qǐng)求頭之一, 將cookie的值發(fā)送給HTTP服務(wù)器。
Content-Length:表示請(qǐng)求消息正文的長(zhǎng)度。例如:Content-Length: 38。
Content-Type:例如:Content-Type: application/x-www-form-urlencoded。
From:請(qǐng)求發(fā)送者的email地址,由一些特殊的Web客戶(hù)程序使用,瀏覽器不會(huì)用到它。
Range:可以請(qǐng)求實(shí)體的一個(gè)或者多個(gè)子范圍。例如,
表示頭500個(gè)字節(jié):bytes=0-499
表示第二個(gè)500字節(jié):bytes=500-999
表示最后500個(gè)字節(jié):bytes=-500
表示500字節(jié)以后的范圍:bytes=500-
第一個(gè)和最后一個(gè)字節(jié):bytes=0-0,-1
同時(shí)指定幾個(gè)范圍:bytes=500-600,601-999
但是服務(wù)器可以忽略此請(qǐng)求頭,如果無(wú)條件GET包含Range請(qǐng)求頭,響應(yīng)會(huì)以狀態(tài)碼206(PartialContent)返回而不是以200(OK)。
If-Modified-Since:把瀏覽器端緩存頁(yè)面的最后修改時(shí)間發(fā)送到服務(wù)器去,服務(wù)器會(huì)把這個(gè)時(shí)間與服務(wù)器上實(shí)際文件的最后修改時(shí)間進(jìn)行對(duì)比。如果時(shí)間一致,那么返回304,客戶(hù)端就直接使用本地緩存文件。如果時(shí)間不一致,就會(huì)返回200和新的文件內(nèi)容。客戶(hù)端接到之后,會(huì)丟棄舊文件,把新文件緩存起來(lái),并顯示在瀏覽器中。
例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT
If-None-Match:If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 當(dāng)用戶(hù)再次請(qǐng)求該資源時(shí),將在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服務(wù)器驗(yàn)證資源的ETag沒(méi)有改變(該資源沒(méi)有更新),將返回一個(gè)304狀態(tài)告訴客戶(hù)端使用本地緩存文件。否則將返回200狀態(tài)和新的資源和Etag. 使用這樣的機(jī)制將提高網(wǎng)站的性能。例如: If-None-Match: "03f2b33c0bfcc1:0"。
Referer:包含一個(gè)URL,用戶(hù)從該URL代表的頁(yè)面出發(fā)訪問(wèn)當(dāng)前請(qǐng)求的頁(yè)面。提供了Request的上下文信息的服務(wù)器,告訴服務(wù)器我是從哪個(gè)鏈接過(guò)來(lái)的,比如從我主頁(yè)上鏈接到一個(gè)朋友那里,他的服務(wù)器就能夠從HTTP Referer中統(tǒng)計(jì)出每天有多少用戶(hù)點(diǎn)擊我主頁(yè)上的鏈接訪問(wèn)他的網(wǎng)站。
例如: Referer:http://luyucheng.cnblogs.com/
Pragma:指定“no-cache”值表示服務(wù)器必須返回一個(gè)刷新后的文檔,即使它是代理服務(wù)器而且已經(jīng)有了頁(yè)面的本地拷貝;在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一樣。Pargma只有一個(gè)用法, 例如: Pragma: no-cache
注意: 在HTTP/1.0版本中,只實(shí)現(xiàn)了Pragema:no-cache, 沒(méi)有實(shí)現(xiàn)Cache-Control
Connection:
例如:Connection: keep-alive 當(dāng)一個(gè)網(wǎng)頁(yè)打開(kāi)完成后,客戶(hù)端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會(huì)關(guān)閉,如果客戶(hù)端再次訪問(wèn)這個(gè)服務(wù)器上的網(wǎng)頁(yè),會(huì)繼續(xù)使用這一條已經(jīng)建立的連接。HTTP 1.1默認(rèn)進(jìn)行持久連接。利用持久連接的優(yōu)點(diǎn),當(dāng)頁(yè)面包含多個(gè)元素時(shí)(例如Applet,圖片),顯著地減少下載所需要的時(shí)間。要實(shí)現(xiàn)這一點(diǎn),Servlet需要在應(yīng)答中發(fā)送一個(gè)Content-Length頭,最簡(jiǎn)單的實(shí)現(xiàn)方法是:先把內(nèi)容寫(xiě)入ByteArrayOutputStream,然后在正式寫(xiě)出內(nèi)容之前計(jì)算它的大小。
Connection: close 代表一個(gè)Request完成后,客戶(hù)端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接會(huì)關(guān)閉,當(dāng)客戶(hù)端再次發(fā)送Request,需要重新建立TCP連接。
Host:(發(fā)送請(qǐng)求時(shí),該頭域是必需的)主要用于指定被請(qǐng)求資源的Internet主機(jī)和端口號(hào),它通常從HTTP URL中提取出來(lái)的。HTTP/1.1請(qǐng)求必須包含主機(jī)頭域,否則系統(tǒng)會(huì)以400狀態(tài)碼返回。
例如: 我們?cè)跒g覽器中輸入:http://luyucheng.cnblogs.com/index.html,瀏覽器發(fā)送的請(qǐng)求消息中,就會(huì)包含Host請(qǐng)求頭域:Host:http://luyucheng.cnblogs.com,此處使用缺省端口號(hào)80,若指定了端口號(hào),則變成:Host:指定端口號(hào)。
Cookie:最重要的請(qǐng)求頭之一, 將cookie的值發(fā)送給HTTP服務(wù)器。
Authorization:授權(quán)信息,通常出現(xiàn)在對(duì)服務(wù)器發(fā)送的WWW-Authenticate頭的應(yīng)答中。主要用于證明客戶(hù)端有權(quán)查看某個(gè)資源。當(dāng)瀏覽器訪問(wèn)一個(gè)頁(yè)面時(shí),如果收到服務(wù)器的響應(yīng)代碼為401(未授權(quán)),可以發(fā)送一個(gè)包含Authorization請(qǐng)求報(bào)頭域的請(qǐng)求,要求服務(wù)器對(duì)其進(jìn)行驗(yàn)證。
UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE瀏覽器所發(fā)送的非標(biāo)準(zhǔn)的請(qǐng)求頭,表示屏幕大小、顏色深度、操作系統(tǒng)和CPU類(lèi)型。
From:請(qǐng)求發(fā)送者的email地址,由一些特殊的Web客戶(hù)程序使用,瀏覽器不會(huì)用到它。
Range:可以請(qǐng)求實(shí)體的一個(gè)或者多個(gè)子范圍。例如,
表示頭500個(gè)字節(jié):bytes=0-499
表示第二個(gè)500字節(jié):bytes=500-999
表示最后500個(gè)字節(jié):bytes=-500
表示500字節(jié)以后的范圍:bytes=500-
第一個(gè)和最后一個(gè)字節(jié):bytes=0-0,-1
同時(shí)指定幾個(gè)范圍:bytes=500-600,601-999
但是服務(wù)器可以忽略此請(qǐng)求頭,如果無(wú)條件GET包含Range請(qǐng)求頭,響應(yīng)會(huì)以狀態(tài)碼206(PartialContent)返回而不是以200(OK)。
Cache-Control:指定請(qǐng)求和響應(yīng)遵循的緩存機(jī)制。緩存指令是單向的(響應(yīng)中出現(xiàn)的緩存指令在請(qǐng)求中未必會(huì)出現(xiàn)),且是獨(dú)立的(在請(qǐng)求消息或響應(yīng)消息中設(shè)置Cache-Control并不會(huì)修改另一個(gè)消息處理過(guò)程中的緩存處理過(guò)程)。請(qǐng)求時(shí)的緩存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,響應(yīng)消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage。
Cache-Control:Public 可以被任何緩存所緩存
Cache-Control:Private 內(nèi)容只緩存到私有緩存中
Cache-Control:no-cache 所有內(nèi)容都不會(huì)被緩存
Cache-Control:no-store 用于防止重要的信息被無(wú)意的發(fā)布。在請(qǐng)求消息中發(fā)送將使得請(qǐng)求和響應(yīng)消息都不使用緩存。
Cache-Control:max-age 指示客戶(hù)機(jī)可以接收生存期不大于指定時(shí)間(以秒為單位)的響應(yīng)。
Cache-Control:min-fresh 指示客戶(hù)機(jī)可以接收響應(yīng)時(shí)間小于當(dāng)前時(shí)間加上指定時(shí)間的響應(yīng)。
Cache-Control:max-stale 指示客戶(hù)機(jī)可以接收超出超時(shí)期間的響應(yīng)消息。如果指定max-stale消息的值,那么客戶(hù)機(jī)可以接收超出超時(shí)期指定值之內(nèi)的響應(yīng)消息。
2.響應(yīng)消息 HTTP響應(yīng)由三部分組成,分別是:狀態(tài)行、響應(yīng)報(bào)頭、響應(yīng)正文。 客戶(hù)端向服務(wù)器發(fā)送一個(gè)請(qǐng)求,服務(wù)器以一個(gè)狀態(tài)行作為響應(yīng),響應(yīng)的內(nèi)容包括:消息協(xié)議的版本、成功或者錯(cuò)誤編碼、服務(wù)器信息、實(shí)體元信息以及必要的實(shí)體內(nèi)容。根據(jù)響應(yīng)類(lèi)別的類(lèi)別,服務(wù)器響應(yīng)里可以含實(shí)體內(nèi)容,但不是所有的響應(yīng)都有實(shí)體內(nèi)容。 (1)狀態(tài)行 響應(yīng)頭第一行也稱(chēng)為狀態(tài)行,格式如下: HTTP-Version 空格 Status-Code 空格 Reason-Phrase CRLF HTTP-Version表示HTTP版本,例如為HTTP/1.1。 Status-Code是結(jié)果狀態(tài)響應(yīng)碼,用三個(gè)數(shù)字表示。 Reason-Phrase是個(gè)簡(jiǎn)單的文本描述,解釋Status-Code的具體原因。Status-Code用于機(jī)器自動(dòng)識(shí)別,Reason-Phrase用于人工理解。Status-Code的第一個(gè)數(shù)字代表響應(yīng)類(lèi)別,可能取5個(gè)不同的值。后兩個(gè)數(shù)字沒(méi)有分類(lèi)作用。Status-Code的第一個(gè)數(shù)字代表響應(yīng)的類(lèi)別,后續(xù)兩位描述在該類(lèi)響應(yīng)下發(fā)生的具體狀況 a.狀態(tài)響應(yīng)碼: 無(wú)論你何時(shí)瀏覽一個(gè)網(wǎng)頁(yè),你的電腦都會(huì)通過(guò)一個(gè)使用HTTP協(xié)議的服務(wù)器來(lái)獲取所請(qǐng)求的數(shù)據(jù)。在你請(qǐng)求的網(wǎng)頁(yè)顯示在瀏覽器之前,支配網(wǎng)頁(yè)的網(wǎng)站服務(wù)器會(huì)返回一個(gè)包含有狀態(tài)碼的HTTP頭文件。這個(gè)狀態(tài)碼提供了有關(guān)所請(qǐng)求網(wǎng)頁(yè)的相關(guān)條件信息。如果一切正常,一個(gè)標(biāo)準(zhǔn)網(wǎng)頁(yè)會(huì)收到一條諸如200的狀態(tài)碼。當(dāng)然我們的目的不是去研究200響應(yīng)碼,而是去探討那些代表出現(xiàn)錯(cuò)誤信息的服務(wù)器頭文件響應(yīng)碼,例如表示“未找到指定網(wǎng)頁(yè)”的404碼。
1xx(信息類(lèi)):表示接收到請(qǐng)求并且繼續(xù)處理
100 客戶(hù)必須繼續(xù)發(fā)出請(qǐng)求
101 客戶(hù)要求服務(wù)器根據(jù)請(qǐng)求轉(zhuǎn)換HTTP協(xié)議版本2xx(響應(yīng)成功):表示動(dòng)作被成功接收、理解和接受
200 表明該請(qǐng)求被成功地完成,所請(qǐng)求的資源發(fā)送回客戶(hù)端
201 提示知道新文件的URL
202 接受和處理、但處理未完成
203 返回信息不確定或不完整
204 請(qǐng)求收到,但返回信息為空
205 服務(wù)器完成了請(qǐng)求,用戶(hù)代理必須復(fù)位當(dāng)前已經(jīng)瀏覽過(guò)的文件
206 服務(wù)器已經(jīng)完成了部分用戶(hù)的GET請(qǐng)求3xx(重定向類(lèi)):為了完成指定的動(dòng)作,必須接受進(jìn)一步處理
300 請(qǐng)求的資源可在多處得到
301 本網(wǎng)頁(yè)被永久性轉(zhuǎn)移到另一個(gè)URL
302 請(qǐng)求的網(wǎng)頁(yè)被轉(zhuǎn)移到一個(gè)新的地址,但客戶(hù)訪問(wèn)仍繼續(xù)通過(guò)原始URL地址,重定向,新的URL會(huì)在response中的Location中返回,瀏覽器將會(huì)使用新的URL發(fā)出新的Request。
303 建議客戶(hù)訪問(wèn)其他URL或訪問(wèn)方式
304 自從上次請(qǐng)求后,請(qǐng)求的網(wǎng)頁(yè)未修改過(guò),服務(wù)器返回此響應(yīng)時(shí),不會(huì)返回網(wǎng)頁(yè)內(nèi)容,代表上次的文檔已經(jīng)被緩存了,還可以繼續(xù)使用
305 請(qǐng)求的資源必須從服務(wù)器指定的地址得到
306 前一版本HTTP中使用的代碼,現(xiàn)行版本中不再使用
307 申明請(qǐng)求的資源臨時(shí)性刪除4xx(客戶(hù)端錯(cuò)誤類(lèi)):請(qǐng)求包含錯(cuò)誤語(yǔ)法或不能正確執(zhí)行
400 客戶(hù)端請(qǐng)求有語(yǔ)法錯(cuò)誤,不能被服務(wù)器所理解
401 請(qǐng)求未經(jīng)授權(quán),這個(gè)狀態(tài)代碼必須和WWW-Authenticate報(bào)頭域一起使用
HTTP 401.1 未授權(quán):登錄失敗
HTTP 401.2 未授權(quán):服務(wù)器配置問(wèn)題導(dǎo)致登錄失敗
HTTP 401.3 ACL 禁止訪問(wèn)資源
HTTP 401.4 未授權(quán):授權(quán)被篩選器拒絕
HTTP 401.5 未授權(quán):ISAPI 或 CGI 授權(quán)失敗
402 保留有效ChargeTo頭響應(yīng)
403 禁止訪問(wèn),服務(wù)器收到請(qǐng)求,但是拒絕提供服務(wù)
HTTP 403.1 禁止訪問(wèn):禁止可執(zhí)行訪問(wèn)
HTTP 403.2 禁止訪問(wèn):禁止讀訪問(wèn)
HTTP 403.3 禁止訪問(wèn):禁止寫(xiě)訪問(wèn)
HTTP 403.4 禁止訪問(wèn):要求 SSL
HTTP 403.5 禁止訪問(wèn):要求 SSL 128
HTTP 403.6 禁止訪問(wèn):IP 地址被拒絕
HTTP 403.7 禁止訪問(wèn):要求客戶(hù)證書(shū)
HTTP 403.8 禁止訪問(wèn):禁止站點(diǎn)訪問(wèn)
HTTP 403.9 禁止訪問(wèn):連接的用戶(hù)過(guò)多
HTTP 403.10 禁止訪問(wèn):配置無(wú)效
HTTP 403.11 禁止訪問(wèn):密碼更改
HTTP 403.12 禁止訪問(wèn):映射器拒絕訪問(wèn)
HTTP 403.13 禁止訪問(wèn):客戶(hù)證書(shū)已被吊銷(xiāo)
HTTP 403.15 禁止訪問(wèn):客戶(hù)訪問(wèn)許可過(guò)多
HTTP 403.16 禁止訪問(wèn):客戶(hù)證書(shū)不可信或者無(wú)效
HTTP 403.17 禁止訪問(wèn):客戶(hù)證書(shū)已經(jīng)到期或者尚未生效
404 一個(gè)404錯(cuò)誤表明可連接服務(wù)器,但服務(wù)器無(wú)法取得所請(qǐng)求的網(wǎng)頁(yè),請(qǐng)求資源不存在。例如:輸入了錯(cuò)誤的URL
405 用戶(hù)在Request-Line字段定義的方法不允許
406 根據(jù)用戶(hù)發(fā)送的Accept拖,請(qǐng)求資源不可訪問(wèn)
407 類(lèi)似401,用戶(hù)必須首先在代理服務(wù)器上得到授權(quán)
408 客戶(hù)端沒(méi)有在用戶(hù)指定的餓時(shí)間內(nèi)完成請(qǐng)求
409 對(duì)當(dāng)前資源狀態(tài),請(qǐng)求不能完成
410 服務(wù)器上不再有此資源且無(wú)進(jìn)一步的參考地址
411 服務(wù)器拒絕用戶(hù)定義的Content-Length屬性請(qǐng)求
412 一個(gè)或多個(gè)請(qǐng)求頭字段在當(dāng)前請(qǐng)求中錯(cuò)誤
413 請(qǐng)求的資源大于服務(wù)器允許的大小
414 請(qǐng)求的資源URL長(zhǎng)于服務(wù)器允許的長(zhǎng)度
415 請(qǐng)求資源不支持請(qǐng)求項(xiàng)目格式
416 請(qǐng)求中包含Range請(qǐng)求頭字段,在當(dāng)前請(qǐng)求資源范圍內(nèi)沒(méi)有range指示值,請(qǐng)求也不包含If-Range請(qǐng)求頭字段
417 服務(wù)器不滿(mǎn)足請(qǐng)求Expect頭字段指定的期望值,如果是代理服務(wù)器,可能是下一級(jí)服務(wù)器不能滿(mǎn)足請(qǐng)求長(zhǎng)。5xx(服務(wù)端錯(cuò)誤類(lèi)):服務(wù)器不能正確執(zhí)行一個(gè)正確的請(qǐng)求
500 服務(wù)器遇到錯(cuò)誤,無(wú)法完成請(qǐng)求
HTTP 500.11 服務(wù)器關(guān)閉
HTTP 500.12 應(yīng)用程序重新啟動(dòng)
HTTP 500.13 服務(wù)器太忙
HTTP 500.14 應(yīng)用程序無(wú)效
HTTP 500.15 不允許請(qǐng)求 global.asa
HTTP 500.100 內(nèi)部服務(wù)器錯(cuò)誤 - ASP 錯(cuò)誤
501 未實(shí)現(xiàn)
502 網(wǎng)關(guān)錯(cuò)誤
503 由于超載或停機(jī)維護(hù),服務(wù)器目前無(wú)法使用,一段時(shí)間后可能恢復(fù)正常
(2)響應(yīng)報(bào)頭 服務(wù)器需要傳遞許多附加信息,這些信息不能全放在狀態(tài)行里。因此,需要另行定義響應(yīng)報(bào)頭,用來(lái)描述這些附加信息。響應(yīng)報(bào)頭主要描述服務(wù)器的信息和Request-URI的信息。 常用的響應(yīng)報(bào)頭:
Location:重定向接受者到一個(gè)新的位置。Location響應(yīng)報(bào)頭域常用在更換域名的時(shí)候。
Server:指明HTTP服務(wù)器用來(lái)處理請(qǐng)求的軟件信息。例如:Server: Microsoft-IIS/7.5、Server:Apache-Coyote/1.1。此域能包含多個(gè)產(chǎn)品標(biāo)識(shí)和注釋,產(chǎn)品標(biāo)識(shí)一般按照重要性排序。
Refresh:表示瀏覽器應(yīng)該在多少時(shí)間之后刷新文檔,以秒計(jì)。
WWW-Authenticate:WWW-Authenticate響應(yīng)報(bào)頭域必須被包含在401(未授權(quán)的)響應(yīng)消息中,客戶(hù)端收到401響應(yīng)消息時(shí)候,并發(fā)送Authorization報(bào)頭域請(qǐng)求服務(wù)器對(duì)其進(jìn)行驗(yàn)證時(shí),服務(wù)端響應(yīng)報(bào)頭就包含該報(bào)頭域。
WWW-Authenticate:Basic realm="Basic Auth Test!" //可以看出服務(wù)器對(duì)請(qǐng)求資源采用的是基本驗(yàn)證機(jī)制。
Connection:
例如:
Connection: keep-alive 當(dāng)一個(gè)網(wǎng)頁(yè)打開(kāi)完成后,客戶(hù)端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會(huì)關(guān)閉,如果客戶(hù)端再次訪問(wèn)這個(gè)服務(wù)器上的網(wǎng)頁(yè),會(huì)繼續(xù)使用這一條已經(jīng)建立的連接。
Connection: close 代表一個(gè)Request完成后,客戶(hù)端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接會(huì)關(guān)閉,當(dāng)客戶(hù)端再次發(fā)送Request,需要重新建立TCP連接。
Referer:包含一個(gè)URL,用戶(hù)從該URL代表的頁(yè)面出發(fā)訪問(wèn)當(dāng)前請(qǐng)求的頁(yè)面。提供了Request的上下文信息的服務(wù)器,告訴服務(wù)器我是從哪個(gè)鏈接過(guò)來(lái)的,例如從我主頁(yè)上鏈接到一個(gè)朋友那里,他的服務(wù)器就能夠從HTTP Referer中統(tǒng)計(jì)出每天有多少用戶(hù)點(diǎn)擊我主頁(yè)上的鏈接訪問(wèn)他的網(wǎng)站。
例如: Referer:http://luyucheng.cnblogs.com/
Content-Encoding:WEB服務(wù)器表明自己使用了什么壓縮方法(gzip,deflate)壓縮響應(yīng)中的對(duì)象。只有在解碼之后才可以得到Content-Type頭指定的內(nèi)容類(lèi)型。利用gzip壓縮文檔能夠顯著地減少HTML文檔的下載時(shí)間。例如:Content-Encoding:gzip
Content-Language:WEB服務(wù)器告訴瀏覽器自己響應(yīng)的對(duì)象所用的自然語(yǔ)言。沒(méi)有設(shè)置該域則認(rèn)為實(shí)體內(nèi)容將提供給所有的語(yǔ)言閱讀。例如:Content-Language:da。
Content-Range:用于指定整個(gè)實(shí)體中的一部分的插入位置,他也指示了整個(gè)實(shí)體的長(zhǎng)度。在服務(wù)器向客戶(hù)返回一個(gè)部分響應(yīng),它必須描述響應(yīng)覆蓋的范圍和整個(gè)實(shí)體長(zhǎng)度。一般格式:Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-length。例如,傳送頭500個(gè)字節(jié)次字段的形式:Content-Range:bytes0-499/1234如果一個(gè)HTTP消息包含此節(jié)(例如,對(duì)范圍請(qǐng)求的響 應(yīng)或?qū)σ幌盗蟹秶闹丿B請(qǐng)求),Content-Range表示傳送的范圍。
Content-Type:發(fā)送給接收者的實(shí)體正文的媒體類(lèi)型。媒體類(lèi)型的格式為:大類(lèi)/小類(lèi),例如text/html。
例如:
Content-Type: text/html;charset=utf-8
Content-Type: image/jpeg
Last-Modified:資源的最后修改日期和時(shí)間。
ETag:和If-None-Match 配合使用。
Expires:響應(yīng)過(guò)期的日期和時(shí)間。為了讓代理服務(wù)器或?yàn)g覽器在一段時(shí)間以后更新緩存中(再次訪問(wèn)曾訪問(wèn)過(guò)的頁(yè)面時(shí),直接從緩存中加載,縮短響應(yīng)時(shí)間和降低服務(wù)器負(fù)載)的頁(yè)面,我們可以使用Expires實(shí)體報(bào)頭域指定頁(yè)面過(guò)期的時(shí)間。例如:Expires:Thu,15 Sep 2006 16:23:12 GMT
HTTP1.1的客戶(hù)端和緩存必須將其他非法的日期格式(包括0)看作已經(jīng)過(guò)期。例如:為了讓瀏覽器不要緩存頁(yè)面,我們也可以利用Expires實(shí)體報(bào)頭域,設(shè)置為0,jsp中程序如下:response.setDateHeader("Expires","0");
Allow:服務(wù)器支持哪些請(qǐng)求方法(如GET、POST等)。
Date:表示消息發(fā)送的時(shí)間,時(shí)間的描述格式由rfc822定義。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的時(shí)間表示世界標(biāo)準(zhǔn)時(shí),換算成本地時(shí)間,需要知道用戶(hù)所在的時(shí)區(qū)。你可以用setDateHeader來(lái)設(shè)置這個(gè)頭以避免轉(zhuǎn)換時(shí)間格式的麻煩
Expires:指明應(yīng)該在什么時(shí)候認(rèn)為文檔已經(jīng)過(guò)期,從而不再緩存它,重新從服務(wù)器獲取,會(huì)更新緩存。過(guò)期之前使用本地緩存。HTTP1.1的客戶(hù)端和緩存會(huì)將非法的日期格式(包括0)看作已經(jīng)過(guò)期。例如:為了讓瀏覽器不要緩存頁(yè)面,我們也可以將Expires實(shí)體報(bào)頭域,設(shè)置為0。
例如: Expires: Tue, 08 Feb 2022 11:35:14 GMT
P3P:用于跨域設(shè)置Cookie, 這樣可以解決iframe跨域訪問(wèn)cookie的問(wèn)題
例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR
Set-Cookie:非常重要的header, 用于把cookie發(fā)送到客戶(hù)端瀏覽器,每一個(gè)寫(xiě)入cookie都會(huì)生成一個(gè)Set-Cookie。
例如: Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com
IANA(The Internet Assigned Numbers Authority,互聯(lián)網(wǎng)數(shù)字分配機(jī)構(gòu))定義了8個(gè)大類(lèi)的媒體類(lèi)型,分別是:
application (例如: application/vnd.ms-excel)
audio (例如: audio/mpeg)
image (例如: image/png)
message (例如,:message/HTTP)
model(例如:model/vrml)
multipart (例如:multipart/form-data)
text(例如:text/html)
video(例如:video/quicktime)
五、緩存的實(shí)現(xiàn)原理 Web緩存(cache)位于Web服務(wù)器和客戶(hù)端之間,緩存會(huì)根據(jù)請(qǐng)求保存輸出內(nèi)容的副本,例如html頁(yè)面,圖片,文件,當(dāng)下一個(gè)請(qǐng)求來(lái)到的時(shí)候:如果是相同的URL,緩存直接使用副本響應(yīng)訪問(wèn)請(qǐng)求,而不是向源服務(wù)器再次發(fā)送請(qǐng)求。 HTTP協(xié)議定義了相關(guān)的消息頭來(lái)使Web緩存盡可能好的工作。 1.緩存的優(yōu)點(diǎn) 減少相應(yīng)延遲:因?yàn)檎?qǐng)求從緩存服務(wù)器(離客戶(hù)端更近)而不是源服務(wù)器被相應(yīng),這個(gè)過(guò)程耗時(shí)更少,讓W(xué)eb服務(wù)器看上去相應(yīng)更快。 減少網(wǎng)絡(luò)帶寬消耗:當(dāng)副本被重用時(shí)會(huì)減低客戶(hù)端的帶寬消耗;客戶(hù)可以節(jié)省帶寬費(fèi)用,控制帶寬的需求的增長(zhǎng)并更易于管理。 2.客戶(hù)端緩存生效的常見(jiàn)流程 服務(wù)器收到請(qǐng)求時(shí),會(huì)在200OK中回送該資源的Last-Modified和ETag頭,客戶(hù)端將該資源保存在cache中,并記錄這兩個(gè)屬性。當(dāng)客戶(hù)端需要發(fā)送相同的請(qǐng)求時(shí),會(huì)在請(qǐng)求中攜帶If-Modified-Since和If-None-Match兩個(gè)頭。兩個(gè)頭的值分別是響應(yīng)中Last-Modified和ETag頭的值。服務(wù)器通過(guò)這兩個(gè)頭判斷本地資源未發(fā)生變化,客戶(hù)端不需要重新下載,返回304響應(yīng)。 3.Web緩存機(jī)制 HTTP/1.1中緩存的目的是為了在很多情況下減少發(fā)送請(qǐng)求,同時(shí)在許多情況下可以不需要發(fā)送完整響應(yīng)。前者減少了網(wǎng)絡(luò)回路的數(shù)量;HTTP利用一個(gè)“過(guò)期(expiration)”機(jī)制來(lái)為此目的。后者減少了網(wǎng)絡(luò)應(yīng)用的帶寬;HTTP用“驗(yàn)證(validation)”機(jī)制來(lái)為此目的。 HTTP定義了3種緩存機(jī)制: (1)Freshness:允許一個(gè)回應(yīng)消息可以在源服務(wù)器不被重新檢查,并且可以由服務(wù)器和客戶(hù)端來(lái)控制。例如,Expires回應(yīng)頭給了一個(gè)文檔不可用的時(shí)間。Cache-Control中的max-age標(biāo)識(shí)指明了緩存的最長(zhǎng)時(shí)間; (2)Validation:用來(lái)檢查以一個(gè)緩存的回應(yīng)是否仍然可用。例如,如果一個(gè)回應(yīng)有一個(gè)Last-Modified回應(yīng)頭,緩存能夠使用If-Modified-Since來(lái)判斷是否已改變,以便判斷根據(jù)情況發(fā)送請(qǐng)求; (3)Invalidation:在另一個(gè)請(qǐng)求通過(guò)緩存的時(shí)候,常常有一個(gè)副作用。例如,如果一個(gè)URL關(guān)聯(lián)到一個(gè)緩存回應(yīng),但是其后跟著POST、PUT和DELETE的請(qǐng)求的話,緩存就會(huì)過(guò)期。
六、應(yīng)用 1.斷點(diǎn)續(xù)傳的實(shí)現(xiàn)原理 HTTP協(xié)議的GET方法,支持只請(qǐng)求某個(gè)資源的某一部分; 206 Partial Content 部分內(nèi)容響應(yīng); Range 請(qǐng)求的資源范圍; Content-Range 響應(yīng)的資源范圍; 在連接斷開(kāi)重連時(shí),客戶(hù)端只請(qǐng)求該資源未下載的部分,而不是重新請(qǐng)求整個(gè)資源,來(lái)實(shí)現(xiàn)斷點(diǎn)續(xù)傳。 分塊請(qǐng)求資源實(shí)例: Eg1:Range: bytes=306302- :請(qǐng)求這個(gè)資源從306302個(gè)字節(jié)到末尾的部分; Eg2:Content-Range: bytes 306302-604047/604048:響應(yīng)中指示攜帶的是該資源的第306302-604047的字節(jié),該資源共604048個(gè)字節(jié); 客戶(hù)端通過(guò)并發(fā)的請(qǐng)求相同資源的不同片段,來(lái)實(shí)現(xiàn)對(duì)某個(gè)資源的并發(fā)分塊下載。從而達(dá)到快速下載的目的。目前流行的FlashGet和迅雷基本都是這個(gè)原理。 2.多線程下載的原理 下載工具開(kāi)啟多個(gè)發(fā)出HTTP請(qǐng)求的線程; 每個(gè)HTTP請(qǐng)求只請(qǐng)求資源文件的一部分:Content-Range: bytes 20000-40000/47000; 合并每個(gè)線程下載的文件。 3.HTTP代理 HTTP代理服務(wù)器: 代理服務(wù)器英文全稱(chēng)是Proxy Server,其功能就是代理網(wǎng)絡(luò)用戶(hù)去取得網(wǎng)絡(luò)信息。形象的說(shuō):它是網(wǎng)絡(luò)信息的中轉(zhuǎn)站。 代理服務(wù)器是介于瀏覽器和Web服務(wù)器之間的一臺(tái)服務(wù)器,有了它之后,瀏覽器不是直接到Web服務(wù)器去取回網(wǎng)頁(yè)而是向代理服務(wù)器發(fā)出請(qǐng)求,Request信號(hào)會(huì)先送到代理服務(wù)器,由代理服務(wù)器來(lái)取回瀏覽器所需要的信息并傳送給你的瀏覽器。 而且,大部分代理服務(wù)器都具有緩沖的功能,就好象一個(gè)大的Cache,它有很大的存儲(chǔ)空間,它不斷將新取得數(shù)據(jù)儲(chǔ)存到它本機(jī)的存儲(chǔ)器上,如果瀏覽器所請(qǐng)求的數(shù)據(jù)在它本機(jī)的存儲(chǔ)器上已經(jīng)存在而且是最新的,那么它就不重新從Web服務(wù)器取數(shù)據(jù),而直接將存儲(chǔ)器上的數(shù)據(jù)傳送給用戶(hù)的瀏覽器,這樣就能顯著提高瀏覽速度和效率。更重要的是:Proxy Server(代理服務(wù)器)是Internet鏈路級(jí)網(wǎng)關(guān)所提供的一種重要的安全功能,它的工作主要在開(kāi)放系統(tǒng)互聯(lián)(OSI)模型的對(duì)話層。 HTTP代理服務(wù)器的主要功能: (1)突破自身IP訪問(wèn)限制,訪問(wèn)國(guó)外站點(diǎn)。如:教育網(wǎng)、169網(wǎng)等網(wǎng)絡(luò)用戶(hù)可以通過(guò)代理訪問(wèn)國(guó)外網(wǎng)站; (2)訪問(wèn)一些單位或團(tuán)體內(nèi)部資源,如某大學(xué)FTP(前提是該代理地址在該資源的允許訪問(wèn)范圍之內(nèi)),使用教育網(wǎng)內(nèi)地址段免費(fèi)代理服務(wù)器,就可以用于對(duì)教育 網(wǎng)開(kāi)放的各類(lèi)FTP下載上傳,以及各類(lèi)資料查詢(xún)共享等服務(wù); (3)突破中國(guó)電信的IP封鎖:中國(guó)電信用戶(hù)有很多網(wǎng)站是被限制訪問(wèn)的,這種限制是人為的,不同Serve對(duì)地址的封鎖是不同的。所以不能訪問(wèn)時(shí)可以換一個(gè)國(guó)外的代理服務(wù)器試試; (4)提高訪問(wèn)速度:通常代理服務(wù)器都設(shè)置一個(gè)較大的硬盤(pán)緩沖區(qū),當(dāng)有外界的信息通過(guò)時(shí),同時(shí)也將其保存到緩沖區(qū)中,當(dāng)其他用戶(hù)再訪問(wèn)相同的信息時(shí),則直接由緩沖區(qū)中取出信息,傳給用戶(hù),以提高訪問(wèn)速度; (5)隱藏真實(shí)IP:上網(wǎng)者也可以通過(guò)這種方法隱藏自己的IP,免受攻擊。 對(duì)于客戶(hù)端瀏覽器而言,HTTP代理服務(wù)器相當(dāng)于服務(wù)器。 而對(duì)于Web服務(wù)器而言,HTTP代理服務(wù)器又擔(dān)當(dāng)了客戶(hù)端的角色。 4.虛擬主機(jī) 虛擬主機(jī):是在網(wǎng)絡(luò)服務(wù)器上劃分出一定的磁盤(pán)空間供用戶(hù)放置站點(diǎn)、應(yīng)用組件等,提供必要的站點(diǎn)功能與數(shù)據(jù)存放、傳輸功能。 所謂虛擬主機(jī),也叫“網(wǎng)站空間”就是把一臺(tái)運(yùn)行在互聯(lián)網(wǎng)上的服務(wù)器劃分成多個(gè)“虛擬”的服務(wù)器,每一個(gè)虛擬主機(jī)都具有獨(dú)立的域名和完整的Internet服務(wù)器(支持WWW、FTP、E-mail等)功能。一臺(tái)服務(wù)器上的不同虛擬主機(jī)是各自獨(dú)立的,并由用戶(hù)自行管理。但一臺(tái)服務(wù)器主機(jī)只能夠支持一定數(shù)量的虛擬主機(jī),當(dāng)超過(guò)這個(gè)數(shù)量時(shí),用戶(hù)將會(huì)感到性能急劇下降。 虛擬主機(jī)的實(shí)現(xiàn)原理: 虛擬主機(jī)是用同一個(gè)Web服務(wù)器,為不同域名網(wǎng)站提供服務(wù)的技術(shù)。Apache、Tomcat等均可通過(guò)配置實(shí)現(xiàn)這個(gè)功能。 相關(guān)的HTTP消息頭:Host。 例如:Host: luyucheng.cnblogs.com 客戶(hù)端發(fā)送HTTP請(qǐng)求的時(shí)候,會(huì)攜帶Host頭,Host頭記錄的是客戶(hù)端輸入的域名。這樣服務(wù)器可以根據(jù)Host頭確認(rèn)客戶(hù)要訪問(wèn)的是哪一個(gè)域名。
查看更多:
開(kāi)發(fā)一個(gè)微信小程序?qū)嵗坛?/p>
HTTP協(xié)議整理
PHP安全之Web攻擊
秒殺系統(tǒng)設(shè)計(jì)優(yōu)化
MySQL優(yōu)化
?
參考資料:
http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html http://www.cnblogs.com/EricaMIN1987_IT/p/3837436.html
?
轉(zhuǎn)載于:https://www.cnblogs.com/quanzhiguo/p/7156759.html
總結(jié)
以上是生活随笔 為你收集整理的HTTP协议整理 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。