http請求報文由三部分組成,分別是:請求行(請求頭)、消息報頭、請求正文。html
Method Request-URI HTTP-Version CRLF
其中 Method表示請求方法;Request-URI是一個統一資源標識符;HTTP-Version表示請求的HTTP協議版本;CRLF表示回車和換行(除了做爲結尾的CRLF外,不容許出現單獨的CR或LF字符)。請求方法以下:GET /chn/yxsz/index.htm HTTP/1.1 /*請求行使用相對URL*/ Host:www.tsinghua.edu.cn /*此行爲首部行的開始,給出主機的域名*/ Connection:close /*告訴服務器發送完請求的文檔可釋放鏈接*/ user-Agent:Mozilla/5.0 /*代表用戶代理是使用Netscape瀏覽器*/ Accept-Language:cn /*表示用戶但願優先獲得中文版本的文檔*/
a.域名解析(瀏覽器經過向 DNS 服務器發送域名,DNS 服務器查詢(查詢緩存)到與域名相對應的 IP 地址,而後返回給瀏覽器,瀏覽器再將 IP 地址打在協議上,同時請求參數也會在協議搭載,而後一併發送給對應的服務器)git
b.發起TCP的3次握手(瀏覽器得到對應的ip地址後,瀏覽器與遠程Web
服務器經過TCP
三次握手協商來創建一個TCP/IP
鏈接。)github
c.創建TCP鏈接後發送HTTP請求報文web
d.服務器處理請求,並返回HTTP響應報文瀏覽器
e.瀏覽器解析,渲染,並繪製到網頁緩存
f. 斷開鏈接(TCP 四次揮手)服務器
在接收和解釋請求消息後,服務器返回一個HTTP響應消息。HTTP響應也是由三個部分組成,分別是:狀態行、消息報頭、響應正文併發
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服務器HTTP協議的版本;Status-Code表示服務器發回的響應狀態代碼;Reason-Phrase表示狀態代碼的文本描述app
a. 1XX(信息響應類,表示接受的請求正在處理)jsp
b. 2XX(處理成功類,表示請求已被成功接收、理解、接受)
GET:請求的對應資源會做爲響應返回。 HEAD:請求的對應資源的響應頭(entity-header)會做爲響應返回,不包括響應體(message-body) POST:返回處理對應請求的結果。
c. 3XX(重定向響應類,表示須要客戶端須要進行附加操做)
HEAD:必須在響應頭部Location字段中指明新的永久性的URI。 GET:除了有Location字段之外,還須要在響應體中附上永久性URI的超連接文本。 POST:客戶端在發送POST請求,受到301響應以後,不該該自動跳轉URI,應當讓用戶確認跳轉。
d. 4XX(客戶端錯誤,請求有語法錯誤或請求沒法實現)
e. 5XX(服務端錯誤,服務器處理請求出錯 )
HTTP消息由客戶端到服務器的請求和服務器到客戶端的響應組成。請求消息和響應消息都是由開始行(對於請求消息,開始行就是請求行,對於響應消息,開始行就是狀態行),消息報頭(可選),空行(只有CRLF的行),消息正文(可選)組成。 HTTP消息報頭包括普通報頭、請求報頭、響應報頭、實體報頭。 每個報頭域都是由名字+「:」+空格+值 組成,消息報頭域的名字是大小寫無關的。
Accept請求報頭域用於指定客戶端接受哪些類型的信息。eg:Accept:image/gif,代表客戶端但願接受GIF圖象格式的源;
Accept:text/html,代表客戶端但願接受html文本
Accept-Charset請求報頭域用於指定客戶端接受的字符集。 eg:Accept-Charset:iso-8859-1,gb2312
若是在請求消息中沒有設置這個域,缺省是任何字符集均可以接受。
Accept-Encoding請求報頭域相似於Accept,可是它是用於指定可接受的內容編碼。eg:Accept-Encoding:gzip,deflate
若是請求消息中沒有設置這個域服務器假定客戶端對各類內容編碼均可以接受。
Accept-Language請求報頭域相似於Accept,可是它是用於指定一種天然語言。eg:Accept-Language:zh-cn
若是請求消息中沒有設置這個報頭域,服務器假定客戶端對各類語言均可以接受。
Authorization請求報頭域主要用於證實客戶端有權查看某個資源。當瀏覽器訪問一個頁面時,若是收到服務器的響應代碼爲401(未受權),能夠發送一個包含Authorization請求報頭域的請求,要求服務器對其進行驗證。
Host請求報頭域主要用於指定被請求資源的Internet主機和端口號,它一般從HTTP URL中提取出來的,eg:咱們在瀏覽器中輸入:http://www.guet.edu.cn/index.html
;瀏覽器發送的請求消息中,就會包含Host請求報頭域,以下: Host:www.guet.edu.cn
此處使用缺省端口號80,若指定了端口號,則變成:Host:www.guet.edu.cn:指定端口號
User-Agent請求報頭域容許客戶端將它的操做系統、瀏覽器和其它屬性告訴服務器。 請求報頭舉例:
GET /form.html HTTP/1.1 (CRLF) Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF) Accept-Language:zh-cn (CRLF) Accept-Encoding:gzip,deflate (CRLF) If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF) If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF) User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF) Host:www.guet.edu.cn (CRLF) Connection:Keep-Alive (CRLF) (CRLF)
Location響應報頭域用於重定向接受者到一個新的位置。Location響應報頭域經常使用在更換域名的時候。
Server響應報頭域包含了服務器用來處理請求的軟件信息。與User-Agent請求報頭域是相對應的。下面是 Server響應報頭域的一個例子: Server:Apache-Coyote/1.1
WWW-Authenticate
WWW-Authenticate響應報頭域必須被包含在401(未受權的)響應消息中,客戶端收到401響應消息時候,併發送Authorization報頭域請求服務器對其進行驗證時,服務端響應報頭就包含該報頭域。 eg:WWW-Authenticate:Basic realm="Basic Auth Test!"
//能夠看出服務器對請求資源採用的是基本驗證機制。
Content-Encoding實體報頭域被用做媒體類型的修飾符,它的值指示了已經被應用到實體正文的附加內容的編碼,於是要得到Content-Type報頭域中所引用的媒體類型,必須採用相應的解碼機制。Content-Encoding這樣用於記錄文檔的壓縮方法,eg:Content-Encoding:gzip
Content-Language實體報頭域描述了資源所用的天然語言。沒有設置該域則認爲實體內容將提供給全部的語言閱讀 者。eg:Content-Language:da
Content-Length實體報頭域用於指明實體正文的長度,以字節方式存儲的十進制數字來表示。
Content-Type實體報頭域用語指明發送給接收者的實體正文的媒體類型。eg:
Content-Type:text/html;charset=ISO-8859-1 Content-Type:text/html;charset=GB2312
Last-Modified實體報頭域用於指示資源的最後修改日期和時間。
Expires實體報頭域給出響應過時的日期和時間。爲了讓代理服務器或瀏覽器在一段時間之後更新緩存中(再次訪問曾訪問過的頁面時,直接從緩存中加載,縮短響應時間和下降服務器負載)的頁面,咱們可使用Expires實體報頭域指定頁面過時的時間。eg:Expires:Thu,15 Sep 2006 16:23:12 GMT
HTTP1.1的客戶端和緩存必須將其餘非法的日期格式(包括0)看做已通過期。eg:爲了讓瀏覽器不要緩存頁面,咱們也能夠利用Expires實體報頭域,設置爲0,jsp中程序以下:response.setDateHeader("Expires","0");