HTTP 是一種請求/響應式的協議,即一個客戶端與服務器建立連接后,向服務器發送一個請求;服務器接到請求后,給予相應的響應信息。
超文本傳輸協議(Hypertext Transfer Protocol,簡稱HTTP)是應用層協議。HTTP 是一種請求/響應式的協議,即一個客戶端與服務器建立連接后,向服務器發送一個請求;服務器接到請求后,給予相應的響應信息。
HTTP 請求報文
HTTP 請求報文由請求行、請求頭部、空行 和 請求包體 4 個部分組成,如下圖所示:
?
下面對請求報文格式進行簡單的分析:
請求行:請求行由方法字段、URL 字段 和HTTP 協議版本字段 3 個部分組成,他們之間使用空格隔開。常用的 HTTP 請求方法有 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT;
?
● GET:當客戶端要從服務器中讀取某個資源時,使用GET 方法。GET 方法要求服務器將URL 定位的資源放在響應報文的數據部分,回送給客戶端,即向服務器請求某個資源。使用GET 方法時,請求參數和對應的值附加在 URL 后面,利用一個問號(“?”)代表URL 的結尾與請求參數的開始,傳遞參數長度受限制。例如,/index.jsp?id=100&op=bind。
?
● POST:當客戶端給服務器提供信息較多時可以使用POST 方法,POST 方法向服務器提交數據,比如完成表單數據的提交,將數據提交給服務器處理。GET 一般用于獲取/查詢資源信息,POST 會附帶用戶數據,一般用于更新資源信息。POST 方法將請求參數封裝在HTTP 請求數據中,以名稱/值的形式出現,可以傳輸大量數據;
?
請求頭部:請求頭部由關鍵字/值對組成,每行一對,關鍵字和值用英文冒號“:”分隔。請求頭部通知服務器有關于客戶端請求的信息,典型的請求頭有:
空行:最后一個請求頭之后是一個空行,發送回車符和換行符,通知服務器以下不再有請求頭;
請求包體:請求包體不在 GET 方法中使用,而是在POST 方法中使用。POST 方法適用于需要客戶填寫表單的場合。與請求包體相關的最常使用的是包體類型 Content-Type 和包體長度 Content-Length;
?
?
?
HTTP 響應報文
HTTP 響應報文由狀態行、響應頭部、空行 和 響應包體 4 個部分組成,如下圖所示:
下面對響應報文格式進行簡單的分析:
狀態行:狀態行由 HTTP 協議版本字段、狀態碼和狀態碼的描述文本 3 個部分組成,他們之間使用空格隔開;
響應頭部:響應頭可能包括:
????Location:Location響應報頭域用于重定向接受者到一個新的位置。例如:客戶端所請求的頁面已不存在原先的位置,為了讓客戶端重定向到這個頁面新的位置,服務器端可以發回Location響應報頭后使用重定向語句,讓客戶端去訪問新的域名所對應的服務器上的資源;
?
????Server:Server 響應報頭域包含了服務器用來處理請求的軟件信息及其版本。它和 User-Agent 請求報頭域是相對應的,前者發送服務器端軟件的信息,后者發送客戶端軟件(瀏覽器)和操作系統的信息。
Vary:指示不可緩存的請求頭列表;
????Connection:連接方式;
????對于請求來說:close(告訴 WEB 服務器或者代理服務器,在完成本次請求的響應后,斷開連接,不等待本次連接的后續請求了)。keepalive(告訴WEB服務器或者代理服務器,在完成本次請求的響應后,保持連接,等待本次連接的后續請求);
????對于響應來說:close(連接已經關閉); keepalive(連接保持著,在等待本次連接的后續請求); Keep-Alive:如果瀏覽器請求保持連接,則該頭部表明希望WEB 服務器保持連接多長時間(秒);例如:Keep-Alive:300;
????WWW-Authenticate:WWW-Authenticate響應報頭域必須被包含在401 (未授權的)響應消息中,這個報頭域和前面講到的Authorization 請求報頭域是相關的,當客戶端收到 401 響應消息,就要決定是否請求服務器對其進行驗證。如果要求服務器對其進行驗證,就可以發送一個包含了Authorization 報頭域的請求;
?
????`空行:最后一個響應頭部之后是一個空行,發送回車符和換行符,通知服務器以下不再有響應頭部。
響應包體:服務器返回給客戶端的文本信息;
?
?
HTTP 工作原理
HTTP 協議采用請求/響應模型。客戶端向服務器發送一個請求報文,服務器以一個狀態作為響應。
以下是 HTTP 請求/響應的步驟:
HTTP 無狀態性
????HTTP 協議是無狀態的(stateless)。也就是說,同一個客戶端第二次訪問同一個服務器上的頁面時,服務器無法知道這個客戶端曾經訪問過,服務器也無法分辨不同的客戶端。HTTP 的無狀態特性簡化了服務器的設計,使服務器更容易支持大量并發的HTTP 請求。
?
HTTP 持久連接
????HTTP1.0 使用的是非持久連接,主要缺點是客戶端必須為每一個待請求的對象建立并維護一個新的連接,即每請求一個文檔就要有兩倍RTT 的開銷。因為同一個頁面可能存在多個對象,所以非持久連接可能使一個頁面的下載變得十分緩慢,而且這種短連接增加了網絡傳輸的負擔。HTTP1.1 使用持久連接keepalive,所謂持久連接,就是服務器在發送響應后仍然在一段時間內保持這條連接,允許在同一個連接中存在多次數據請求和響應,即在持久連接情況下,服務器在發送完響應后并不關閉TCP 連接,而客戶端可以通過這個連接繼續請求其他對象。
HTTP/1.1 協議的持久連接有兩種方式:
● ????非流水線方式:客戶在收到前一個響應后才能發出下一個請求;
● ????流水線方式:客戶在收到 HTTP 的響應報文之前就能接著發送新的請求報文;
?
最后給出一個具體例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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 |
從請求報文可以知道:
1 | GET?/?HTTP/1.1 |
??
請求方法 GET 表示一個讀取請求,將從服務器獲得網頁數據,/表示URL 的路徑,URL 總是以/開頭,/就表示首頁,最后的HTTP/1.1 指示采用的 HTTP 協議版本是 1.1;請求域名如下所示:
1 | Host:?hr.tencent.com |
?
響應報文如下:
1 | HTTP/1.1?200?OK???Server:?nginx |
??
原文來自:http://network.51cto.com/art/201501/464513_1.htm