超文本傳輸協(xié)議(Hypertext Transfer Protocol,簡(jiǎn)稱(chēng)HTTP)是應(yīng)用層協(xié)議。HTTP 是一種請(qǐng)求/響應(yīng)式的協(xié)議,即一個(gè)客戶(hù)端與服務(wù)器建立連接后,向服務(wù)器發(fā)送一個(gè)請(qǐng)求;服務(wù)器接到請(qǐng)求后,給予相應(yīng)的響應(yīng)信息。 HTTP 請(qǐng)求報(bào)文HTTP 請(qǐng)求報(bào)文由請(qǐng)求行、請(qǐng)求頭部、空行 和 請(qǐng)求包體 4 個(gè)部分組成,如下圖所示: 下面對(duì)請(qǐng)求報(bào)文格式進(jìn)行簡(jiǎn)單的分析: 請(qǐng)求行:請(qǐng)求行由方法字段、URL 字段 和HTTP 協(xié)議版本字段 3 個(gè)部分組成,他們之間使用空格隔開(kāi)。常用的 HTTP 請(qǐng)求方法有 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT; ● GET:當(dāng)客戶(hù)端要從服務(wù)器中讀取某個(gè)資源時(shí),使用GET 方法。GET 方法要求服務(wù)器將URL 定位的資源放在響應(yīng)報(bào)文的數(shù)據(jù)部分,回送給客戶(hù)端,即向服務(wù)器請(qǐng)求某個(gè)資源。使用GET 方法時(shí),請(qǐng)求參數(shù)和對(duì)應(yīng)的值附加在 URL 后面,利用一個(gè)問(wèn)號(hào)(“?”)代表URL 的結(jié)尾與請(qǐng)求參數(shù)的開(kāi)始,傳遞參數(shù)長(zhǎng)度受限制。例如,/index.jsp?id=100&op=bind。 ● POST:當(dāng)客戶(hù)端給服務(wù)器提供信息較多時(shí)可以使用POST 方法,POST 方法向服務(wù)器提交數(shù)據(jù),比如完成表單數(shù)據(jù)的提交,將數(shù)據(jù)提交給服務(wù)器處理。GET 一般用于獲取/查詢(xún)資源信息,POST 會(huì)附帶用戶(hù)數(shù)據(jù),一般用于更新資源信息。POST 方法將請(qǐng)求參數(shù)封裝在HTTP 請(qǐng)求數(shù)據(jù)中,以名稱(chēng)/值的形式出現(xiàn),可以傳輸大量數(shù)據(jù); 請(qǐng)求頭部:請(qǐng)求頭部由關(guān)鍵字/值對(duì)組成,每行一對(duì),關(guān)鍵字和值用英文冒號(hào)“:”分隔。請(qǐng)求頭部通知服務(wù)器有關(guān)于客戶(hù)端請(qǐng)求的信息,典型的請(qǐng)求頭有: ● User-Agent:產(chǎn)生請(qǐng)求的瀏覽器類(lèi)型; ● Accept:客戶(hù)端可識(shí)別的響應(yīng)內(nèi)容類(lèi)型列表;星號(hào) “ * ” 用于按范圍將類(lèi)型分組,用 “ */* ” 指示可接受全部類(lèi)型,用“ type/* ”指示可接受 type 類(lèi)型的所有子類(lèi)型; ● Accept-Language:客戶(hù)端可接受的自然語(yǔ)言; ● Accept-Encoding:客戶(hù)端可接受的編碼壓縮格式; ● Accept-Charset:可接受的應(yīng)答的字符集; ● Host:請(qǐng)求的主機(jī)名,允許多個(gè)域名同處一個(gè)IP 地址,即虛擬主機(jī); ● connection:連接方式(close 或 keepalive); ● Cookie:存儲(chǔ)于客戶(hù)端擴(kuò)展字段,向同一域名的服務(wù)端發(fā)送屬于該域的cookie; 空行:最后一個(gè)請(qǐng)求頭之后是一個(gè)空行,發(fā)送回車(chē)符和換行符,通知服務(wù)器以下不再有請(qǐng)求頭; 請(qǐng)求包體:請(qǐng)求包體不在 GET 方法中使用,而是在POST 方法中使用。POST 方法適用于需要客戶(hù)填寫(xiě)表單的場(chǎng)合。與請(qǐng)求包體相關(guān)的最常使用的是包體類(lèi)型 Content-Type 和包體長(zhǎng)度 Content-Length; HTTP 響應(yīng)報(bào)文HTTP 響應(yīng)報(bào)文由狀態(tài)行、響應(yīng)頭部、空行 和 響應(yīng)包體 4 個(gè)部分組成,如下圖所示: 下面對(duì)響應(yīng)報(bào)文格式進(jìn)行簡(jiǎn)單的分析: 狀態(tài)行:狀態(tài)行由 HTTP 協(xié)議版本字段、狀態(tài)碼和狀態(tài)碼的描述文本 3 個(gè)部分組成,他們之間使用空格隔開(kāi); ● 狀態(tài)碼由三位數(shù)字組成,第一位數(shù)字表示響應(yīng)的類(lèi)型,常用的狀態(tài)碼有五大類(lèi)如下所示: 1xx:表示服務(wù)器已接收了客戶(hù)端請(qǐng)求,客戶(hù)端可繼續(xù)發(fā)送請(qǐng)求; 2xx:表示服務(wù)器已成功接收到請(qǐng)求并進(jìn)行處理; 3xx:表示服務(wù)器要求客戶(hù)端重定向; 4xx:表示客戶(hù)端的請(qǐng)求有非法內(nèi)容; 5xx:表示服務(wù)器未能正常處理客戶(hù)端的請(qǐng)求而出現(xiàn)意外錯(cuò)誤; ● 狀態(tài)碼描述文本有如下取值: 200 OK:表示客戶(hù)端請(qǐng)求成功; 400 Bad Request:表示客戶(hù)端請(qǐng)求有語(yǔ)法錯(cuò)誤,不能被服務(wù)器所理解; 401 Unauthonzed:表示請(qǐng)求未經(jīng)授權(quán),該狀態(tài)代碼必須與 WWW-Authenticate 報(bào)頭域一起使用; 403 Forbidden:表示服務(wù)器收到請(qǐng)求,但是拒絕提供服務(wù),通常會(huì)在響應(yīng)正文中給出不提供服務(wù)的原因; 404 Not Found:請(qǐng)求的資源不存在,例如,輸入了錯(cuò)誤的URL; 500 Internal Server Error:表示服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤,導(dǎo)致無(wú)法完成客戶(hù)端的請(qǐng)求; 503 Service Unavailable:表示服務(wù)器當(dāng)前不能夠處理客戶(hù)端的請(qǐng)求,在一段時(shí)間之后,服務(wù)器可能會(huì)恢復(fù)正常; 響應(yīng)頭部:響應(yīng)頭可能包括: Location:Location響應(yīng)報(bào)頭域用于重定向接受者到一個(gè)新的位置。例如:客戶(hù)端所請(qǐng)求的頁(yè)面已不存在原先的位置,為了讓客戶(hù)端重定向到這個(gè)頁(yè)面新的位置,服務(wù)器端可以發(fā)回Location響應(yīng)報(bào)頭后使用重定向語(yǔ)句,讓客戶(hù)端去訪問(wèn)新的域名所對(duì)應(yīng)的服務(wù)器上的資源; Server:Server 響應(yīng)報(bào)頭域包含了服務(wù)器用來(lái)處理請(qǐng)求的軟件信息及其版本。它和 User-Agent 請(qǐng)求報(bào)頭域是相對(duì)應(yīng)的,前者發(fā)送服務(wù)器端軟件的信息,后者發(fā)送客戶(hù)端軟件(瀏覽器)和操作系統(tǒng)的信息。 Vary:指示不可緩存的請(qǐng)求頭列表; Connection:連接方式; 對(duì)于請(qǐng)求來(lái)說(shuō):close(告訴 WEB 服務(wù)器或者代理服務(wù)器,在完成本次請(qǐng)求的響應(yīng)后,斷開(kāi)連接,不等待本次連接的后續(xù)請(qǐng)求了)。keepalive(告訴WEB服務(wù)器或者代理服務(wù)器,在完成本次請(qǐng)求的響應(yīng)后,保持連接,等待本次連接的后續(xù)請(qǐng)求); 對(duì)于響應(yīng)來(lái)說(shuō):close(連接已經(jīng)關(guān)閉); keepalive(連接保持著,在等待本次連接的后續(xù)請(qǐng)求); Keep-Alive:如果瀏覽器請(qǐng)求保持連接,則該頭部表明希望WEB 服務(wù)器保持連接多長(zhǎng)時(shí)間(秒);例如:Keep-Alive:300; WWW-Authenticate:WWW-Authenticate響應(yīng)報(bào)頭域必須被包含在401 (未授權(quán)的)響應(yīng)消息中,這個(gè)報(bào)頭域和前面講到的Authorization 請(qǐng)求報(bào)頭域是相關(guān)的,當(dāng)客戶(hù)端收到 401 響應(yīng)消息,就要決定是否請(qǐng)求服務(wù)器對(duì)其進(jìn)行驗(yàn)證。如果要求服務(wù)器對(duì)其進(jìn)行驗(yàn)證,就可以發(fā)送一個(gè)包含了Authorization 報(bào)頭域的請(qǐng)求; 空行:最后一個(gè)響應(yīng)頭部之后是一個(gè)空行,發(fā)送回車(chē)符和換行符,通知服務(wù)器以下不再有響應(yīng)頭部。 響應(yīng)包體:服務(wù)器返回給客戶(hù)端的文本信息; HTTP 工作原理HTTP 協(xié)議采用請(qǐng)求/響應(yīng)模型。客戶(hù)端向服務(wù)器發(fā)送一個(gè)請(qǐng)求報(bào)文,服務(wù)器以一個(gè)狀態(tài)作為響應(yīng)。 以下是 HTTP 請(qǐng)求/響應(yīng)的步驟: ● 客戶(hù)端連接到web服務(wù)器:HTTP 客戶(hù)端與web服務(wù)器建立一個(gè) TCP 連接; ● 客戶(hù)端向服務(wù)器發(fā)起 HTTP 請(qǐng)求:通過(guò)已建立的TCP 連接,客戶(hù)端向服務(wù)器發(fā)送一個(gè)請(qǐng)求報(bào)文; ● 服務(wù)器接收 HTTP 請(qǐng)求并返回 HTTP 響應(yīng):服務(wù)器解析請(qǐng)求,定位請(qǐng)求資源,服務(wù)器將資源副本寫(xiě)到 TCP 連接,由客戶(hù)端讀取; ● 釋放 TCP 連接:若connection 模式為close,則服務(wù)器主動(dòng)關(guān)閉TCP 連接,客戶(hù)端被動(dòng)關(guān)閉連接,釋放TCP 連接;若connection 模式為keepalive,則該連接會(huì)保持一段時(shí)間,在該時(shí)間內(nèi)可以繼續(xù)接收請(qǐng)求; ● 客戶(hù)端瀏覽器解析HTML內(nèi)容:客戶(hù)端將服務(wù)器響應(yīng)的 html 文本解析并顯示; 例如:在瀏覽器地址欄鍵入U(xiǎn)RL,按下回車(chē)之后會(huì)經(jīng)歷以下流程: 1、瀏覽器向 DNS 服務(wù)器請(qǐng)求解析該 URL 中的域名所對(duì)應(yīng)的 IP 地址; 2、解析出 IP 地址后,根據(jù)該 IP 地址和默認(rèn)端口 80,和服務(wù)器建立 TCP 連接; 3、瀏覽器發(fā)出讀取文件(URL 中域名后面部分對(duì)應(yīng)的文件)的HTTP 請(qǐng)求,該請(qǐng)求報(bào)文作為 TCP 三次握手的第三個(gè)報(bào)文的數(shù)據(jù)發(fā)送給服務(wù)器; 4、服務(wù)器對(duì)瀏覽器請(qǐng)求作出響應(yīng),并把對(duì)應(yīng)的 html 文本發(fā)送給瀏覽器; 5、釋放 TCP 連接; 6、瀏覽器將該 html 文本并顯示內(nèi)容; HTTP 無(wú)狀態(tài)性HTTP 協(xié)議是無(wú)狀態(tài)的(stateless)。也就是說(shuō),同一個(gè)客戶(hù)端第二次訪問(wèn)同一個(gè)服務(wù)器上的頁(yè)面時(shí),服務(wù)器無(wú)法知道這個(gè)客戶(hù)端曾經(jīng)訪問(wèn)過(guò),服務(wù)器也無(wú)法分辨不同的客戶(hù)端。HTTP 的無(wú)狀態(tài)特性簡(jiǎn)化了服務(wù)器的設(shè)計(jì),使服務(wù)器更容易支持大量并發(fā)的HTTP 請(qǐng)求。 HTTP 持久連接HTTP1.0 使用的是非持久連接,主要缺點(diǎn)是客戶(hù)端必須為每一個(gè)待請(qǐng)求的對(duì)象建立并維護(hù)一個(gè)新的連接,即每請(qǐng)求一個(gè)文檔就要有兩倍RTT 的開(kāi)銷(xiāo)。因?yàn)橥粋€(gè)頁(yè)面可能存在多個(gè)對(duì)象,所以非持久連接可能使一個(gè)頁(yè)面的下載變得十分緩慢,而且這種短連接增加了網(wǎng)絡(luò)傳輸?shù)呢?fù)擔(dān)。HTTP1.1 使用持久連接keepalive,所謂持久連接,就是服務(wù)器在發(fā)送響應(yīng)后仍然在一段時(shí)間內(nèi)保持這條連接,允許在同一個(gè)連接中存在多次數(shù)據(jù)請(qǐng)求和響應(yīng),即在持久連接情況下,服務(wù)器在發(fā)送完響應(yīng)后并不關(guān)閉TCP 連接,而客戶(hù)端可以通過(guò)這個(gè)連接繼續(xù)請(qǐng)求其他對(duì)象。 HTTP/1.1 協(xié)議的持久連接有兩種方式: ● 非流水線方式:客戶(hù)在收到前一個(gè)響應(yīng)后才能發(fā)出下一個(gè)請(qǐng)求; ● 流水線方式:客戶(hù)在收到 HTTP 的響應(yīng)報(bào)文之前就能接著發(fā)送新的請(qǐng)求報(bào)文; 最后給出一個(gè)具體例子: Remote Address:116.57.254.104:80
Request URL:http://hr.tencent.com/
Request Method:GET
Status Code:200 OK
Request Headers
GET / HTTP/1.1
Host: hr.tencent.com
Connection: keep-alive
Accept: text/html,application/xhtml xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4
Cookie: pgv_pvi=2098703360; PHPSESSID=bc7onl0dojbsatscsfv79pds77; pgv_info=ssid=s1454606128;
pgv_pvid=926725350; ts_uid=4084753309
Response Header
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 26 Jan 2015 01:09:10 GMT
Content-Type: text/html;charset=utf-8
Content-Length: 3631
Connection: keep-alive
X-Powered-By: PHP/5.3.10
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Encoding: gzip 從請(qǐng)求報(bào)文可以知道: GET / HTTP/1.1 請(qǐng)求方法 GET 表示一個(gè)讀取請(qǐng)求,將從服務(wù)器獲得網(wǎng)頁(yè)數(shù)據(jù),/表示URL 的路徑,URL 總是以/開(kāi)頭,/就表示首頁(yè),最后的HTTP/1.1 指示采用的 HTTP 協(xié)議版本是 1.1;請(qǐng)求域名如下所示: Host: hr.tencent.com 響應(yīng)報(bào)文如下: HTTP/1.1 200 OK
Server: nginx
|
|
來(lái)自: wiborgite > 《待分類(lèi)》