Http協(xié)議詳解
標(biāo)簽(空格分隔): Linux
聲明:本片文章非原創(chuàng)鞋仍,內(nèi)容來源于博客園作者MIN飛翔的HTTP協(xié)議詳解地址http://www.cnblogs.com/EricaMIN1987_IT/p/3837436.html
,這里只是排版方式的修改孵班,提供自己學(xué)習(xí)并分享給大家些椒,敬請(qǐng)尊重原創(chuàng)薄辅。
一静浴、概念
協(xié)議
是指計(jì)算機(jī)通信網(wǎng)絡(luò)中兩臺(tái)計(jì)算機(jī)之間進(jìn)行通信所必須共同遵守的規(guī)定
或規(guī)則
勿她,超文本傳輸協(xié)議(HTTP)是一種通信協(xié)議即横,它允許將超文本標(biāo)記語言(HTML)文檔從Web服務(wù)器傳送到客戶端的瀏覽器噪生。
HTTP協(xié)議,即超文本傳輸協(xié)議(Hypertext transfer protocol)东囚。是一種詳細(xì)規(guī)定了瀏覽器和萬維網(wǎng)(WWW = World Wide Web)服務(wù)器之間互相通信的規(guī)則跺嗽,通過因特網(wǎng)傳送萬維網(wǎng)文檔的數(shù)據(jù)傳送協(xié)議。
HTTP協(xié)議是用于從WWW服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議舔庶。它可以使瀏覽器更加高效抛蚁,使網(wǎng)絡(luò)傳輸減少。它不僅保證計(jì)算機(jī)正確快速地傳輸超文本文檔惕橙,還確定傳輸文檔中的哪一部分瞧甩,以及哪部分內(nèi)容首先顯示(如文本先于圖形)等。
HTTP是一個(gè)應(yīng)用層協(xié)議弥鹦,由請(qǐng)求和響應(yīng)構(gòu)成肚逸,是一個(gè)標(biāo)準(zhǔn)的客戶端服務(wù)器模型。HTTP是一個(gè)無狀態(tài)的協(xié)議彬坏。
在Internet中所有的傳輸都是通過TCP/IP進(jìn)行的朦促。HTTP協(xié)議作為TCP/IP模型中應(yīng)用層的協(xié)議也不例外。HTTP協(xié)議通常承載于TCP協(xié)議之上栓始,有時(shí)也承載于TLS或SSL協(xié)議層之上务冕,這個(gè)時(shí)候,就成了我們常說的HTTPS幻赚。如下圖所示:
HTTP
默認(rèn)的端口號(hào)為80
禀忆,HTTPS的端口號(hào)為443
。
瀏覽網(wǎng)頁是HTTP
的主要應(yīng)用落恼,但是這并不代表HTTP
就只能應(yīng)用于網(wǎng)頁的瀏覽箩退。HTTP
是一種協(xié)議,只要通信的雙方都遵守這個(gè)協(xié)議佳谦,HTTP
就能有用武之地戴涝。比如咱們常用的QQ,迅雷這些軟件,都會(huì)使用HTTP
協(xié)議(還包括其他的協(xié)議)啥刻。
二奸鸯、簡史
它的發(fā)展是萬維網(wǎng)協(xié)會(huì)(World Wide Web Consortium)和Internet工作小組IETF(Internet Engineering Task Force)合作的結(jié)果,(他們)最終發(fā)布了一系列的RFC郑什,RFC 1945定義了HTTP/1.0版本府喳。其中最著名的就是RFC 2616。RFC 2616定義了今天普遍使用的一個(gè)版本——HTTP 1.1蘑拯。
三、特點(diǎn)
HTTP協(xié)議永遠(yuǎn)都是客戶端發(fā)起請(qǐng)求兜粘,服務(wù)器回送響應(yīng)申窘。這樣就限制了使用HTTP協(xié)議,無法實(shí)現(xiàn)在客戶端沒有發(fā)起請(qǐng)求的時(shí)候孔轴,服務(wù)器將消息推送給客戶端剃法。
HTTP協(xié)議的主要特點(diǎn)可概括如下:
- 支持客戶/服務(wù)器模式。支持基本認(rèn)證和安全認(rèn)證路鹰。
- 簡單快速:客戶向服務(wù)器請(qǐng)求服務(wù)時(shí)贷洲,只需傳送請(qǐng)求方法和路徑。請(qǐng)求方法常用的有GET晋柱、HEAD优构、POST。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同雁竞。由于HTTP協(xié)議簡單钦椭,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快碑诉。
- 靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對(duì)象彪腔。正在傳輸?shù)念愋陀蒀ontent-Type加以標(biāo)記。
- HTTP 0.9和1.0使用非持續(xù)連接:限制每次連接只處理一個(gè)請(qǐng)求进栽,服務(wù)器處理完客戶的請(qǐng)求德挣,并收到客戶的應(yīng)答后,即斷開連接快毛。HTTP 1.1使用持續(xù)連接:不必為每個(gè)web對(duì)象創(chuàng)建一個(gè)新的連接格嗅,一個(gè)連接可以傳送多個(gè)對(duì)象,采用這種方式可以節(jié)省傳輸時(shí)間祸泪。
- 無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議吗浩。無狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息没隘,則它必須重傳懂扼,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。
無狀態(tài)協(xié)議:
協(xié)議的狀態(tài)是指下一次傳輸可以“記住”這次傳輸信息的能力。
http是不會(huì)為了下一次連接而維護(hù)這次連接所傳輸?shù)男畔?為了保證服務(wù)器內(nèi)存阀湿。
比如客戶獲得一張網(wǎng)頁之后關(guān)閉瀏覽器赶熟,然后再一次啟動(dòng)瀏覽器,再登陸該網(wǎng)站陷嘴,但是服務(wù)器并不知道客戶關(guān)閉了一次瀏覽器映砖。
由于Web服務(wù)器要面對(duì)很多瀏覽器的并發(fā)訪問,為了提高Web服務(wù)器對(duì)并發(fā)訪問的處理能力灾挨,在設(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)兩次訪問同一對(duì)象時(shí)劳澄,服務(wù)器進(jìn)程不會(huì)因?yàn)橐呀?jīng)給它發(fā)過應(yīng)答報(bào)文而不接受第二期服務(wù)請(qǐng)求地技。由于Web服務(wù)器不保存發(fā)送請(qǐng)求的Web瀏覽器進(jìn)程的任何信息,因此HTTP協(xié)議屬于無狀態(tài)協(xié)議(Stateless Protocol)秒拔。
HTTP協(xié)議是無狀態(tài)的和Connection: keep-alive的區(qū)別:
無狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒有記憶能力莫矗,服務(wù)器不知道客戶端是什么狀態(tài)。從另一方面講砂缩,打開一個(gè)服務(wù)器上的網(wǎng)頁和你之前打開這個(gè)服務(wù)器上的網(wǎng)頁之間沒有任何聯(lián)系作谚。
HTTP
是一個(gè)無狀態(tài)的面向連接的協(xié)議,無狀態(tài)不代表HTTP
不能保持TCP
連接庵芭,更不能代表HTTP
使用的是UDP
協(xié)議(無連接)妹懒。
從HTTP/1.1
起,默認(rèn)都開啟了Keep-Alive喳挑,保持連接特性彬伦,簡單地說,當(dāng)一個(gè)網(wǎng)頁打開完成后伊诵,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會(huì)關(guān)閉单绑,如果客戶端再次訪問這個(gè)服務(wù)器上的網(wǎng)頁,會(huì)繼續(xù)使用這一條已經(jīng)建立的連接曹宴。
Keep-Alive
不會(huì)永久保持連接搂橙,它有一個(gè)保持時(shí)間,可以在不同的服務(wù)器軟件(如Apache)中設(shè)定這個(gè)時(shí)間笛坦。
四区转、工作流程
一次HTTP操作稱為一個(gè)事務(wù),其工作過程可分為四步:
- 首先客戶機(jī)與服務(wù)器需要建立連接版扩。只要單擊某個(gè)超級(jí)鏈接废离,HTTP的工作開始。
- 建立連接后礁芦,客戶機(jī)發(fā)送一個(gè)請(qǐng)求給服務(wù)器蜻韭,請(qǐng)求方式的格式為:統(tǒng)一資源標(biāo)識(shí)符(URL)悼尾、協(xié)議版本號(hào),后邊是MIME信息包括請(qǐng)求修飾符肖方、客戶機(jī)信息和可能的內(nèi)容闺魏。
- 服務(wù)器接到請(qǐng)求后,給予相應(yīng)的響應(yīng)信息俯画,其格式為一個(gè)狀態(tài)行析桥,包括信息的協(xié)議版本號(hào)、一個(gè)成功或錯(cuò)誤的代碼艰垂,后邊是MIME信息包括服務(wù)器信息泡仗、實(shí)體信息和可能的內(nèi)容。
- 客戶端接收服務(wù)器所返回的信息通過瀏覽器顯示在用戶的顯示屏上材泄,然后客戶機(jī)與服務(wù)器斷開連接沮焕。
如果在以上過程中的某一步出現(xiàn)錯(cuò)誤,那么產(chǎn)生錯(cuò)誤的信息將返回到客戶端拉宗,有顯示屏輸出。對(duì)于用戶來說辣辫,這些過程是由HTTP自己完成的旦事,用戶只要用鼠標(biāo)點(diǎn)擊,等待信息顯示就可以了急灭。
HTTP
是基于傳輸層的TCP
協(xié)議姐浮,而TCP
是一個(gè)端到端的面向連接的協(xié)議。所謂的端到端可以理解為進(jìn)程到進(jìn)程之間的通信葬馋。所以HTTP
在開始傳輸之前卖鲤,首先需要建立TCP
連接,而TCP
連接的過程需要所謂的“三次握手”畴嘶。下圖所示TCP
連接的三次握手蛋逾。
在TCP
三次握手之后,建立了TCP
連接窗悯,此時(shí)HTTP
就可以進(jìn)行傳輸了区匣。一個(gè)重要的概念是面向連接,既HTTP
在傳輸完成之間并不斷開TCP
連接蒋院。在HTTP1.1中(通過Connection頭設(shè)置)這是默認(rèn)行為亏钩。
五、使用Wireshark抓TCP欺旧、http包
打開Wireshark姑丑,選擇工具欄上的"Capture"->"Options"
點(diǎn)擊"Capture Filter",此處選擇的是"HTTP TCP port(80)"辞友,選擇后點(diǎn)擊上圖的"Start"開始抓包栅哀。
然后在瀏覽器中打開http://image.baidu.com/
,抓包結(jié)果如下圖所示:
在上圖中,可清晰的看到客戶端瀏覽器(ip為192.168.1.6)與服務(wù)器(115.239.210.36)的交互過程:
- No1:瀏覽器(192.168.1.6)向服務(wù)器(115.239.210.36)發(fā)出連接請(qǐng)求昌屉。此為TCP三次握手第一步钙蒙,此時(shí)從圖中可以看出,為SYN间驮,seq:X (x=0)躬厌;
- No2:服務(wù)器(115.239.210.36)回應(yīng)了瀏覽器(192.168.1.6)的請(qǐng)求,并要求確認(rèn)竞帽,此時(shí)為:SYN扛施,ACK,此時(shí)seq:y(y為0)屹篓,ACK:x+1(為1)疙渣。此為三次握手的第二步;
- No3:瀏覽器(192.168.1.6)回應(yīng)了服務(wù)器(115.239.210.36)的確認(rèn)堆巧,連接成功妄荔。為:ACK,此時(shí)seq:x+1(為1)谍肤,ACK:y+1(為1)啦租。此為三次握手的第三步;
- No4:瀏覽器(192.168.1.6)發(fā)出一個(gè)頁面HTTP請(qǐng)求荒揣;
- No5:服務(wù)器(115.239.210.36)確認(rèn)篷角;
- No6:服務(wù)器(115.239.210.36)發(fā)送數(shù)據(jù);
- No8:客戶端瀏覽器(192.168.1.6)確認(rèn)系任;
- No81:客戶端(192.168.1.6)發(fā)出一個(gè)圖片HTTP請(qǐng)求恳蹲;
- No202:服務(wù)器(115.239.210.36)發(fā)送狀態(tài)響應(yīng)碼200 OK。
六俩滥、頭域
每個(gè)頭域由一個(gè)域名嘉蕾,冒號(hào)(:)和域值三部分組成。域名是大小寫無關(guān)的举农,域值前可以添加任何數(shù)量的空格符荆针,頭域可以被擴(kuò)展為多行,在每行開始處颁糟,使用至少一個(gè)空格或制表符航背。
6.1、請(qǐng)求信息:
發(fā)出的請(qǐng)求信息格式如下:
- 請(qǐng)求行棱貌,例如GET /images/logo.gif HTTP/1.1玖媚,表示從/images目錄下請(qǐng)求logo.gif這個(gè)文件。
- (請(qǐng)求)頭婚脱,例如Accept-Language: en
- 空行
- 可選的消息體 請(qǐng)求行和標(biāo)題必須以<CR><LF>作為結(jié)尾(也就是今魔,回車然后換行)勺像。空行內(nèi)必須只有<CR><LF>而無其他空格错森。在HTTP/1.1協(xié)議中吟宦,所有的請(qǐng)求頭,除post外涩维,都是可選的殃姓。
6.2、請(qǐng)求方法
HTTP/1.1
協(xié)議中共定義了八種方法(有時(shí)也叫“動(dòng)作”)來表明Request-URI指定的資源的不同操作方式:
OPTIONS
- 返回服務(wù)器針對(duì)特定資源所支持的HTTP
請(qǐng)求方法瓦阐。也可以利用向Web服務(wù)器發(fā)送'*'的請(qǐng)求來測試服務(wù)器的功能性蜗侈。
HEAD
- 向服務(wù)器索要與GET請(qǐng)求相一致的響應(yīng),只不過響應(yīng)體將不會(huì)被返回睡蟋。這一方法可以在不必傳輸整個(gè)響應(yīng)內(nèi)容的情況下踏幻,就可以獲取包含在響應(yīng)消息頭中的元信息。該方法常用于測試超鏈接的有效性戳杀,是否可以訪問该面,以及最近是否更新。
GET
- 向特定的資源發(fā)出請(qǐng)求信卡。注意:GET方法不應(yīng)當(dāng)被用于產(chǎn)生“副作用”的操作中吆倦,例如在web app.中。其中一個(gè)原因是GET可能會(huì)被網(wǎng)絡(luò)蜘蛛等隨意訪問坐求。
POST
- 向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請(qǐng)求體中晌梨。POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立和/或已有資源的修改桥嗤。
PUT
- 向指定資源位置上傳其最新內(nèi)容。
DELETE
- 請(qǐng)求服務(wù)器刪除Request-URI所標(biāo)識(shí)的資源仔蝌。
TRACE
- 回顯服務(wù)器收到的請(qǐng)求泛领,主要用于測試或診斷。
CONNECT
- HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器敛惊。
PATCH
- 用來將局部修改應(yīng)用于某一資源渊鞋,添加于規(guī)范RFC5789。
方法名稱是區(qū)分大小寫的瞧挤。當(dāng)某個(gè)請(qǐng)求所針對(duì)的資源不支持對(duì)應(yīng)的請(qǐng)求方法的時(shí)候锡宋,服務(wù)器應(yīng)當(dāng)返回狀態(tài)碼405
(Method Not Allowed);當(dāng)服務(wù)器不認(rèn)識(shí)或者不支持對(duì)應(yīng)的請(qǐng)求方法的時(shí)候特恬,應(yīng)當(dāng)返回狀態(tài)碼501
(Not Implemented)执俩。
HTTP
服務(wù)器至少應(yīng)該實(shí)現(xiàn)GET和HEAD方法,其他方法都是可選的癌刽。此外役首,除了上述方法尝丐,特定的HTTP服務(wù)器還能夠擴(kuò)展自定義的方法。
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的長度有限制)梯嗽,而POST方法提交的數(shù)據(jù)沒有限制。
- GET方式需要使用Request.QueryString來取得變量的值,而POST方式通過Request.Form來獲取變量的值彻磁。
- GET方式提交數(shù)據(jù),會(huì)帶來安全問題耐薯,比如一個(gè)登錄頁面蜓陌,通過GET方式提交數(shù)據(jù)時(shí)窘问,用戶名和密碼將出現(xiàn)在URL上儿咱,如果頁面可以被緩存或者其他人可以訪問這臺(tái)機(jī)器,就可以從歷史記錄獲得該用戶的賬號(hào)和密碼吏颖。
6.3嫉柴、響應(yīng)消息
客戶端向服務(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)類別的類別,服務(wù)器響應(yīng)里可以含實(shí)體內(nèi)容贺氓,但不是所有的響應(yīng)都有實(shí)體內(nèi)容辙培。
響應(yīng)頭第一行也稱為狀態(tài)行蔑水,格式如下(下圖中紅線標(biāo)出的那行):
HTTP-Version
空格 Status-Code
空格 Reason-Phrase
CRLF
HTTP-Version
表示HTTP版本,例如為HTTP/1.1。Status-Code
是結(jié)果代碼护戳,用三個(gè)數(shù)字表示媳荒。Reason-Phrase
是個(gè)簡單的文本描述,解釋Status-Code
的具體原因驹饺。Status-Code
用于機(jī)器自動(dòng)識(shí)別钳枕,Reason-Phrase
用于人工理解。Status-Code
的第一個(gè)數(shù)字代表響應(yīng)類別赏壹,可能取5個(gè)不同的值鱼炒。后兩個(gè)數(shù)字沒有分類作用。Status-Code的第一個(gè)數(shù)字代表響應(yīng)的類別卡儒,后續(xù)兩位描述在該類響應(yīng)下發(fā)生的具體狀況田柔,具體請(qǐng)參見:HTTP狀態(tài)碼 。
響應(yīng)消息的結(jié)構(gòu):
三個(gè)部分分別是:狀態(tài)行骨望、消息報(bào)頭硬爆、響應(yīng)正文。
無論你何時(shí)瀏覽一個(gè)網(wǎng)頁擎鸠,你的電腦都會(huì)通過一個(gè)使用HTTP協(xié)議
的服務(wù)器來獲取所請(qǐng)求的數(shù)據(jù)缀磕。在你請(qǐng)求的網(wǎng)頁顯示在瀏覽器之前,支配網(wǎng)頁的網(wǎng)站服務(wù)器會(huì)返回一個(gè)包含有狀態(tài)碼的HTTP頭文件
劣光。這個(gè)狀態(tài)碼提供了有關(guān)所請(qǐng)求網(wǎng)頁的相關(guān)條件信息袜蚕。如果一切正常,一個(gè)標(biāo)準(zhǔn)網(wǎng)頁會(huì)收到一條諸如200
的狀態(tài)碼绢涡。當(dāng)然我們的目的不是去研究200
響應(yīng)碼牲剃,而是去探討那些代表出現(xiàn)錯(cuò)誤信息的服務(wù)器頭文件響應(yīng)碼,例如表示“未找到指定網(wǎng)頁
”的404
碼雄可。
6.4凿傅、響應(yīng)頭域
服務(wù)器需要傳遞許多附加信息,這些信息不能全放在狀態(tài)行里数苫。因此聪舒,需要另行定義響應(yīng)頭域,用來描述這些附加信息虐急。響應(yīng)頭域主要描述服務(wù)器的信息和Request-URI的信息箱残。
6.5、HTTP常見的請(qǐng)求頭(在HTTP/1.1 協(xié)議中止吁,所有的請(qǐng)求頭被辑,除Host外燎悍,都是可選的)
If-Modified-Since
:把瀏覽器端緩存頁面的最后修改時(shí)間發(fā)送到服務(wù)器去,服務(wù)器會(huì)把這個(gè)時(shí)間與服務(wù)器上實(shí)際文件的最后修改時(shí)間進(jìn)行對(duì)比敷待。如果時(shí)間一致间涵,那么返回304
,客戶端就直接使用本地緩存文件榜揖。如果時(shí)間不一致勾哩,就會(huì)返回200和新的文件內(nèi)容【儆矗客戶端接到之后思劳,會(huì)丟棄舊文件,把新文件緩存起來妨猩,并顯示在瀏覽器中潜叛。
例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT
If-None-Match:If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息壶硅。 當(dāng)用戶再次請(qǐng)求該資源時(shí)威兜,將在HTTP Request中加入If-None-Match信息(ETag的值)。如果服務(wù)器驗(yàn)證資源的ETag沒有改變(該資源沒有更新)庐椒,將返回一個(gè)304狀態(tài)告訴客戶端使用本地緩存文件椒舵。否則將返回200狀態(tài)和新的資源和Etag.使用這樣的機(jī)制將提高網(wǎng)站的性能。例如: If-None-Match: "03f2b33c0bfcc1:0"约谈。
Pragma
:指定“no-cache”值表示服務(wù)器必須返回一個(gè)刷新后的文檔笔宿,即使它是代理服務(wù)器而且已經(jīng)有了頁面的本地拷貝;在HTTP/1.1版本中棱诱,它和Cache-Control:no-cache作用一模一樣泼橘。Pargma只有一個(gè)用法, 例如: Pragma: no-cache
注意: 在HTTP/1.0版本中迈勋,只實(shí)現(xiàn)了Pragema:no-cache, 沒有實(shí)現(xiàn)Cache-Control
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è)消息處理過程中的緩存處理過程)靡菇。請(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 用于防止重要的信息被無意的發(fā)布烤礁。在請(qǐng)求消息中發(fā)送將使得請(qǐng)求和響應(yīng)消息都不使用緩存。
Cache-Control:max-age 指示客戶機(jī)可以接收生存期不大于指定時(shí)間(以秒為單位)的響應(yīng)肥照。
Cache-Control:min-fresh 指示客戶機(jī)可以接收響應(yīng)時(shí)間小于當(dāng)前時(shí)間加上指定時(shí)間的響應(yīng)脚仔。
Cache-Control:max-stale 指示客戶機(jī)可以接收超出超時(shí)期間的響應(yīng)消息。如果指定max-stale消息的值舆绎,那么客戶機(jī)可以接收超出超時(shí)期指定值之內(nèi)的響應(yīng)消息鲤脏。
Accept
:瀏覽器端可以接受的MIME類型。例如:Accept: text/html 代表瀏覽器可以接受服務(wù)器回發(fā)的類型為 text/html 也就是我們常說的html文檔吕朵,如果服務(wù)器無法返回text/html類型的數(shù)據(jù)猎醇,服務(wù)器應(yīng)該返回一個(gè)406錯(cuò)誤(non acceptable)。通配符 * 代表任意類型努溃,例如 Accept: / 代表瀏覽器可以處理所有類型硫嘶,(一般瀏覽器發(fā)給服務(wù)器都是發(fā)這個(gè))。
Accept-Encoding
:瀏覽器申明自己可接收的編碼方法茅坛,通常指定壓縮方法音半,是否支持壓縮,支持什么壓縮方法(gzip贡蓖,deflate);Servlet能夠向支持gzip的瀏覽器返回經(jīng)gzip編碼的HTML頁面曹鸠。許多情形下這可以減少5到10倍的下載時(shí)間。例如: Accept-Encoding: gzip, deflate斥铺。如果請(qǐng)求消息中沒有設(shè)置這個(gè)域彻桃,服務(wù)器假定客戶端對(duì)各種內(nèi)容編碼都可以接受。
Accept-Language
:瀏覽器申明自己接收的語言晾蜘。語言跟字符集的區(qū)別:中文是語言邻眷,中文有多種字符集,比如big5剔交,gb2312肆饶,gbk等等;例如:Accept-Language: en-us岖常。如果請(qǐng)求消息中沒有設(shè)置這個(gè)報(bào)頭域驯镊,服務(wù)器假定客戶端對(duì)各種語言都可以接受。
Accept-Charset
:瀏覽器可接受的字符集。如果在請(qǐng)求消息中沒有設(shè)置這個(gè)域板惑,缺省表示任何字符集都可以接受橄镜。
User-Agent
:告訴HTTP服務(wù)器,客戶端使用的操作系統(tǒ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)洽胶。
Content-Type
:例如:Content-Type: application/x-www-form-urlencoded。
Referer
:包含一個(gè)URL裆馒,用戶從該URL代表的頁面出發(fā)訪問當(dāng)前請(qǐng)求的頁面姊氓。提供了Request的上下文信息的服務(wù)器,告訴服務(wù)器我是從哪個(gè)鏈接過來的领追,比如從我主頁上鏈接到一個(gè)朋友那里他膳,他的服務(wù)器就能夠從HTTP Referer中統(tǒng)計(jì)出每天有多少用戶點(diǎn)擊我主頁上的鏈接訪問他的網(wǎng)站。
例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT
Connection
:
例如:Connection: keep-alive 當(dāng)一個(gè)網(wǎng)頁打開完成后绒窑,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會(huì)關(guān)閉棕孙,如果客戶端再次訪問這個(gè)服務(wù)器上的網(wǎng)頁,會(huì)繼續(xù)使用這一條已經(jīng)建立的連接些膨。HTTP 1.1默認(rèn)進(jìn)行持久連接蟀俊。利用持久連接的優(yōu)點(diǎn),當(dāng)頁面包含多個(gè)元素時(shí)(例如Applet订雾,圖片)肢预,顯著地減少下載所需要的時(shí)間。要實(shí)現(xiàn)這一點(diǎn)洼哎,Servlet需要在應(yīng)答中發(fā)送一個(gè)Content-Length頭烫映,最簡單的實(shí)現(xiàn)方法是:先把內(nèi)容寫入ByteArrayOutputStream,然后在正式寫出內(nèi)容之前計(jì)算它的大小噩峦。
Connection: close 代表一個(gè)Request完成后锭沟,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接會(huì)關(guān)閉,當(dāng)客戶端再次發(fā)送Request识补,需要重新建立TCP連接族淮。
Host
:(發(fā)送請(qǐng)求時(shí),該頭域是必需的)主要用于指定被請(qǐng)求資源的Internet主機(jī)和端口號(hào)凭涂,它通常從HTTP URL中提取出來的祝辣。HTTP/1.1請(qǐng)求必須包含主機(jī)頭域,否則系統(tǒng)會(huì)以400狀態(tài)碼返回切油。
例如: 我們在瀏覽器中輸入:http://www.guet.edu.cn/index.html
蝙斜,瀏覽器發(fā)送的請(qǐng)求消息中,就會(huì)包含Host請(qǐng)求頭域:Host:http://www.guet.edu.cn
澎胡,此處使用缺省端口號(hào)80孕荠,若指定了端口號(hào)绢片,則變成:Host:指定端口號(hào)。
Cookie
:最重要的請(qǐng)求頭之一, 將cookie的值發(fā)送給HTTP服務(wù)器岛琼。
Content-Length
:表示請(qǐng)求消息正文的長度。例如:Content-Length: 38巢株。
Authorization:授權(quán)信息槐瑞,通常出現(xiàn)在對(duì)服務(wù)器發(fā)送的WWW-Authenticate頭的應(yīng)答中。主要用于證明客戶端有權(quán)查看某個(gè)資源阁苞。當(dāng)瀏覽器訪問一個(gè)頁面時(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類型。
From
:請(qǐng)求發(fā)送者的email地址丈钙,由一些特殊的Web客戶程序使用非驮,瀏覽器不會(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)求頭,如果無條件GET包含Range請(qǐng)求頭星岗,響應(yīng)會(huì)以狀態(tài)碼206(PartialContent)返回而不是以200(OK)填大。
6.6、HTTP常見的響應(yīng)頭
Allow
:服務(wù)器支持哪些請(qǐng)求方法(如GET伍茄、POST等)栋盹。
Date
:表示消息發(fā)送的時(shí)間,時(shí)間的描述格式由rfc822定義敷矫。例如例获,Date:Mon,31Dec200104:25:57GMT。Date描述的時(shí)間表示世界標(biāo)準(zhǔn)時(shí)曹仗,換算成本地時(shí)間榨汤,需要知道用戶所在的時(shí)區(qū)。你可以用setDateHeader來設(shè)置這個(gè)頭以避免轉(zhuǎn)換時(shí)間格式的麻煩
Expires
:指明應(yīng)該在什么時(shí)候認(rèn)為文檔已經(jīng)過期怎茫,從而不再緩存它收壕,重新從服務(wù)器獲取妓灌,會(huì)更新緩存。過期之前使用本地緩存蜜宪。HTTP1.1的客戶端和緩存會(huì)將非法的日期格式(包括0)看作已經(jīng)過期虫埂。eg:為了讓瀏覽器不要緩存頁面,我們也可以將Expires實(shí)體報(bào)頭域圃验,設(shè)置為0掉伏。
例如: Expires: Tue, 08 Feb 2022 11:35:14 GMT
P3P
:用于跨域設(shè)置Cookie, 這樣可以解決iframe跨域訪問cookie的問題
例如: 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ā)送到客戶端瀏覽器,每一個(gè)寫入cookie都會(huì)生成一個(gè)Set-Cookie澳窑。
例如: Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com
ETag
:和If-None-Match 配合使用斧散。
Last-Modified
:用于指示資源的最后修改日期和時(shí)間。Last-Modified也可用setDateHeader方法來設(shè)置摊聋。
Content-Type
:WEB服務(wù)器告訴瀏覽器自己響應(yīng)的對(duì)象的類型和字符集鸡捐。Servlet默認(rèn)為text/plain,但通常需要顯式地指定為text/html麻裁。由于經(jīng)常要設(shè)置Content-Type箍镜,因此HttpServletResponse提供了一個(gè)專用的方法setContentType”ⅲ可在web.xml文件中配置擴(kuò)展名和MIME類型的對(duì)應(yīng)關(guān)系鹿寨。
例如:Content-Type: text/html;charset=utf-8
Content-Type:text/html;charset=GB2312
Content-Type: image/jpeg
媒體類型的格式為:大類/小類,比如text/html薪夕。
IANA(The Internet Assigned Numbers Authority脚草,互聯(lián)網(wǎng)數(shù)字分配機(jī)構(gòu))定義了8個(gè)大類的媒體類型,分別是:
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.)
Content-Range
:用于指定整個(gè)實(shí)體中的一部分的插入位置原献,他也指示了整個(gè)實(shí)體的長度馏慨。在服務(wù)器向客戶返回一個(gè)部分響應(yīng),它必須描述響應(yīng)覆蓋的范圍和整個(gè)實(shí)體長度姑隅。一般格式: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-Length
:指明實(shí)體正文的長度鄙陡,以字節(jié)方式存儲(chǔ)的十進(jìn)制數(shù)字來表示冕房。在數(shù)據(jù)下行的過程中,Content-Length的方式要預(yù)先在服務(wù)器中緩存所有數(shù)據(jù)趁矾,然后所有數(shù)據(jù)再一股腦兒地發(fā)給客戶端耙册。只有當(dāng)瀏覽器使用持久HTTP連接時(shí)才需要這個(gè)數(shù)據(jù)。如果你想要利用持久連接的優(yōu)勢毫捣,可以把輸出文檔寫入ByteArrayOutputStram详拙,完成后查看其大小帝际,然后把該值放入Content-Length頭,最后通過byteArrayStream.writeTo(response.getOutputStream()發(fā)送內(nèi)容饶辙。
例如: Content-Length: 19847
Content-Encoding
:WEB服務(wù)器表明自己使用了什么壓縮方法(gzip蹲诀,deflate)壓縮響應(yīng)中的對(duì)象。只有在解碼之后才可以得到Content-Type頭指定的內(nèi)容類型弃揽。利用gzip壓縮文檔能夠顯著地減少HTML文檔的下載時(shí)間侧甫。Java的GZIPOutputStream可以很方便地進(jìn)行g(shù)zip壓縮,但只有Unix上的Netscape和Windows上的IE 4蹋宦、IE 5才支持它。因此咒锻,Servlet應(yīng)該通過查看Accept-Encoding頭(即request.getHeader("Accept-Encoding"))檢查瀏覽器是否支持gzip冷冗,為支持gzip的瀏覽器返回經(jīng)gzip壓縮的HTML頁面,為其他瀏覽器返回普通頁面惑艇。
例如:Content-Encoding:gzip
Content-Language
:WEB服務(wù)器告訴瀏覽器自己響應(yīng)的對(duì)象所用的自然語言蒿辙。例如: Content-Language
:da。沒有設(shè)置該域則認(rèn)為實(shí)體內(nèi)容將提供給所有的語言閱讀滨巴。
Server
:指明HTTP服務(wù)器用來處理請(qǐng)求的軟件信息思灌。例如:Server: Microsoft-IIS/7.5、Server:Apache-Coyote/1.1恭取。此域能包含多個(gè)產(chǎn)品標(biāo)識(shí)和注釋泰偿,產(chǎn)品標(biāo)識(shí)一般按照重要性排序。
X-AspNet-Version
:如果網(wǎng)站是用ASP.NET開發(fā)的蜈垮,這個(gè)header用來表示ASP.NET的版本耗跛。
例如: X-AspNet-Version: 4.0.30319
X-Powered-By
:表示網(wǎng)站是用什么技術(shù)開發(fā)的。
例如: X-Powered-By: ASP.NET
Connection
:
例如:Connection: keep-alive 當(dāng)一個(gè)網(wǎng)頁打開完成后攒发,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接不會(huì)關(guān)閉调塌,如果客戶端再次訪問這個(gè)服務(wù)器上的網(wǎng)頁,會(huì)繼續(xù)使用這一條已經(jīng)建立的連接惠猿。
Connection: close 代表一個(gè)Request完成后羔砾,客戶端和服務(wù)器之間用于傳輸HTTP數(shù)據(jù)的TCP連接會(huì)關(guān)閉,當(dāng)客戶端再次發(fā)送Request偶妖,需要重新建立TCP連接姜凄。
Location
:用于重定向一個(gè)新的位置,包含新的URL地址餐屎。表示客戶應(yīng)當(dāng)?shù)侥睦锶ヌ崛∥臋n檀葛。Location通常不是直接設(shè)置的,而是通過HttpServletResponse的sendRedirect方法腹缩,該方法同時(shí)設(shè)置狀態(tài)代碼為302屿聋。Location響應(yīng)報(bào)頭域常用在更換域名的時(shí)候空扎。
Refresh
:表示瀏覽器應(yīng)該在多少時(shí)間之后刷新文檔,以秒計(jì)润讥。除了刷新當(dāng)前文檔之外转锈,你還可以通過setHeader("Refresh", "5; URL=http://host/path
")讓瀏覽器讀取指定的頁面。注意這種功能通常是通過設(shè)置HTML頁面HEAD區(qū)的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">
實(shí)現(xiàn)楚殿,這是因?yàn)榇榭詣?dòng)刷新或重定向?qū)τ谀切┎荒苁褂肅GI或Servlet的HTML編寫者十分重要。但是脆粥,對(duì)于Servlet來說砌溺,直接設(shè)置Refresh頭更加方便。注意Refresh的意義是“N秒之后刷新本頁面或訪問指定頁面”变隔,而不是“每隔N秒刷新本頁面或訪問指定頁面”规伐。因此,連續(xù)刷新要求每次都發(fā)送一個(gè)Refresh頭匣缘,而發(fā)送204狀態(tài)代碼則可以阻止瀏覽器繼續(xù)刷新猖闪,不管是使用Refresh頭還是<META HTTP-EQUIV="Refresh" ...>
。注意Refresh頭不屬于HTTP 1.1正式規(guī)范的一部分肌厨,而是一個(gè)擴(kuò)展培慌,但Netscape和IE都支持它。
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)頭域表鳍。
eg:WWW-Authenticate:Basic realm="Basic Auth Test!" //可以看出服務(wù)器對(duì)請(qǐng)求資源采用的是基本驗(yàn)證機(jī)制何址。
七、解決HTTP無狀態(tài)的問題
7.1进胯、通過Cookies保存狀態(tài)信息
通過Cookies蜜猾,服務(wù)器就可以清楚的知道請(qǐng)求2和請(qǐng)求1來自同一個(gè)客戶端逆皮。
7.2派哲、通過Session保存狀態(tài)信息
Session
機(jī)制是一種服務(wù)器端的機(jī)制霸株,服務(wù)器使用一種類似于散列表的結(jié)構(gòu)(也可能就是使用散列表)來保存信息。
當(dāng)程序需要為某個(gè)客戶端的請(qǐng)求創(chuàng)建一個(gè)session
的時(shí)候盯漂,服務(wù)器首先檢查這個(gè)客戶端的請(qǐng)求里是否已包含了一個(gè)session
標(biāo)識(shí) - 稱為 session id
颇玷,如果已包含一個(gè)session id
則說明以前已經(jīng)為此客戶端創(chuàng)建過session
,服務(wù)器就按照session id
把這個(gè) session
檢索出來使用(如果檢索不到就缆,可能會(huì)新建一個(gè))帖渠,如果客戶端請(qǐng)求不包含session id
,則為此客戶端創(chuàng)建一個(gè)session
并且生成一個(gè)與此session
相關(guān)聯(lián)的session id
竭宰,session id
的值應(yīng)該是一個(gè)既不會(huì)重復(fù)空郊,又不容易被找到規(guī)律以仿造的字符串份招,這個(gè)session id
將被在本次響應(yīng)中返回給客戶端保存。
Session的實(shí)現(xiàn)方式:
1狞甚、使用Cookie來實(shí)現(xiàn):
服務(wù)器給每個(gè)Session分配一個(gè)唯一的JSESSIONID锁摔,并通過Cookie發(fā)送給客戶端。
當(dāng)客戶端發(fā)起新的請(qǐng)求的時(shí)候哼审,將在Cookie頭中攜帶這個(gè)JSESSIONID谐腰。這樣服務(wù)器能夠找到這個(gè)客戶端對(duì)應(yīng)的Session。
2涩盾、使用URL回寫來實(shí)現(xiàn)
URL
回寫是指服務(wù)器在發(fā)送給瀏覽器頁面的所有鏈接中都攜帶JSESSIONID
的參數(shù)十气,這樣客戶端點(diǎn)擊任何一個(gè)鏈接都會(huì)把JSESSIONID
帶會(huì)服務(wù)器。如果直接在瀏覽器輸入服務(wù)端資源的url
來請(qǐng)求該資源春霍,那么Session
是匹配不到的桦踊。
Tomcat
對(duì)Session
的實(shí)現(xiàn),是一開始同時(shí)使用Cookie
和URL
回寫機(jī)制终畅,如果發(fā)現(xiàn)客戶端支持Cookie
,就繼續(xù)使用Cookie
竟闪,停止使用URL
回寫离福。如果發(fā)現(xiàn)Cookie
被禁用,就一直使用URL
回寫炼蛤。jsp
開發(fā)處理到Session
的時(shí)候妖爷,對(duì)頁面中的鏈接記得使用response.encodeURL()
。
Cookie和Session有以下明顯的不同點(diǎn):
- Cookie將狀態(tài)保存在客戶端理朋,Session將狀態(tài)保存在服務(wù)器端絮识;
- Cookies是服務(wù)器在本地機(jī)器上存儲(chǔ)的小段文本并隨每一個(gè)請(qǐng)求發(fā)送至同一個(gè)服務(wù)器。Cookie最早在RFC2109中實(shí)現(xiàn)嗽上,后續(xù)RFC2965做了增強(qiáng)次舌。網(wǎng)絡(luò)服務(wù)器用HTTP頭向客戶端發(fā)送cookies,在客戶終端兽愤,瀏覽器解析這些cookies并將它們保存為一個(gè)本地文件彼念,它會(huì)自動(dòng)將同一服務(wù)器的任何請(qǐng)求縛上這些cookies。Session并沒有在HTTP的協(xié)議中定義浅萧;
- Session是針對(duì)每一個(gè)用戶的逐沙,變量的值保存在服務(wù)器上,用一個(gè)sessionID來區(qū)分是哪個(gè)用戶session變量,這個(gè)值是通過用戶的瀏覽器在訪問的時(shí)候返回給服務(wù)器洼畅,當(dāng)客戶禁用cookie時(shí)吩案,這個(gè)值也可能設(shè)置為由get來返回給服務(wù)器;
- 就安全性來說:當(dāng)你訪問一個(gè)使用session 的站點(diǎn)帝簇,同時(shí)在自己機(jī)子上建立一個(gè)cookie徘郭,建議在服務(wù)器端的SESSION機(jī)制更安全些靠益。因?yàn)樗粫?huì)任意讀取客戶存儲(chǔ)的信息。
7.3崎岂、通過表單變量保持狀態(tài)
除了Cookies之外捆毫,還可以使用表單變量來保持狀態(tài),比如Asp.net就通過一個(gè)叫ViewState的Input=“hidden”的框來保持狀態(tài),比如:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMjA0OTM4MTAwNGRkXUfhlDv1Cs7/qhBlyZROCzlvf5U=" />
這個(gè)原理和Cookies
大同小異冲甘,只是每次請(qǐng)求和響應(yīng)所附帶的信息變成了表單變量绩卤。
7.4、通過QueryString保持狀態(tài)
QueryString通過將信息保存在所請(qǐng)求地址的末尾來向服務(wù)器傳送信息江醇,通常和表單結(jié)合使用濒憋,一個(gè)典型的QueryString比如:www.xxx.com/xxx.aspx?var1=value&var2=value2
八、使用telnet進(jìn)行http測試
在Windows下陶夜,可使用命令窗口進(jìn)行http簡單測試凛驮。輸入cmd進(jìn)入命令窗口,在命令行鍵入如下命令后按回車:
telnet www.baidu.com 80
而后在窗口中按下"Ctrl+]"后按回車可讓返回結(jié)果回顯条辟。
接著開始發(fā)請(qǐng)求消息黔夭,例如發(fā)送如下請(qǐng)求消息請(qǐng)求baidu的首頁消息,使用的HTTP協(xié)議為HTTP/1.1:
GET /index.html HTTP/1.1
注意:copy如上的消息到命令窗口后需要按兩個(gè)回車換行才能得到響應(yīng)的消息羽嫡,第一個(gè)回車換行是在命令后鍵入回車換行本姥,是HTTP協(xié)議要求的。第二個(gè)是確認(rèn)輸入杭棵,發(fā)送請(qǐng)求婚惫。
可看到,當(dāng)采用HTTP/1.1時(shí)魂爪,連接不是在請(qǐng)求結(jié)束后就斷開的先舷。若采用HTTP1.0,在命令窗口鍵入:
GET /index.html HTTP/1.0
此時(shí)可以看到請(qǐng)求結(jié)束之后馬上斷開滓侍。
讀者還可以嘗試在使用GET或POST等時(shí)蒋川,帶上頭域信息,例如鍵入如下信息:
GET /index.html HTTP/1.1
connection: close
Host: www.baidu.com
九撩笆、URL詳解
URL(Uniform Resource Locator) 地址用于描述一個(gè)網(wǎng)絡(luò)上的資源尔破, 基本格式如下
schema://host[:port#]/path/.../[;url-params][?query-string][#anchor]
scheme 指定低層使用的協(xié)議(例如:http, https, ftp)
host HTTP服務(wù)器的IP地址或者域名
port# HTTP服務(wù)器的默認(rèn)端口是80,這種情況下端口號(hào)可以省略浇衬。如果使用了別的端口懒构,必須指明,例如 http://www.cnblogs.com:8080/
path 訪問資源的路徑
url-params
query-string 發(fā)送給http服務(wù)器的數(shù)據(jù)
anchor- 錨
URL 的一個(gè)例子:
http://www.mywebsite.com/sj/test;id=8079?name=sviergn&x=true#stuff
Schema: http
host: www.mywebsite.com
path: /sj/test
URL params: id=8079
Query String: name=sviergn&x=true
Anchor: stuff
十耘擂、緩存的實(shí)現(xiàn)原理
WEB緩存(cache)位于Web服務(wù)器和客戶端之間胆剧。
緩存會(huì)根據(jù)請(qǐng)求保存輸出內(nèi)容的副本,例如html頁面,圖片秩霍,文件篙悯,當(dāng)下一個(gè)請(qǐng)求來到的時(shí)候:如果是相同的URL,緩存直接使用副本響應(yīng)訪問請(qǐng)求铃绒,而不是向源服務(wù)器再次發(fā)送請(qǐng)求鸽照。
HTTP協(xié)議定義了相關(guān)的消息頭來使WEB緩存盡可能好的工作。
10.1颠悬、緩存的優(yōu)點(diǎn)
減少相應(yīng)延遲:因?yàn)檎?qǐng)求從緩存服務(wù)器(離客戶端更近)而不是源服務(wù)器被相應(yīng)矮燎,這個(gè)過程耗時(shí)更少,讓web服務(wù)器看上去相應(yīng)更快赔癌。
減少網(wǎng)絡(luò)帶寬消耗:當(dāng)副本被重用時(shí)會(huì)減低客戶端的帶寬消耗诞外;客戶可以節(jié)省帶寬費(fèi)用,控制帶寬的需求的增長并更易于管理灾票。
10.2峡谊、客戶端緩存生效的常見流程
服務(wù)器收到請(qǐng)求時(shí),會(huì)在200OK中回送該資源的Last-Modified和ETag頭刊苍,客戶端將該資源保存在cache中既们,并記錄這兩個(gè)屬性。當(dāng)客戶端需要發(fā)送相同的請(qǐng)求時(shí)正什,會(huì)在請(qǐng)求中攜帶If-Modified-Since和If-None-Match兩個(gè)頭啥纸。兩個(gè)頭的值分別是響應(yīng)中Last-Modified和ETag頭的值。服務(wù)器通過這兩個(gè)頭判斷本地資源未發(fā)生變化埠忘,客戶端不需要重新下載,返回304響應(yīng)馒索。
10.3莹妒、Web緩存機(jī)制
HTTP/1.1中緩存的目的是為了在很多情況下減少發(fā)送請(qǐng)求,同時(shí)在許多情況下可以不需要發(fā)送完整響應(yīng)绰上。前者減少了網(wǎng)絡(luò)回路的數(shù)量旨怠;HTTP利用一個(gè)“過期(expiration)”機(jī)制來為此目的。后者減少了網(wǎng)絡(luò)應(yīng)用的帶寬蜈块;HTTP用“驗(yàn)證(validation)”機(jī)制來為此目的鉴腻。
HTTP定義了3種緩存機(jī)制:
- Freshness:允許一個(gè)回應(yīng)消息可以在源服務(wù)器不被重新檢查,并且可以由服務(wù)器和客戶端來控制百揭。例如爽哎,Expires回應(yīng)頭給了一個(gè)文檔不可用的時(shí)間。Cache-Control中的max-age標(biāo)識(shí)指明了緩存的最長時(shí)間器一;
- Validation:用來檢查以一個(gè)緩存的回應(yīng)是否仍然可用课锌。例如,如果一個(gè)回應(yīng)有一個(gè)Last-Modified回應(yīng)頭,緩存能夠使用If-Modified-Since來判斷是否已改變渺贤,以便判斷根據(jù)情況發(fā)送請(qǐng)求雏胃;
- Invalidation:在另一個(gè)請(qǐng)求通過緩存的時(shí)候,常常有一個(gè)副作用志鞍。例如瞭亮,如果一個(gè)URL關(guān)聯(lián)到一個(gè)緩存回應(yīng),但是其后跟著POST固棚、PUT和DELETE的請(qǐng)求的話统翩,緩存就會(huì)過期。
十一玻孟、HTTP應(yīng)用
11.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)的資源范圍匣掸;
在連接斷開重連時(shí)趟紊,客戶端只請(qǐng)求該資源未下載的部分,而不是重新請(qǐng)求整個(gè)資源碰酝,來實(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é)铛嘱;
客戶端通過并發(fā)的請(qǐng)求相同資源的不同片段,來實(shí)現(xiàn)對(duì)某個(gè)資源的并發(fā)分塊下載袭厂。從而達(dá)到快速下載的目的墨吓。目前流行的FlashGet和迅雷基本都是這個(gè)原理。
11.2纹磺、多線程下載的原理
下載工具開啟多個(gè)發(fā)出HTTP請(qǐng)求的線程帖烘;
每個(gè)http請(qǐng)求只請(qǐng)求資源文件的一部分:Content-Range: bytes 20000-40000/47000;
合并每個(gè)線程下載的文件橄杨。
11.3秘症、http代理
http代理服務(wù)器
代理服務(wù)器英文全稱是Proxy Server,其功能就是代理網(wǎng)絡(luò)用戶去取得網(wǎng)絡(luò)信息式矫。形象的說:它是網(wǎng)絡(luò)信息的中轉(zhuǎn)站乡摹。
代理服務(wù)器是介于瀏覽器和Web服務(wù)器之間的一臺(tái)服務(wù)器,有了它之后采转,瀏覽器不是直接到Web服務(wù)器去取回網(wǎng)頁而是向代理服務(wù)器發(fā)出請(qǐng)求趟卸,Request信號(hào)會(huì)先送到代理服務(wù)器,由代理服務(wù)器來取回瀏覽器所需要的信息并傳送給你的瀏覽器。
而且锄列,大部分代理服務(wù)器都具有緩沖的功能图云,就好象一個(gè)大的Cache,它有很大的存儲(chǔ)空間邻邮,它不斷將新取得數(shù)據(jù)儲(chǔ)存到它本機(jī)的存儲(chǔ)器上竣况,如果瀏覽器所請(qǐng)求的數(shù)據(jù)在它本機(jī)的存儲(chǔ)器上已經(jīng)存在而且是最新的,那么它就不重新從Web服務(wù)器取數(shù)據(jù)筒严,而直接將存儲(chǔ)器上的數(shù)據(jù)傳送給用戶的瀏覽器丹泉,這樣就能顯著提高瀏覽速度和效率。更重要的是:Proxy Server(代理服務(wù)器)是Internet鏈路級(jí)網(wǎng)關(guān)所提供的一種重要的安全功能鸭蛙,它的工作主要在開放系統(tǒng)互聯(lián)(OSI)模型的對(duì)話層摹恨。
http代理服務(wù)器的主要功能:
- 突破自身IP訪問限制,訪問國外站點(diǎn)娶视。如:教育網(wǎng)晒哄、169網(wǎng)等網(wǎng)絡(luò)用戶可以通過代理訪問國外網(wǎng)站;
- 訪問一些單位或團(tuán)體內(nèi)部資源肪获,如某大學(xué)FTP(前提是該代理地址在該資源的允許訪問范圍之內(nèi))寝凌,使用教育網(wǎng)內(nèi)地址段免費(fèi)代理服務(wù)器,就可以用于對(duì)教育 網(wǎng)開放的各類FTP下載上傳孝赫,以及各類資料查詢共享等服務(wù)较木;
- 突破中國電信的IP封鎖:中國電信用戶有很多網(wǎng)站是被限制訪問的,這種限制是人為的青柄,不同Serve對(duì)地址的封鎖是不同的伐债。所以不能訪問時(shí)可以換一個(gè)國外的代理服務(wù)器試試;
- 提高訪問速度:通常代理服務(wù)器都設(shè)置一個(gè)較大的硬盤緩沖區(qū)致开,當(dāng)有外界的信息通過時(shí)峰锁,同時(shí)也將其保存到緩沖區(qū)中,當(dāng)其他用戶再訪問相同的信息時(shí)喇喉,則直接由緩沖區(qū)中取出信息祖今,傳給用戶校坑,以提高訪問速度拣技;
- 隱藏真實(shí)IP:上網(wǎng)者也可以通過這種方法隱藏自己的IP,免受攻擊耍目。
對(duì)于客戶端瀏覽器而言膏斤,http代理服務(wù)器相當(dāng)于服務(wù)器。
而對(duì)于Web服務(wù)器而言邪驮,http代理服務(wù)器又擔(dān)當(dāng)了客戶端的角色莫辨。
11.4、虛擬主機(jī)
虛擬主機(jī)
:是在網(wǎng)絡(luò)服務(wù)器上劃分出一定的磁盤空間供用戶放置站點(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ú)立的,并由用戶自行管理弥喉。但一臺(tái)服務(wù)器主機(jī)只能夠支持一定數(shù)量的虛擬主機(jī)郁竟,當(dāng)超過這個(gè)數(shù)量時(shí),用戶將會(huì)感到性能急劇下降由境。
虛擬主機(jī)的實(shí)現(xiàn)原理:
虛擬主機(jī)是用同一個(gè)WEB服務(wù)器棚亩,為不同域名網(wǎng)站提供服務(wù)的技術(shù)。Apache藻肄、Tomcat等均可通過配置實(shí)現(xiàn)這個(gè)功能蔑舞。
相關(guān)的HTTP消息頭:Host。
例如:Host: www.baidu.com
客戶端發(fā)送HTTP請(qǐng)求的時(shí)候嘹屯,會(huì)攜帶Host頭攻询,Host頭記錄的是客戶端輸入的域名。這樣服務(wù)器可以根據(jù)Host頭確認(rèn)客戶要訪問的是哪一個(gè)域名州弟。
十二钧栖、HTTP認(rèn)證方式
HTTP請(qǐng)求報(bào)頭: Authorization
HTTP響應(yīng)報(bào)頭: WWW-Authenticate
HTTP認(rèn)證是基于質(zhì)詢/回應(yīng)(challenge/response)的認(rèn)證模式。
12.1 基本認(rèn)證 basic authentication(HTTP1.0提出的認(rèn)證方法)
基本認(rèn)證是一種用來允許Web瀏覽器或其他客戶端程序在請(qǐng)求時(shí)提供用戶名和口令形式的身份憑證的一種登錄驗(yàn)證方式婆翔。
把 "用戶名+冒號(hào)+密碼"用BASE64
算法加密后的字符串放在http request 中的header Authorization中發(fā)送給服務(wù)端拯杠。
客戶端對(duì)于每一個(gè)realm,通過提供用戶名和密碼來進(jìn)行認(rèn)證的方式啃奴。
包含密碼的明文傳遞潭陪。
當(dāng)瀏覽器訪問使用基本認(rèn)證的網(wǎng)站的時(shí)候, 瀏覽器會(huì)提示你輸入用戶名和密碼最蕾,如下圖:
假如用戶名密碼錯(cuò)誤的話依溯,服務(wù)器會(huì)返回401,如下圖:
基本認(rèn)證步驟:
- 客戶端訪問一個(gè)受http基本認(rèn)證保護(hù)的資源瘟则。
- 服務(wù)器返回401狀態(tài)黎炉,要求客戶端提供用戶名和密碼進(jìn)行認(rèn)證。(驗(yàn)證失敗的時(shí)候醋拧,響應(yīng)頭會(huì)加上WWW-Authenticate: Basic realm="請(qǐng)求域"慷嗜。)
401 Unauthorized
WWW-Authenticate: Basic realm="WallyWorld" - 客戶端將輸入的用戶名密碼用Base64進(jìn)行編碼后淀弹,采用非加密的明文方式傳送給服務(wù)器。
Authorization: Basic xxxxxxxxxx. - 服務(wù)器將Authorization頭中的用戶名密碼解碼并取出庆械,進(jìn)行驗(yàn)證薇溃,如果認(rèn)證成功,則返回相應(yīng)的資源缭乘。如果認(rèn)證失敗痊焊,則仍返回401狀態(tài),要求重新進(jìn)行認(rèn)證忿峻。
特記事項(xiàng):
- Http是無狀態(tài)的薄啥,同一個(gè)客戶端對(duì)同一個(gè)realm內(nèi)資源的每一個(gè)訪問會(huì)被要求進(jìn)行認(rèn)證。
- 客戶端通常會(huì)緩存用戶名和密碼逛尚,并和authentication realm一起保存垄惧,所以,一般不需要你重新輸入用戶名和密碼绰寞。
- 以非加密的明文方式傳輸到逊,雖然轉(zhuǎn)換成了不易被人直接識(shí)別的字符串,但是無法防止用戶名密碼被惡意盜用滤钱。雖然用肉眼看不出來觉壶,但用程序很容易解密。
優(yōu)點(diǎn):
基本認(rèn)證的一個(gè)優(yōu)點(diǎn)是基本上所有流行的網(wǎng)頁瀏覽器都支持基本認(rèn)證件缸⊥校基本認(rèn)證很少在可公開訪問的互聯(lián)網(wǎng)網(wǎng)站上使用,有時(shí)候會(huì)在小的私有系統(tǒng)中使用(如路由器
網(wǎng)頁管理接口)他炊。后來的機(jī)制HTTP摘要認(rèn)證是為替代基本認(rèn)證而開發(fā)的争剿,允許密鑰以相對(duì)安全的方式在不安全的通道上傳輸。
程序員和系統(tǒng)管理員有時(shí)會(huì)在可信網(wǎng)絡(luò)環(huán)境中使用基本認(rèn)證痊末,使用Telnet或其他明文網(wǎng)絡(luò)協(xié)議工具手動(dòng)地測試Web服務(wù)器蚕苇。這是一個(gè)麻煩的過程,但是網(wǎng)絡(luò)上傳輸?shù)?br> 內(nèi)容是人可讀的凿叠,以便進(jìn)行診斷涩笤。
缺點(diǎn):
雖然基本認(rèn)證非常容易實(shí)現(xiàn),但該方案建立在以下的假設(shè)的基礎(chǔ)上盒件,即:客戶端和服務(wù)器主機(jī)之間的連接是安全可信的蹬碧。特別是,如果沒有使用SSL/TLS這樣的傳輸
層安全的協(xié)議履恩,那么以明文傳輸?shù)拿荑€和口令很容易被攔截锰茉。該方案也同樣沒有對(duì)服務(wù)器返回的信息提供保護(hù)呢蔫。
現(xiàn)存的瀏覽器保存認(rèn)證信息直到標(biāo)簽頁或?yàn)g覽器被關(guān)閉切心,或者用戶清除歷史記錄飒筑。HTTP沒有為服務(wù)器提供一種方法指示客戶端丟棄這些被緩存的密鑰。這意味著服務(wù)
器端在用戶不關(guān)閉瀏覽器的情況下绽昏,并沒有一種有效的方法來讓用戶登出协屡。
一個(gè)例子:
這一個(gè)典型的HTTP客戶端和HTTP服務(wù)器的對(duì)話,服務(wù)器安裝在同一臺(tái)計(jì)算機(jī)上(localhost)全谤,包含以下步驟:
客戶端請(qǐng)求一個(gè)需要身份認(rèn)證的頁面肤晓,但是沒有提供用戶名和口令。這通常是用戶在地址欄輸入一個(gè)URL认然,或是打開了一個(gè)指向該頁面的鏈接补憾。服務(wù)端響應(yīng)一個(gè)401應(yīng)
答碼,并提供一個(gè)認(rèn)證域卷员。接到應(yīng)答后盈匾,客戶端顯示該認(rèn)證域(通常是所訪問的計(jì)算機(jī)或系統(tǒng)的描述)給用戶并提示輸入用戶名和口令。此時(shí)用戶可以選擇確定或取
消毕骡。用戶輸入了用戶名和口令后削饵,客戶端軟件會(huì)在原先的請(qǐng)求上增加認(rèn)證消息頭(值是base64encode(username+":"+password)),然后重新發(fā)送再次嘗試未巫。
在本例中窿撬,服務(wù)器接受了該認(rèn)證屏幕并返回了頁面。如果用戶憑據(jù)非法或無效叙凡,服務(wù)器可能再次返回401應(yīng)答碼劈伴,客戶端可以再次提示用戶輸入口令。
注意:客戶端有可能不需要用戶交互握爷,在第一次請(qǐng)求中就發(fā)送認(rèn)證消息頭宰啦。
客戶端請(qǐng)求(沒有認(rèn)證信息):
GET /private/index.html HTTP/1.0
Host: localhost
(跟隨一個(gè)換行,以回車(CR)加換行(LF)的形式)
服務(wù)端應(yīng)答:
HTTP/1.0 401 Authorization Required
Server: HTTPd/1.0
Date: Sat, 27 Nov 2004 10:18:15 GMT
WWW-Authenticate: Basic realm="Secure Area"
Content-Type: text/html
Content-Length: 311
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML>
<HEAD>
<TITLE>Error</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
</HEAD>
<BODY><H1>401 Unauthorized.</H1></BODY>
</HTML>
客戶端的請(qǐng)求(用戶名“"Aladdin”饼拍,口令, password “open sesame”):
GET /private/index.html HTTP/1.0
Host: localhost
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
(跟隨一個(gè)空行赡模,如上所述)
服務(wù)端的應(yīng)答:
HTTP/1.0 200 OK
Server: HTTPd/1.0
Date: Sat, 27 Nov 2004 10:19:07 GMT
Content-Type: text/html
Content-Length: 10476
(跟隨一個(gè)空行,隨后是需憑據(jù)頁的HTML文本)师抄。
HTTP OAuth認(rèn)證
OAuth對(duì)于Http來說漓柑,就是放在Authorization header中的不是用戶名密碼, 而是一個(gè)token叨吮。微軟的Skydrive就是使用這樣的方式
12.2辆布、摘要認(rèn)證 digest authentication(HTTP1.1提出的基本認(rèn)證的替代方法)
這個(gè)認(rèn)證可以看做是基本認(rèn)證的增強(qiáng)版本,不包含密碼的明文傳遞茶鉴。引入了一系列安全增強(qiáng)的選項(xiàng)锋玲;“保護(hù)質(zhì)量”(qop)、隨機(jī)數(shù)計(jì)數(shù)器由客戶端增加涵叮、以及客戶生成的隨機(jī)數(shù)惭蹂。
在HTTP摘要認(rèn)證中使用 MD5 加密是為了達(dá)成"不可逆的"伞插,也就是說,當(dāng)輸出已知的時(shí)候盾碗,確定原始的輸入應(yīng)該是相當(dāng)困難的媚污。如果密碼本身太過簡單,也許可以
通過嘗試所有可能的輸入來找到對(duì)應(yīng)的輸出(窮舉攻擊)廷雅,甚至可以通過字典或者適當(dāng)?shù)牟檎冶砑涌觳檎宜俣取?/p>
示例及說明
下面的例子僅僅涵蓋了“auth”保護(hù)質(zhì)量的代碼耗美,因?yàn)樵谧珜懫陂g,所知道的只有Opera和Konqueror網(wǎng)頁瀏覽器支持“auth-int”(帶完整性保護(hù)的認(rèn)證)航缀。
典型的認(rèn)證過程包括如下步驟:
客戶端請(qǐng)求一個(gè)需要認(rèn)證的頁面商架,但是不提供用戶名和密碼。通常這是由于用戶簡單的輸入了一個(gè)地址或者在頁面中點(diǎn)擊了某個(gè)超鏈接芥玉。
服務(wù)器返回401 "Unauthorized" 響應(yīng)代碼甸私,并提供認(rèn)證域(realm),以及一個(gè)隨機(jī)生成的飞傀、只使用一次的數(shù)值皇型,稱為密碼隨機(jī)數(shù) nonce。
此時(shí)砸烦,瀏覽器會(huì)向用戶提示認(rèn)證域(realm)(通常是所訪問的計(jì)算機(jī)或系統(tǒng)的描述)弃鸦,并且提示用戶名和密碼。用戶此時(shí)可以選擇取消幢痘。
一旦提供了用戶名和密碼唬格,客戶端會(huì)重新發(fā)送同樣的請(qǐng)求,但是添加了一個(gè)認(rèn)證頭包括了響應(yīng)代碼颜说。
注意:客戶端可能已經(jīng)擁有了用戶名和密碼购岗,因此不需要提示用戶,比如以前存儲(chǔ)在瀏覽器里的门粪。
客戶端請(qǐng)求 (無認(rèn)證):
GET /dir/index.html HTTP/1.0
Host: localhost
(跟隨一個(gè)新行喊积,形式為一個(gè)回車再跟一個(gè)換行)
服務(wù)器響應(yīng):
HTTP/1.0 401 Unauthorized
Server: HTTPd/0.9
Date: Sun, 10 Apr 2005 20:26:47 GMT
WWW-Authenticate: Digest realm="testrealm@host.com", //認(rèn)證域
qop="auth,auth-int", //保護(hù)質(zhì)量
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", //服務(wù)器密碼隨機(jī)數(shù)
opaque="5ccc069c403ebaf9f0171e9517f40e41"
Content-Type: text/html
Content-Length: 311
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML>
<HEAD>
<TITLE>Error</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
</HEAD>
<BODY><H1>401 Unauthorized.</H1></BODY>
</HTML>
客戶端請(qǐng)求 (用戶名 "Mufasa", 密碼 "Circle Of Life"):
GET /dir/index.html HTTP/1.0
Host: localhost
Authorization: Digest username="Mufasa",
realm="testrealm@host.com",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
uri="/dir/index.html",
qop=auth,
nc=00000001, //請(qǐng)求計(jì)數(shù)
cnonce="0a4f113b", //客戶端密碼隨機(jī)數(shù)
response="6629fae49393a05397450978507c4ef1",
opaque="5ccc069c403ebaf9f0171e9517f40e41"
(跟隨一個(gè)新行,形式如前所述)玄妈。
服務(wù)器響應(yīng):
HTTP/1.0 200 OK
Server: HTTPd/0.9
Date: Sun, 10 Apr 2005 20:27:03 GMT
Content-Type: text/html
Content-Length: 7984
(隨后是一個(gè)空行乾吻,然后是所請(qǐng)求受限制的HTML頁面)
response 值由三步計(jì)算而成。當(dāng)多個(gè)數(shù)值合并的時(shí)候拟蜻,使用冒號(hào)作為分割符:
- 對(duì)用戶名绎签、認(rèn)證域(realm)以及密碼的合并值計(jì)算 MD5 哈希值,結(jié)果稱為 HA1酝锅。
- 對(duì)HTTP方法以及URI的摘要的合并值計(jì)算 MD5 哈希值诡必,例如,"GET" 和 "/dir/index.html"搔扁,結(jié)果稱為 HA2。
- 對(duì)HA1、服務(wù)器密碼隨機(jī)數(shù)(nonce)铁坎、請(qǐng)求計(jì)數(shù)(nc)、客戶端密碼隨機(jī)數(shù)(cnonce)、保護(hù)質(zhì)量(qop)以及 HA2 的合并值計(jì)算 MD5 哈希值场绿。結(jié)果即為客戶端提供的
response
值剖效。
因?yàn)榉?wù)器擁有與客戶端同樣的信息焰盗,因此服務(wù)器可以進(jìn)行同樣的計(jì)算熬拒,以驗(yàn)證客戶端提交的 response 值的正確性。在上面給出的例子中,結(jié)果是如下計(jì)算的回懦。
(MD5()表示用于計(jì)算MD5哈希值的函數(shù);“\”表示接下一行客燕;引號(hào)并不參與計(jì)算)
HA1 = MD5( "Mufasa:testrealm@host.com:Circle Of Life" )
= 939e7578ed9e3c518a452acee763bce9
HA2 = MD5( "GET:/dir/index.html" )
= 39aff3a2bab6126f332b942af96d3366
Response = MD5( "939e7578ed9e3c518a452acee763bce9:\
dcd98b7102dd2f0e8b11d0f600bfb0c093:\
00000001:0a4f113b:auth:\
39aff3a2bab6126f332b942af96d3366" )
= 6629fae49393a05397450978507c4ef1
此時(shí)客戶端可以提交一個(gè)新的請(qǐng)求,重復(fù)使用服務(wù)器密碼隨機(jī)數(shù)(nonce)(服務(wù)器僅在每次“401”響應(yīng)后發(fā)行新的nonce)患雇,但是提供新的客戶端密碼隨機(jī)數(shù)(cnonce)。在后續(xù)的請(qǐng)求中继阻,十六進(jìn)制請(qǐng)求計(jì)數(shù)器(nc)必須比前一次使用的時(shí)候要大睹簇,否則攻擊者可以簡單的使用同樣的認(rèn)證信息重放老的請(qǐng)求搪锣。由服務(wù)器來確保在每個(gè)發(fā)出的密碼隨機(jī)數(shù)nonce時(shí)堵幽,計(jì)數(shù)器是在增加的谐檀,并拒絕掉任何錯(cuò)誤的請(qǐng)求惫撰。顯然,改變HTTP方法和/或計(jì)數(shù)器數(shù)值都會(huì)導(dǎo)致不同的 response值苍蔬。
服務(wù)器應(yīng)當(dāng)記住最近所生成的服務(wù)器密碼隨機(jī)數(shù)nonce的值俺猿。也可以在發(fā)行每一個(gè)密碼隨機(jī)數(shù)nonce后,記住過一段時(shí)間讓它們過期格仲。如果客戶端使用了一個(gè)過期的值押袍,服務(wù)器應(yīng)該響應(yīng)“401”狀態(tài)號(hào),并且在認(rèn)證頭中添加stale=TRUE凯肋,表明客戶端應(yīng)當(dāng)使用新提供的服務(wù)器密碼隨機(jī)數(shù)nonce重發(fā)請(qǐng)求伯病,而不必提示用戶其它用戶名和口令。
服務(wù)器不需要保存任何過期的密碼隨機(jī)數(shù),它可以簡單的認(rèn)為所有不認(rèn)識(shí)的數(shù)值都是過期的午笛。服務(wù)器也可以只允許每一個(gè)服務(wù)器密碼隨機(jī)數(shù)nonce使用一次惭蟋,當(dāng)然,這樣就會(huì)迫使客戶端在發(fā)送每個(gè)請(qǐng)求的時(shí)候重復(fù)認(rèn)證過程药磺。需要注意的是告组,在生成后立刻過期服務(wù)器密碼隨機(jī)數(shù)nonce是不行的,因?yàn)榭蛻舳藢]有任何機(jī)會(huì)來使用這個(gè)nonce癌佩。
PS:以上只介紹了兩種比較基礎(chǔ)的木缝,還有其他的一些認(rèn)證方式就不在這里一一說明了。
十三围辙、HTTPS傳輸協(xié)議原理
HTTPS(全稱:Hypertext Transfer Protocol over Secure Socket Layer)我碟,是以安全為目標(biāo)的HTTP通道,簡單講是HTTP的安全版姚建。即HTTP下加入SSL層矫俺,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容請(qǐng)看SSL掸冤。
13.1厘托、兩種基本的加解密算法類型
對(duì)稱加密:密鑰只有一個(gè),加密解密為同一個(gè)密碼稿湿,且加解密速度快铅匹,典型的對(duì)稱加密算法有DES、AES等饺藤。
非對(duì)稱加密:密鑰成對(duì)出現(xiàn)(且根據(jù)公鑰無法推知私鑰包斑,根據(jù)私鑰也無法推知公鑰),加密解密使用不同密鑰(公鑰加密需要私鑰解密涕俗,私鑰加密需要公鑰解密)罗丰,相對(duì)對(duì)稱加密速度較慢,典型的非對(duì)稱加密算法有RSA咽袜、DSA等丸卷。
13.2、HTTPS通信過程
13.3询刹、HTTPS通信的優(yōu)點(diǎn)
客戶端產(chǎn)生的密鑰只有客戶端和服務(wù)器端能得到谜嫉;
加密的數(shù)據(jù)只有客戶端和服務(wù)器端才能得到明文;
客戶端到服務(wù)端的通信是安全的凹联。
十四沐兰、http的狀態(tài)響應(yīng)碼
**(信息類):表示接收到請(qǐng)求并且繼續(xù)處理
100——客戶必須繼續(xù)發(fā)出請(qǐng)求
101——客戶要求服務(wù)器根據(jù)請(qǐng)求轉(zhuǎn)換HTTP協(xié)議版本
**(響應(yīng)成功):表示動(dòng)作被成功接收、理解和接受
200——表明該請(qǐng)求被成功地完成蔽挠,所請(qǐng)求的資源發(fā)送回客戶端
201——提示知道新文件的URL
202——接受和處理住闯、但處理未完成
203——返回信息不確定或不完整
204——請(qǐng)求收到瓜浸,但返回信息為空
205——服務(wù)器完成了請(qǐng)求,用戶代理必須復(fù)位當(dāng)前已經(jīng)瀏覽過的文件
206——服務(wù)器已經(jīng)完成了部分用戶的GET請(qǐng)求
**(重定向類):為了完成指定的動(dòng)作比原,必須接受進(jìn)一步處理
300——請(qǐng)求的資源可在多處得到
301——本網(wǎng)頁被永久性轉(zhuǎn)移到另一個(gè)URL
302——請(qǐng)求的網(wǎng)頁被轉(zhuǎn)移到一個(gè)新的地址插佛,但客戶訪問仍繼續(xù)通過原始URL地址,重定向量窘,新的URL會(huì)在response中的Location中返回雇寇,瀏覽器將會(huì)使用新的URL發(fā)出新的Request。
303——建議客戶訪問其他URL或訪問方式
304——自從上次請(qǐng)求后蚌铜,請(qǐng)求的網(wǎng)頁未修改過锨侯,服務(wù)器返回此響應(yīng)時(shí),不會(huì)返回網(wǎng)頁內(nèi)容冬殃,代表上次的文檔已經(jīng)被緩存了囚痴,還可以繼續(xù)使用
305——請(qǐng)求的資源必須從服務(wù)器指定的地址得到
306——前一版本HTTP中使用的代碼,現(xiàn)行版本中不再使用
307——申明請(qǐng)求的資源臨時(shí)性刪除
**(客戶端錯(cuò)誤類):請(qǐng)求包含錯(cuò)誤語法或不能正確執(zhí)行
400——客戶端請(qǐng)求有語法錯(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ù)器配置問題導(dǎo)致登錄失敗
HTTP 401.3 - ACL 禁止訪問資源
HTTP 401.4 - 未授權(quán):授權(quán)被篩選器拒絕
HTTP 401.5 - 未授權(quán):ISAPI 或 CGI 授權(quán)失敗
402——保留有效ChargeTo頭響應(yīng)
403——禁止訪問,服務(wù)器收到請(qǐng)求耳璧,但是拒絕提供服務(wù)
HTTP 403.1 禁止訪問:禁止可執(zhí)行訪問
HTTP 403.2 - 禁止訪問:禁止讀訪問
HTTP 403.3 - 禁止訪問:禁止寫訪問
HTTP 403.4 - 禁止訪問:要求 SSL
HTTP 403.5 - 禁止訪問:要求 SSL 128
HTTP 403.6 - 禁止訪問:IP 地址被拒絕
HTTP 403.7 - 禁止訪問:要求客戶證書
HTTP 403.8 - 禁止訪問:禁止站點(diǎn)訪問
HTTP 403.9 - 禁止訪問:連接的用戶過多
HTTP 403.10 - 禁止訪問:配置無效
HTTP 403.11 - 禁止訪問:密碼更改
HTTP 403.12 - 禁止訪問:映射器拒絕訪問
HTTP 403.13 - 禁止訪問:客戶證書已被吊銷
HTTP 403.15 - 禁止訪問:客戶訪問許可過多
HTTP 403.16 - 禁止訪問:客戶證書不可信或者無效
HTTP 403.17 - 禁止訪問:客戶證書已經(jīng)到期或者尚未生效
404——一個(gè)404錯(cuò)誤表明可連接服務(wù)器成箫,但服務(wù)器無法取得所請(qǐng)求的網(wǎng)頁展箱,請(qǐng)求資源不存在旨枯。eg:輸入了錯(cuò)誤的URL
405——用戶在Request-Line字段定義的方法不允許
406——根據(jù)用戶發(fā)送的Accept拖,請(qǐng)求資源不可訪問
407——類似401混驰,用戶必須首先在代理服務(wù)器上得到授權(quán)
408——客戶端沒有在用戶指定的餓時(shí)間內(nèi)完成請(qǐng)求
409——對(duì)當(dāng)前資源狀態(tài)攀隔,請(qǐng)求不能完成
410——服務(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長于服務(wù)器允許的長度
415——請(qǐng)求資源不支持請(qǐng)求項(xiàng)目格式
416——請(qǐng)求中包含Range請(qǐng)求頭字段,在當(dāng)前請(qǐng)求資源范圍內(nèi)沒有range指示值栖榨,請(qǐng)求也不包含If-Range請(qǐng)求頭字段
417——服務(wù)器不滿足請(qǐng)求Expect頭字段指定的期望值昆汹,如果是代理服務(wù)器,可能是下一級(jí)服務(wù)器不能滿足請(qǐng)求長婴栽。
**(服務(wù)端錯(cuò)誤類):服務(wù)器不能正確執(zhí)行一個(gè)正確的請(qǐng)求
HTTP 500 - 服務(wù)器遇到錯(cuò)誤满粗,無法完成請(qǐng)求
HTTP 500.100 - 內(nèi)部服務(wù)器錯(cuò)誤 - ASP 錯(cuò)誤
HTTP 500-11 服務(wù)器關(guān)閉
HTTP 500-12 應(yīng)用程序重新啟動(dòng)
HTTP 500-13 - 服務(wù)器太忙
HTTP 500-14 - 應(yīng)用程序無效
HTTP 500-15 - 不允許請(qǐng)求 global.asa
Error 501 - 未實(shí)現(xiàn)
HTTP 502 - 網(wǎng)關(guān)錯(cuò)誤
HTTP 503:由于超載或停機(jī)維護(hù),服務(wù)器目前無法使用愚争,一段時(shí)間后可能恢復(fù)正常
結(jié)束語:其他協(xié)議還有:文件傳輸協(xié)議FTP映皆、電子郵件傳輸協(xié)議SMTP、域名系統(tǒng)服務(wù)DNS轰枝、網(wǎng)絡(luò)新聞傳輸協(xié)議NNTP和HTTP協(xié)議等捅彻。