HTTP是一個(gè)基于請(qǐng)求/響應(yīng)模式的、無(wú)狀態(tài)的協(xié)議。即,瀏覽器與服務(wù)端連接之后,瀏覽器向服務(wù)器發(fā)送一個(gè)請(qǐng)求,服務(wù)器返回響應(yīng)信息之后,雙方的鏈接就被關(guān)閉。我們要知道,應(yīng)用層的HTTP要使用傳輸層的TCP協(xié)議來(lái)完成。而TCP協(xié)議是通過(guò)“3次握手”建立連接,是面向連接的協(xié)議。默認(rèn)情況下,瀏覽器與Web服務(wù)器上80端口監(jiān)聽(tīng)的服務(wù)器程序建立TCP連接。
HTTP1.0是典型的請(qǐng)求/響應(yīng)模式。為了減少服務(wù)器的開(kāi)銷(xiāo),HTTP1.1默認(rèn)有“持續(xù)連接”的機(jī)制。通過(guò)這種機(jī)制,客戶端發(fā)送請(qǐng)求得到響應(yīng)后,連接不會(huì)馬上關(guān)閉,可以繼續(xù)發(fā)送請(qǐng)求,還可以流水線發(fā)送多個(gè)請(qǐng)求、而不用等待每一個(gè)響應(yīng)的到來(lái)。
二、URI和URL
URI(統(tǒng)一資源標(biāo)識(shí)符)純粹是一種符號(hào)結(jié)構(gòu),用于指定構(gòu)成Web資源的字符串的各個(gè)不同部分。而URL(統(tǒng)一資源定位符)是一種特殊的URI,包含了用于查找某個(gè)資源的足夠信息。
URI是一種語(yǔ)義上的抽象概念,可以是絕對(duì)的,也可以是相對(duì)的,而URL則必須提供足夠的信息來(lái)定位,所以,是絕對(duì)的,而通常說(shuō)的relative URL,則是針對(duì)另一個(gè)absolute URL,本質(zhì)上還是絕對(duì)的。
三、HTTP請(qǐng)求
格式如圖:(CRLF表示回車(chē)符 換行符,不同顏色之間用空格隔開(kāi))
第一行叫做請(qǐng)求行。所以我們可以說(shuō)HTTP請(qǐng)求由請(qǐng)求行、消息報(bào)頭、請(qǐng)求正文組成。
1、請(qǐng)求行
如上,請(qǐng)求行以一個(gè)方法符號(hào)開(kāi)頭,空格之后,一個(gè)請(qǐng)求URI,再空格,然后一個(gè)HTTP版本,最后一個(gè)回車(chē)換行。
其中請(qǐng)求方法有如下幾種:
我們?cè)跒g覽器地址欄直接輸入地址的時(shí)候,采用的就是GET方法。
HEAD方法一般用于測(cè)試超鏈接的有效性,因?yàn)樗皇钦?qǐng)求響應(yīng)消息的報(bào)頭。消息報(bào)頭后面會(huì)講。
(HTTP協(xié)議中,請(qǐng)求方法必須全部大寫(xiě))
2、請(qǐng)求正文
類(lèi)似name=XXX&pwd=XXXX的內(nèi)容
四、HTTP響應(yīng)
格式與HTTP請(qǐng)求類(lèi)似,如圖:
第一行叫做狀態(tài)行。所以我們可以說(shuō)HTTP響應(yīng)由狀態(tài)行、消息報(bào)頭、響應(yīng)正文組成。
1、狀態(tài)行
如上,狀態(tài)行由一個(gè)HTTP版本,空格后,一個(gè)狀態(tài)碼,再空格,一個(gè)狀態(tài)碼的文本描述,最后一個(gè)回車(chē)換行構(gòu)成。
狀態(tài)代碼有3位數(shù)字組成,狀態(tài)描述給出了狀態(tài)代碼簡(jiǎn)短的描述。狀態(tài)碼第一個(gè)數(shù)字定義了響應(yīng)的類(lèi)別,有五種可能取值:
1xx : 指示信息–表示請(qǐng)求已接收,繼續(xù)處理
2xx : 成功–表示請(qǐng)求已被成功接收、理解、接受
3xx : 重定向–要完成請(qǐng)求必須進(jìn)行更進(jìn)一步的操作
4xx : 客戶端錯(cuò)誤–請(qǐng)求有語(yǔ)法錯(cuò)誤或請(qǐng)求無(wú)法實(shí)現(xiàn)
5xx : 服務(wù)器端錯(cuò)誤–服務(wù)器未能實(shí)現(xiàn)合法的請(qǐng)求
全部取值如下:
100——客戶必須繼續(xù)發(fā)出請(qǐng)求
101——客戶要求服務(wù)器根據(jù)請(qǐng)求轉(zhuǎn)換HTTP協(xié)議版本
200——交易成功
201——提示知道新文件的URL
202——接受和處理、但處理未完成
203——返回信息不確定或不完整
204——請(qǐng)求收到,但返回信息為空
205——服務(wù)器完成了請(qǐng)求,用戶代理必須復(fù)位當(dāng)前已經(jīng)瀏覽過(guò)的文件
206——服務(wù)器已經(jīng)完成了部分用戶的GET請(qǐng)求
300——請(qǐng)求的資源可在多處得到
301——刪除請(qǐng)求數(shù)據(jù)
302——在其他地址發(fā)現(xiàn)了請(qǐng)求數(shù)據(jù)
303——建議客戶訪問(wèn)其他URL或訪問(wèn)方式
304——客戶端已經(jīng)執(zhí)行了GET,但文件未變化
305——請(qǐng)求的資源必須從服務(wù)器指定的地址得到
306——前一版本HTTP中使用的代碼,現(xiàn)行版本中不再使用
307——申明請(qǐng)求的資源臨時(shí)性刪除
400——錯(cuò)誤請(qǐng)求,如語(yǔ)法錯(cuò)誤
401——請(qǐng)求授權(quán)失敗
402——保留有效ChargeTo頭響應(yīng)
403——請(qǐng)求不允許
404——沒(méi)有發(fā)現(xiàn)文件、查詢或URl
405——用戶在Request-Line字段定義的方法不允許
406——根據(jù)用戶發(fā)送的Accept拖,請(qǐng)求資源不可訪問(wèn)
407——類(lèi)似401,用戶必須首先在代理服務(wù)器上得到授權(quán)
408——客戶端沒(méi)有在用戶指定的餓時(shí)間內(nèi)完成請(qǐng)求
409——對(duì)當(dāng)前資源狀態(tài),請(qǐng)求不能完成
410——服務(wù)器上不再有此資源且無(wú)進(jìn)一步的參考地址
411——服務(wù)器拒絕用戶定義的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ù)器不滿足請(qǐng)求Expect頭字段指定的期望值,如果是代理服務(wù)器,可能是下一級(jí)服務(wù)器不能滿足請(qǐng)求
500——服務(wù)器產(chǎn)生內(nèi)部錯(cuò)誤
501——服務(wù)器不支持請(qǐng)求的函數(shù)
502——服務(wù)器暫時(shí)不可用,有時(shí)是為了防止發(fā)生系統(tǒng)過(guò)載
503——服務(wù)器過(guò)載或暫停維修
504——關(guān)口過(guò)載,服務(wù)器使用另一個(gè)關(guān)口或服務(wù)來(lái)響應(yīng)用戶,等待時(shí)間設(shè)定值較長(zhǎng)
505——服務(wù)器不支持或拒絕支請(qǐng)求頭中指定的HTTP版本
消息報(bào)頭下面會(huì)講。
2、響應(yīng)正文
所謂響應(yīng)正文,就是服務(wù)器返回的資源的內(nèi)容。即整個(gè)HTML文件。
五、消息報(bào)頭
HTTP請(qǐng)求和HTTP響應(yīng)都有消息報(bào)頭。而消息報(bào)頭是由眾多報(bào)頭域組成。每一個(gè)報(bào)頭域都由名字 “:” 空格組成,消息報(bào)頭域的名字是大小寫(xiě)無(wú)關(guān)的。
HTTP消息報(bào)頭包括普通報(bào)頭、請(qǐng)求報(bào)頭、響應(yīng)報(bào)頭和實(shí)體報(bào)頭。
1、普通報(bào)頭:
在普通報(bào)頭中,有少數(shù)報(bào)頭域用于所有的請(qǐng)求和響應(yīng)消息,但并不用于被傳輸?shù)膶?shí)體,只用于傳輸?shù)南ⅰ?br />
普通報(bào)頭包括:
常見(jiàn)的普通報(bào)頭:
1)Cache-Control
Cache-Control用于指定緩存指令,緩存指令是單向的(響應(yīng)中出現(xiàn)的緩存指令在請(qǐng)求中未必會(huì)出現(xiàn)),且是獨(dú)立的(一個(gè)消息的緩存指令不會(huì)影響另一個(gè)消息處理的緩存機(jī)制),HTTP1.0使用的類(lèi)似的報(bào)頭域?yàn)镻ragma。
請(qǐng)求時(shí)的緩存指令包括:no-cache(用于指示請(qǐng)求或響應(yīng)消息不能緩存)、no-store、max-age、max-stale、min-fresh、only-if-cached;
響應(yīng)時(shí)的緩存指令包括:public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage.
2)Date
Date普通報(bào)頭域表示消息產(chǎn)生的日期和時(shí)間
3)Connection
Connection普通報(bào)頭域允許發(fā)送指定連接的選項(xiàng)。例如指定連接是連續(xù),或者指定“close”選項(xiàng),通知服務(wù)器,在響應(yīng)完成后,關(guān)閉連接
2、請(qǐng)求報(bào)頭
請(qǐng)求報(bào)頭允許客戶端向服務(wù)器端傳遞請(qǐng)求的附加信息以及客戶端自身的信息。
請(qǐng)求報(bào)頭包括:
常見(jiàn)的請(qǐng)求報(bào)頭:
1)Accept
Accept請(qǐng)求報(bào)頭域用于指定客戶端接受哪些類(lèi)型的信息。
2)Accept-Charset
Accept-Charset請(qǐng)求報(bào)頭域用于指定客戶端接受的字符集。如果在請(qǐng)求消息中沒(méi)有設(shè)置這個(gè)域,缺省是任何字符集都可以接受。
3)Accept-Encoding
Accept-Encoding請(qǐng)求報(bào)頭域類(lèi)似于Accept,但是它是用于指定可接受的內(nèi)容編碼。如果請(qǐng)求消息中沒(méi)有設(shè)置這個(gè)域服務(wù)器假定客戶端對(duì)各種內(nèi)容編碼都可以接受。
4)Accept-Language
Accept-Language請(qǐng)求報(bào)頭域類(lèi)似于Accept,但是它是用于指定一種自然語(yǔ)言如果請(qǐng)求消息中沒(méi)有設(shè)置這個(gè)報(bào)頭域,服務(wù)器假定客戶端對(duì)各種語(yǔ)言都可以接受。
5)Authorization
Authorization請(qǐng)求報(bào)頭域主要用于證明客戶端有權(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)證。
6)Host
發(fā)送請(qǐng)求時(shí),該報(bào)頭域是必需的。Host請(qǐng)求報(bào)頭域主要用于指定被請(qǐng)求資源的Internet主機(jī)和端口號(hào),它通常從HTTP URL中提取出來(lái)的。
7)User-Agent
User-Agent請(qǐng)求報(bào)頭域允許客戶端將它的操作系統(tǒng)、瀏覽器和其它屬性告訴服務(wù)器。不過(guò),這個(gè)報(bào)頭域不是必需的,如果我們自己編寫(xiě)一個(gè)瀏覽器,不使用User-Agent請(qǐng)求報(bào)頭域,那么服務(wù)器端就
無(wú)法得知我們的信息了。
3、響應(yīng)報(bào)頭
響應(yīng)報(bào)頭允許服務(wù)器傳遞不能放在狀態(tài)行中的附加響應(yīng)信息,以及關(guān)于服務(wù)器的信息和對(duì)Request-URI所標(biāo)識(shí)的資源進(jìn)行下一步訪問(wèn)的信息。
響應(yīng)報(bào)頭包括:
常見(jiàn)的實(shí)體報(bào)頭:
1)Location
Location響應(yīng)報(bào)頭域用于重定向接受者到一個(gè)新的位置。Location響應(yīng)報(bào)頭域常用在更換域名的時(shí)候。
2)Server
Server響應(yīng)報(bào)頭域包含了服務(wù)器用來(lái)處理請(qǐng)求的軟件信息。與User-Agent請(qǐng)求報(bào)頭域是相對(duì)應(yīng)的。
3)WWW-Authenticate
WWW-Authenticate響應(yīng)報(bào)頭域必須被包含在401(未授權(quán)的)響應(yīng)消息中,客戶端收到401響應(yīng)消息時(shí)候,并發(fā)送Authorization報(bào)頭域請(qǐng)求服務(wù)器對(duì)其進(jìn)行驗(yàn)證時(shí),服務(wù)端響應(yīng)報(bào)頭就包含該報(bào)頭域。
4、實(shí)體報(bào)頭
請(qǐng)求和響應(yīng)消息都可以傳送一個(gè)實(shí)體。一個(gè)實(shí)體由實(shí)體報(bào)頭域和實(shí)體正文組成,但并不是說(shuō)實(shí)體報(bào)頭域和實(shí)體正文要在一起發(fā)送,可以只發(fā)送實(shí)體報(bào)頭域。實(shí)體報(bào)頭定義了關(guān)于實(shí)體正文(eg:有無(wú)實(shí)體正文)和請(qǐng)求所標(biāo)識(shí)的資源的元信息。
實(shí)體報(bào)頭包括:
常見(jiàn)的實(shí)體報(bào)頭:
1)Content-Encoding
Content-Encoding實(shí)體報(bào)頭域被用作媒體類(lèi)型的修飾符,它的值指示了已經(jīng)被應(yīng)用到實(shí)體正文的附加內(nèi)容的編碼,因而要獲得Content-Type報(bào)頭域中所引用的媒體類(lèi)型,必須采用相應(yīng)的解碼機(jī)制。Content-Encoding主要用于記錄文檔的壓縮方法。
2)Content-Language
Content-Language實(shí)體報(bào)頭域描述了資源所用的自然語(yǔ)言。沒(méi)有設(shè)置該域則認(rèn)為實(shí)體內(nèi)容將提供給所有的語(yǔ)言
閱讀者。
3)Content-Length
Content-Length實(shí)體報(bào)頭域用于指明實(shí)體正文的長(zhǎng)度,以字節(jié)方式存儲(chǔ)的十進(jìn)制數(shù)字來(lái)表示。即一個(gè)數(shù)字字符占一個(gè)字節(jié),用其對(duì)應(yīng)的ASCII碼來(lái)存儲(chǔ)傳輸。
4)Content-Type
Content-Type實(shí)體報(bào)頭域用語(yǔ)指明發(fā)送給接收者的實(shí)體正文的媒體類(lèi)型。
5)Expires
Expires實(shí)體報(bào)頭域給出響應(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í)間。
6)Last-Modified
Last-Modified實(shí)體報(bào)頭域用于指示資源的最后修改日期和時(shí)間。
六、關(guān)于HTTP請(qǐng)求GET和POST的區(qū)別
1、提交數(shù)據(jù)位置
GET提交,請(qǐng)求的數(shù)據(jù)會(huì)附在URL之后(就是把數(shù)據(jù)放置在HTTP協(xié)議頭中),以?分割URL和傳輸數(shù)據(jù),多個(gè)參數(shù)用&連接;例如:login.action?name=hyddd&password=idontknow&verify=你 好。如果數(shù)據(jù)是英文字母/數(shù)字,原樣發(fā)送,如果是空格,轉(zhuǎn)換為 ,如果是中文/其他字符,則直接把字符串用BASE64加密,得出如: 你好,其中%XX中的XX為該符號(hào)以16進(jìn)制表示的ASCII。
POST提交:把提交的數(shù)據(jù)放置在是HTTP包的包體中。上文示例中紅色字體標(biāo)明的就是實(shí)際的傳輸數(shù)據(jù)
因此,GET提交的數(shù)據(jù)會(huì)在地址欄中顯示出來(lái),而POST提交,地址欄不會(huì)改變
2、傳輸數(shù)據(jù)的大小
首先聲明,HTTP協(xié)議沒(méi)有對(duì)傳輸?shù)臄?shù)據(jù)大小進(jìn)行限制,HTTP協(xié)議規(guī)范也沒(méi)有對(duì)URL長(zhǎng)度進(jìn)行限制。 而在實(shí)際開(kāi)發(fā)中存在的限制主要有:
GET:特定瀏覽器和服務(wù)器對(duì)URL長(zhǎng)度有限制,例如IE對(duì)URL長(zhǎng)度的限制是2083字節(jié)(2K 35)。對(duì)于其他瀏覽器,如Netscape、FireFox等,理論上沒(méi)有長(zhǎng)度限制,其限制取決于操作系統(tǒng)的支持。
因此對(duì)于GET提交時(shí),傳輸數(shù)據(jù)就會(huì)受到URL長(zhǎng)度的限制。
POST:由于不是通過(guò)URL傳值,理論上數(shù)據(jù)不受限。但實(shí)際各個(gè)WEB服務(wù)器會(huì)規(guī)定對(duì)post提交數(shù)據(jù)大小進(jìn)行限制,Apache、IIS6都有各自的配置。
3、安全性
POST的安全性要比GET的安全性高。注意:這里所說(shuō)的安全性和上面GET提到的“安全”不是同個(gè)概念。上面“安全”的含義僅僅是不作數(shù)據(jù)修改,而這里安全的含義是真正的Security的含義,比如:通過(guò)GET提交數(shù)據(jù),用戶名和密碼將明文出現(xiàn)在URL上,因?yàn)?1)登錄頁(yè)面有可能被瀏覽器緩存,(2)其他人查看瀏覽器的歷史紀(jì)錄,那么別人就可以拿到你的賬號(hào)和密碼了。
更多關(guān)于云服務(wù)器,域名注冊(cè),虛擬主機(jī)的問(wèn)題,請(qǐng)?jiān)L問(wèn)三五互聯(lián)官網(wǎng):www.shinetop.cn