1. HTTP 請求報(bào)文
HTTP 請求報(bào)文由請求行、請求頭部、空行 和 請求包體 4 個(gè)部分組成,如下圖所示:

請求行:
請求行由方法、URL 和HTTP 協(xié)議版本 3 個(gè)部分組成,他們之間使用空格隔開.
常用的 HTTP 請求方法有 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT(這些方法雖然是http規(guī)定的,但不一定WEB SERVER 允許)
- GET:當(dāng)客戶端要從服務(wù)器中讀取某個(gè)資源時(shí),使用GET 方法。GET 方法要求服務(wù)器將URL 定位的資源放在響應(yīng)報(bào)文的部分,回送給客戶端,即向服務(wù)器請求某個(gè)資源。使用GET 方法時(shí),請求參數(shù)和對應(yīng)的值附加在 URL 后面,利用一個(gè)問號(“?”)代表URL 的結(jié)尾與請求參數(shù)的開始,傳遞參數(shù)長度受限制。例如,/index.jsp?id=100&op=bind
- POST:當(dāng)客戶端給服務(wù)器提供信息較多時(shí)可以使用POST 方法,POST 方法向服務(wù)器提交數(shù)據(jù),比如完成表單數(shù)據(jù)的提交,將數(shù)據(jù)提交給服務(wù)器處理。POST 方法將請求參數(shù)封裝在HTTP 請求體中,以K=V的形式出現(xiàn),可以傳輸大量數(shù)據(jù);
請求頭部:
請求頭部由關(guān)鍵字/值對組成,每行一對,關(guān)鍵字和值用英文冒號“:”分隔。請求頭部通知服務(wù)器有關(guān)于客戶端請求的信息,典型的請求頭有:
● User-Agent:產(chǎn)生請求的瀏覽器類型;
● Accept:客戶端可識(shí)別的響應(yīng)內(nèi)容類型列表;星號 “ * ” 用于按范圍將類型分組,用 “ / ” 指示可接受全部類型,用“ type/* ”指示可接受 type 類型的所有子類型;
● Accept-Language:客戶端可接受的自然語言;
● Accept-Encoding:客戶端可接受的編碼壓縮格式;
● Accept-Charset:可接受的應(yīng)答的字符集;
● Host:請求的主機(jī)名,允許多個(gè)域名同處一個(gè)IP 地址,即虛擬主機(jī);
● connection:連接方式(close 或 keepalive);
● Cookie:存儲(chǔ)于客戶端擴(kuò)展字段,向同一域名的服務(wù)端發(fā)送屬于該域的cookie;
空行:最后一個(gè)請求頭之后是一個(gè)空行,發(fā)送回車符和換行符,通知服務(wù)器以下不再有請求頭;
請求包體:
請求包體不在 GET 方法中使用,而是在POST 方法中使用。POST 方法適用于需要客戶填寫表單的場合。與請求包體相關(guān)的最常使用的是包體類型 Content-Type 和包體長度 Content-Length;


2. HTTP 響應(yīng)報(bào)文
HTTP 響應(yīng)報(bào)文由狀態(tài)行、響應(yīng)頭部、空行 和 響應(yīng)包體 4 個(gè)部分組成,如下圖所示:

狀態(tài)行(響應(yīng)行):響應(yīng)行由 HTTP 協(xié)議版本字段、狀態(tài)碼和狀態(tài)碼的描述文本 3 個(gè)部分組成,他們之間使用空格隔開;
● 狀態(tài)碼由三位數(shù)字組成,第一位數(shù)字表示響應(yīng)的類型,常用的狀態(tài)碼有五大類如下所示:
1xx:表示服務(wù)器已接收了客戶端請求,客戶端可繼續(xù)發(fā)送請求;
2xx:表示服務(wù)器已成功接收到請求并進(jìn)行處理;
3xx:表示服務(wù)器要求客戶端重定向;
4xx:表示客戶端的請求有非法內(nèi)容;
5xx:表示服務(wù)器未能正常處理客戶端的請求而出現(xiàn)意外錯(cuò)誤;
● 狀態(tài)碼描述文本有如下取值:
200 OK:表示客戶端請求成功;
400 Bad Request:表示客戶端請求有語法錯(cuò)誤,不能被服務(wù)器所理解;
401 Unauthonzed:表示請求未經(jīng)授權(quán),該狀態(tài)代碼必須與 WWW-Authenticate 報(bào)頭域一起使用;
403 Forbidden:表示服務(wù)器收到請求,但是拒絕提供服務(wù),通常會(huì)在響應(yīng)正文中給出不提供服務(wù)的原因;
404 Not Found:請求的資源不存在,例如,輸入了錯(cuò)誤的URL;
500 Internal Server Error:表示服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤,導(dǎo)致無法完成客戶端的請求;
503 Service Unavailable:表示服務(wù)器當(dāng)前不能夠處理客戶端的請求,在一段時(shí)間之后,服務(wù)器可能會(huì)恢復(fù)正常;
響應(yīng)頭部:響應(yīng)頭可能包括:
Location:Location響應(yīng)報(bào)頭域用于重定向接受者到一個(gè)新的位置。例如:客戶端所請求的頁面已不存在原先的位置,為了讓客戶端重定向到這個(gè)頁面新的位置,服務(wù)器端可以發(fā)回Location響應(yīng)報(bào)頭后使用重定向語句,讓客戶端去訪問新的域名所對應(yīng)的服務(wù)器上的資源;
Server:Server 響應(yīng)報(bào)頭域包含了服務(wù)器用來處理請求的軟件信息及其版本。它和 User-Agent 請求報(bào)頭域是相對應(yīng)的,前者發(fā)送服務(wù)器端軟件的信息,后者發(fā)送客戶端軟件瀏覽器和操作系統(tǒng)的信息。
Vary:指示不可緩存的請求頭列表;
Connection:連接方式;
對于請求來說:close(告訴 WEB 服務(wù)器或者代理服務(wù)器,在完成本次請求的響應(yīng)后,斷開連接,不等待本次連接的后續(xù)請求了)。keepalive(告訴WEB服務(wù)器或者代理服務(wù)器,在完成本次請求的響應(yīng)后,保持連接,等待本次連接的后續(xù)請求);
對于響應(yīng)來說:close(連接已經(jīng)關(guān)閉); keepalive(連接保持著,在等待本次連接的后續(xù)請求); Keep-Alive:如果瀏覽器請求保持連接,則該頭部表明希望WEB 服務(wù)器保持連接多長時(shí)間(秒);例如:Keep-Alive:300;
WWW-Authenticate:WWW-Authenticate響應(yīng)報(bào)頭域必須被包含在401 (未授權(quán)的)響應(yīng)消息中,這個(gè)報(bào)頭域和前面講到的Authorization 請求報(bào)頭域是相關(guān)的,當(dāng)客戶端收到 401 響應(yīng)消息,就要決定是否請求服務(wù)器對其進(jìn)行驗(yàn)證。如果要求服務(wù)器對其進(jìn)行驗(yàn)證,就可以發(fā)送一個(gè)包含了Authorization 報(bào)頭域的請求;
空行:最后一個(gè)響應(yīng)頭部之后是一個(gè)空行,發(fā)送回車符和換行符,通知服務(wù)器以下不再有響應(yīng)頭部。
響應(yīng)包體:服務(wù)器返回給客戶端的文本信息;
3. HTTP 工作原理
HTTP 協(xié)議采用請求/響應(yīng)模型??蛻舳讼蚍?wù)器發(fā)送一個(gè)請求報(bào)文,服務(wù)器以一個(gè)狀態(tài)作為響應(yīng)。
以下是 HTTP 請求/響應(yīng)的步驟:
● 客戶端連接到web服務(wù)器:HTTP 客戶端與web服務(wù)器建立一個(gè) TCP 連接;
● 客戶端向服務(wù)器發(fā)起 HTTP 請求:通過已建立的TCP 連接,客戶端向服務(wù)器發(fā)送一個(gè)請求報(bào)文;
● 服務(wù)器接收 HTTP 請求并返回 HTTP 響應(yīng):服務(wù)器解析請求,定位請求資源,服務(wù)器將資源副本寫到 TCP 連接,由客戶端讀取;
● 釋放 TCP 連接:若connection 模式為close,則服務(wù)器主動(dòng)關(guān)閉TCP 連接,客戶端被動(dòng)關(guān)閉連接,釋放TCP 連接;若connection 模式為keepalive,則該連接會(huì)保持一段時(shí)間,在該時(shí)間內(nèi)可以繼續(xù)接收請求;
● 客戶端瀏覽器解析HTML內(nèi)容:客戶端將服務(wù)器響應(yīng)的 html 文本解析并顯示;
例如:在瀏覽器地址欄鍵入U(xiǎn)RL,按下回車之后會(huì)經(jīng)歷以下流程:
1、瀏覽器向DNS 服務(wù)器請求解析該 URL 中的域名所對應(yīng)的 IP 地址;
2、解析出 IP 地址后,根據(jù)該 IP 地址和默認(rèn)端口 80,和服務(wù)器建立 TCP 連接;
3、瀏覽器發(fā)出讀取文件(URL 中域名后面部分對應(yīng)的文件)的HTTP 請求,該請求報(bào)文作為 TCP 三次握手的第三個(gè)報(bào)文的數(shù)據(jù)發(fā)送給服務(wù)器;
4、服務(wù)器對瀏覽器請求作出響應(yīng),并把對應(yīng)的 html 文本發(fā)送給瀏覽器;
5、釋放 TCP 連接;
6、瀏覽器將該 html 文本并顯示內(nèi)容;