日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

【Linux】HTTP響應(yīng)報(bào)文與工作原理詳解

 wiborgite 2016-05-13

超文本傳輸協(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

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多