深入HTTP協議

就像在招待客人一樣得遵守一定禮節,瀏覽器與web服務器一問一答的交互過程也得遵守一定的規則——HTTP協議(HyperText Transfer Protocol)。現代B/S架構都是基於統一的HTTP協議,基於此協議的服務器有Apache、IIS、Nginx、Tomcat、JBoss等。目前被廣泛使用的是HTTP1.1(主要討論此版本),與上個版本最大的區別是支持持續連接。B/S固定不變的原則:URL、HTTP、瀏覽器。

當瀏覽器向服務器發出一次請求,web服務器返回HTML文檔給瀏覽器後,兩者不再有任何關係。上一次請求的響應結果不影響下次請求的響應結果,如用戶網線接觸不良,重新插好網線後,再次發送請求,web服務器是感知不到的,只要瀏覽器發出的請求內容一樣,它的處理過程就完全一樣。所以說HTTP協議是無狀態的。

代理服務器(可有效減少服務器的訪問負載)的工作流程:


①當瀏覽器發出請求後,若本地緩存有請求的資源,直接取出保存的副本進行響應;

②若本地沒有請求的資源,代理服務器就向web服務器請求該資源並返回給用戶,同時將資源保持在本地緩存。

HTTP協議採用無狀態短連接的通信方式。因爲web應用每天都要處理大量的請求,不可能每個用戶訪問都保持住這個連接。HTTP1.1支持持久連接,在一個TCP連接上可以傳送多個HTTP請求和響應。eg.一個網頁中的css、JavaScript、圖片文件(HTTP1.0都要單獨建立TCP連接,非常耗時)。一個頁面的css文件經常要發送多個HTTP請求,但每個單獨的頁面還是需要使用各自的TCP連接,所以稱爲短連接。

在瀏覽器輸入http://www.sina.com.cn/:

①首先請求DNS把該域名映射成IP地址;

②根據IP地址在互聯網找到對應的服務器;

③向該服務器發送一個get請求;

④服務器返回數據資源。

發起請求

一個完整的請求消息包括:一個請求行、若干消息頭、以及實體內容。

一個完整的響應消息包括:一個狀態行、若干消息頭、以及實體內容。

消息頭和實體內容要用空行隔開(即回車和換行兩個字符)

若HTTP消息包括實體內容,且沒采用chunked傳輸編碼方式,則消息頭必須包含實體內容的長度的字段,否則客戶端和服務程序無法知道實體內容何時結束。

1.請求行
格式:請求方式 資源路徑 HTTP版本號<CRLF>
舉例:GET/test.html HTTP/1.1
請求方式:POST,HEAD,OPTIONS,DELETE,TRACE,PUT

2.狀態行
格式:HTTP版本號 狀態號 原因描述<CRLF>
舉例:HTTP/1.1 200 OK

實例:telnet localhost 8080(“ctr+]”,組合鍵打開本地回顯)

 

我們來解析一下在瀏覽器輸入http://www.sina.com.cn/的url後,各請求頭和響應頭的部分:

請求頭:

Host: www.sina.com.cn(指定被請求資源)

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0(客戶端的操作系統、瀏覽器和其他屬性)

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8(指出瀏覽器能夠處理的MIME類型)

Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3(指定一種自然語言)

Accept-Encoding: gzip, deflate(指定可接受的內容編碼)

DNT: 1

Connection: keep-alive(當前連接是否保持)

If-Modified-Since: Thu, 21 Apr 2016 14:22:29 GMT(緩存文檔最後更新時間)

補充:Referer:

①如果從瀏覽器地址輸入URL發出,則不應發送Referer請求頭;

②使用指定的超鏈接的URL發出,發送Referer請求頭。(這樣可以追蹤和了解發出本次請求的起源URL地址)


響應頭:

Age: 51(可在客戶機或代理服務器中緩存的有效時間,單位秒)

Cache-Control: max-age=60(緩存的內容將在60秒後失效)

Content-Encoding: gzip(指定實體內容的壓縮編碼方式)

Content-Length: 120981(指明實體內容長度)

Content-Type: text/html(發送給接受者實體正文類型)

Date: Thu, 21 Apr 2016 15:42:42 GMT

Expires: Thu, 21 Apr 2016 15:43:42 GMT(指定當前文檔什麼時候過期,不能繼續使用本地緩存)

Last-Modified: Thu, 21 Apr 2016 15:42:12 GMT(緩存文檔最後更新時間)

Server: nginx(指定服務器軟件的產品名稱)

Vary: Accept-Encoding(指定影響了服務器所生成的響應內容的那些請求頭字段名)

X-Cache: HIT from cmnet.xxg.18a4.31.spool.sina.com.cn

X-Powered-By: shci_v1.03

補充:

Cache-directive

說明

public

所有內容都將被緩存

private

內容只緩存到私有緩存中

no-cache

必須先與服務器確認返回的響應是否被更改,然後才能使用該響應來滿足後續對同一個網址的請求。因此,如果存在合適的驗證令牌 (ETag)no-cache會發起往返通信來驗證緩存的響應,如果資源未被更改,可以避免下載。

no-store

所有內容都不會被緩存到緩存或 Internet 臨時文件中

must-revalidation/proxy-revalidation

如果緩存的內容失效,請求必須發送到服務器/代理以進行重新驗證

max-age=xxx (xxx is numeric)

緩存的內容將在 xxx 秒後失效,這個選項只在HTTP 1.1可用,並如果和Last-Modified一起使用時,優先級較高

 

Ctrl+F5可以繞過本地緩存和遠程緩存,通過增加請求頭:Pragma: no-cache、Cache-Control: no-cache,重新發送請求響應新內容。


CDN工作機制:

CDN(Content Delivery Network,內容分佈網絡),是一種先進的流量分配網絡,使用戶就近取得所需內容,提高訪問網站的速度。

可近似認爲CDN=鏡像(mirror)+緩存(cache)+整體負載均衡(GSLB)。可明顯提高Internet中信息流動效率。CDN以緩存靜態數據爲主,eg.CSS、JS、圖片和靜態頁面。淘寶有90%以上的數據都是由CDN來提供的。


作者: @nanphonfy 
Email: nanphonfy (Nfzone) gmail.com 請將(Nfzone)換成@

發佈了90 篇原創文章 · 獲贊 26 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章