HTTP 協議詳解

weixin_30788239發表於2012-12-11

本章節主要介紹HTTP1.1版本相關知識,關於HTTP2參閱HTTP2 協議一章節。

一.什麼是協議:

現實中,如果人與人或者國與國之間達成一項協議,那麼雙方就必須要遵守,否則可能會受到某些懲罰。網際網路上也是如此,協議是指計算機通訊網路中兩臺計算機之間進行通訊所必須共同遵守的規定或規則,本文所要介紹的就是應用最為廣泛的網際網路協議,HTTP協議。

關於HTTP協議的發展歷史可以參閱HTTP版本發展介紹一章節。

二.HTTP協議:

HTTP是Hypertext transfer protocol的縮寫,即超文字傳輸協議。

它規定瀏覽器客戶端與全球資訊網伺服器之間通訊的相關規則。

協議特點如下:

(1).HTTP允許傳輸任意型別的資料物件,比較靈活。

(2).HTTP協議是無狀態協議,也就是當前連線和上一次連線沒有任何關聯。

(3).HTTP基於TCP/IP應用層協議,由請求和響應構成,是一個標準的客戶端伺服器模型。

特別說明:HTTP主要應用於網頁瀏覽,但不等同於只應用於網頁瀏覽,比如QQ或者迅雷也有此協議的使用。

三.HTTP協議工作原理:

aid[3269]

簡單解析如下:

(1).全球資訊網伺服器的一個程式不斷的監控TCP的80埠(預設),以便獲取來自客戶端的request請求。

(2).收到請求並建立TCP連線之後,伺服器則會返回一個response響應,包含要請求的內容。

(3).最後,關閉TCP連線。

代理伺服器:

也許我們的request請求需要經過一個代理伺服器,才會到達我們真正所要請求的伺服器。

圖示如下:

a:3:{s:3:\"pic\";s:43:\"portal/201905/15/092955wwtqz4s8mqn6fwz6.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

使用代理伺服器目的主要有如下幾點:

(1).利用代理伺服器的快取功能,提高訪問速度;也許訪問真正的目的web伺服器速度很慢,但是代理伺服器訪問會很快,而我們訪問代理伺服器的速度也很快,這樣它們之間就架設了一個橋樑。

(2).隱藏訪問者的真實身份,出於各種原因,不少人有類似需求。

(3).突破一些網路限制,這一點大家都懂得。

四.HTTP訊息結構:

當通過URI地址向web伺服器發起一個請求時,無論是客戶端請求資訊還是伺服器端回應資訊都需要一定的格式。

1.請求訊息格式圖示如下:

aid[3271]

解析如下:

(1).開始行,也就是請求行(request line),它給出了請求的方法、資源地址和協議版本號。

(2).首部行,也就是請求頭(header),給出客戶端一些資訊,如瀏覽器資訊或者可以接收資料型別等。

(3).在首部行後面緊跟著一個空行,後面是實體主體。

(4).實體主體行,也就是請求資料。

特別說明:如果請求方法是GET或者HEAD,則沒有實體主體部分。

常見的請求方法有"POST","GET",下面是HTTP請求中所有的方法:

aid[3272]

URL是所要請求資源的地址,例如:

[HTML] 純文字檢視 複製程式碼
http://www.softwhy.com/forum.php?mod=viewthread&tid=6191

版本是當前所使用的HTTP協議版本,如HTTP1.1。

Fiddler工具捕捉request請求資訊圖示如下:

aid[3273]

一個GET請求,請求資料部分為空(GET和HEAD請求都沒);請求頭部資訊內容較多,後面會介紹。

2.響應訊息格式圖示如下:

aid[3274]

解析如下:

(1).開始行,也就是響應行(Response line),包括HTTP版本,狀態碼,以及解釋狀態碼的短語。

(2).首部行,也就是響應頭(Response header),包括一些響應的附屬資訊,例如傳輸資料格式等。

(3).首部行後面是一個空行,空行後面是響應體。

(4).實體主體,也就是響應體(Response header),包含具體請求獲取的內容。

Fiddler工具捕捉response資訊圖示如下:

aid[3275]

響應行和響應主體的都比較簡單,響應頭內容較多後面會介紹。

關於狀態碼可以參閱HTTP 狀態碼一章節。

五.HTTP Request header:

利用Fiddler工具可以非常方便的檢視HTTP請求頭的資訊,截圖如下:

aid[3276]

Fiddler工具將頭部資訊進行了分類,便於我們觀察和理解。

1.Cache頭域:

(1).Cache-Control用來規定所要遵循的快取機制,主要屬性值介紹如下:

max-age>0:表示直接從遊覽器快取中提取內容。

max-age<=0:向server傳送http請求確認資源是否修改,如果修改返回200 ,否則返回304。

(2).If-Modified-Since把瀏覽器端快取所頁面的最後修改時間傳送到伺服器去,伺服器會把這個時間與伺服器上實際檔案的最後修改時間進行對比。如果時間一致,那麼返回304,客戶端直接使用本地快取檔案。如果時間不一致,就會返回200和新的檔案內容。客戶端接到之後,會丟棄舊檔案,把新檔案快取起來,並顯示在瀏覽器中。

(3).If-None-Match通常和ETag一起工作,具體參閱HTTP Etag一章節。

2.Client頭域:

(1).Accept:用於規定客戶端瀏覽器可以接收的資料型別。

比如,Accept: text/html 代表瀏覽器可以接受伺服器回發的型別為text/html  也就是html文件。

如果伺服器無法返回text/html型別的資料,伺服器應該返回一個406錯誤(non acceptable)。

萬用字元 * 代表任意型別。

(2).Accept-Encoding:用於規定客戶端瀏覽器可以接收的編碼型別。

比如,Accept-Encoding: gzip, deflate。

(3).Accept-Language:瀏覽器自己宣告自己接收的語言。

比如,Accept-Language: zh-CN,zh;q=0.8。

(4).User-Agent:告知伺服器客戶端使用的作業系統和瀏覽器的名稱和版本等資訊。

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36。

3.Cookies:

因為HTTP協議是無狀態的,也就是說當前請求和前一次請求是沒有任何關係的,所以通常需要使用cookie來維持狀態。cookie會根據從伺服器端傳送的響應報文內的一個叫做Set-Cookie的首部欄位資訊,通知客戶端儲存Cookie。當下次客戶端再往該伺服器傳送請求時,客戶端會自動在請求報文中加入Cookie 值後傳送出去。伺服器端發現客戶端傳送過來的Cookie後,會去檢查究竟是從哪一個客戶端發來的連線請求,然後對比服務 器上的記錄,最後得到之前的狀態資訊。

圖示如下:

aid[3277]

請求頭中的cookie就是傳送給web伺服器的。

4.Entity頭域:

(1).Content-Length用來說明傳送給HTTP伺服器資料的長度。

(2).Content-Type用來說明傳送給HTTP伺服器資料型別。

5.Miscellaneous頭域:

(1).Referer:用來規定當前頁面是從哪個頁面跳轉而來。

6.Transport頭域:

(1).Connection: keep-alive表示持久連線,具體參閱http 持久連線一章節。

(2).Host規定請求的主機域名,這位虛擬主機的發展打下了基礎,否則一個伺服器只能繫結一個域名。

六.HTTP Response header:

利用Fiddler可以檢視Response header頭部資訊,圖示如下:

a:3:{s:3:\"pic\";s:43:\"portal/201905/15/093718wbu4dvoxupjbvdzd.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

1.Cache頭域:

(1).Date顯示生成訊息的具體時間和日期。

(2).Expires規定瀏覽器可以指定過期時間內使用本地快取。

(3).Cache-Control用來規定索要遵循的快取機制,主要屬性值介紹如下:

          max-age:用來設定資源(representations)可以被快取多長時間,單位為秒。

          s-maxage:和max-age是一樣的,不過它只針對代理伺服器快取而言。

          public:指示響應可被任何快取區快取。

          private:只能針對個人使用者,而不能被代理伺服器快取。

          no-cache:強制客戶端直接向伺服器傳送請求,也就是說每次請求都必須向伺服器傳送。伺服器接收到請求,然後判斷資源是否變更,是則返回新內容,否則返回304,未變更。這很容易產生誤解,使人誤以為是響應不被快取。實際上Cache-Control: no-cache是會被快取的,只不過每次在向客戶端(瀏覽器)提供響應資料時,快取都要向伺服器評估快取響應的有效性。

          no-store:禁止一切快取(這個才是響應不被快取的意思)。

(4).Vary: Accept-Encoding告訴代理伺服器快取兩種版本的資源:壓縮和非壓縮,這有助於避免一些公共代理不能正確地檢測Content-Encoding標頭的問題。

2.Cookie/Login頭域:

(1).Set-Cookie用將http伺服器端生成的cookie寫入客戶端瀏覽器。

3.Entity頭域:

(1).Content-Encoding用來表明伺服器使用什麼壓縮方法壓縮響應中的物件。

(2).Content-Language用來表明伺服器響應的物件的語言。

(3).Content-Length用來表明伺服器響應正文內容的長度,以位元組方式儲存的十進位制數字來表示。

(4).Content-Type用來表明伺服器響應的物件的型別和字符集。

(5).ETag可以參閱HTTP Etag 一章節。

4.Miscellaneous頭域:

(1).Server表明是使用何種web伺服器。

(2).X-Powered-By表明網站是用什麼技術開發。

5.Location頭域:

(1).Location用於重定向一個新的位置, 包含新的URL地址。

相關文章