前言

B/S網路架構的核心是HTTP,掌握HTTP對一個從事互聯網工作的程序員來說非常重要。要理解HTTP,最重要的是要熟悉HTTP的HTTP Header,HTTP Header控制著互聯網上成千上萬用戶的數據傳輸。最關鍵的是,它控制著用戶瀏覽器的渲染行為和伺服器的執行邏輯。例如,當伺服器沒有用戶請求的數據的時候就會返回一個404狀態碼,告訴瀏覽器沒有要請求的數據,通常瀏覽器就會展示一個非常不願意看到的該頁面不存在的錯誤信息。OK,接下來開始對於HTTP的學習。

HTTP是什麼

HTTP,英文全稱為HyperText Transfer Protocol,即超文本傳輸協議,是互聯網上應用最為廣泛的一種網路協議。HTTP是一種屬於應用層的面向對象的協議,一次HTTP操作稱為一個實物,其簡單工作過程如圖:

其工作過程可以分為四步:

1、首先客戶端與伺服器需要建立連接,只需要單擊某個超級鏈接,HTTP的工作開始

2、建立連接後,客戶端發送一個請求給伺服器(默認請求伺服器的80埠),請求方式的格式為:統一資源標識符(URL)+協議版本號+MIME信息包括請求修飾符、客戶端信息和可能的內容

3、伺服器接收到請求後,給予響應的相應信息,其格式為一個狀態行,包括信息的協議版本號、一個成功或錯誤的代碼,後面是MIME信息包括伺服器信息、實體信息和可能的內容

4、客戶端接收伺服器所返回的信息通過瀏覽器顯示在用戶的顯示屏上,然後客戶端和伺服器斷開連接

以上的過程中任意一步出錯,那麼產生的錯誤信息將返回到客戶端,由顯示屏輸出。對於用戶來說,這些過程都是HTTP自己完成的,用戶只要用滑鼠點擊,等待信息顯示就可以了。HTTP協議的主要特點可以概括如下:

1、支持客戶端/伺服器模式

2、簡單快速,客戶端向伺服器發送請求服務時,只需要傳送請求方法和路徑。由於HTTP協議簡單,使得HTTP伺服器的程序規模小,因而通信速度快

3、靈活,HTTP允許傳輸任意類型的數據對象,正在傳輸的類型由Content-Type加以標記

4、無連接,無連接的含義是限制每次連接只處理一個請求,伺服器處理完成客戶端的請求,並收到客戶的應答後,即斷開連接。採用這種方式可以節省傳輸時間

5、無狀態,HTTP協議是無狀態協議,無狀態是指協議對於事物處理沒有記憶能力,血少狀態意味著如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳輸的數據量增大。另一方面,在伺服器不需要先前信息時它的應答就較快

HTTP請求頭

HTTP響應頭

最後幾個"X-"開頭估計是有特殊用途而通過代碼設置到HTTP HEADER裡面去的內容

HTTP狀態碼

HTTP緩存

想想現在的大型網站,隨便一個頁面都是一兩百個請求,每天PV量過千萬、過億,如果沒有緩存,用戶體驗會急劇下降,同時伺服器壓力和網路帶寬都面臨嚴重的考驗。

緩存分為服務端緩存和客戶端緩存,客戶端緩存一般指的是瀏覽器緩存,目的就是加速各種靜態資源的訪問。瀏覽器緩存有兩種機制:HTML Meta標籤和HTTP HEADER信息。

1、HTML META標籤

瀏覽器緩存機制主要是HTTP協議定義的緩存機制(如Expires、Cache-Control等),但是也有非HTTP協議定義的緩存機制,如使用HTML META標籤,Web開發者可以在HTML頁面的<head>節點中加入<meta>標籤,代碼如下:

<META HTTP-EQUIV="Pragma" CONTENT="no-cache">

上述代碼的作用是告訴瀏覽器當前頁面不被緩存,每次訪問都需要去伺服器讀取。使用上很簡單,但只有部分瀏覽器支持,而且所有緩存代理伺服器都不支持,因為代理不解析HTML內容本身,而廣泛應用的還是HTTP HEADER信息來控制緩存。

2、HTTP HEADER信息

當使用了HTTP HEADER信息來控制緩存,那麼瀏覽器第一次請求時:

瀏覽器再次請求時:

幾個重要的概念:

(1)Expires策略

Expires策略是Web伺服器響應消息頭欄位,在響應HTTP請求時告訴瀏覽器在過期時間前瀏覽器可以直接從瀏覽器緩存取數據而無須再次請求。不過Expires策略在HTTP1.1基本忽略,因為Expires返回的到期時間是伺服器的時間,如果客戶端和伺服器的時間相差很大,那麼誤差就很大。

(2)Cache-Control策略

Cache-Control策略與Expires策略的作用一致,都是致命當前資源的有效期,控制瀏覽器是否直接從瀏覽器緩存取數據還是重新發送請求到伺服器取數據。只不過Cache-Control的選擇更多、被各瀏覽器支持得更好、設置得更細緻,如果同時設置的話,其優先順序也比較高(高於Expires),Cache-Control的選擇有:

選 擇

作 用

public

表示響應可被任何緩存區緩存,在響應頭中設置

private

表示對於單個用戶的整個或部分響應消息,不能被共享緩存處理,在響應頭中設置

no-cache

表示請求或響應消息不被緩存,在請求頭和響應頭中都可以設置

no-store

表示防止重要的信息被無意發布,所有內容都不會被緩存到緩存中或者Internet臨時文件中,在響應頭中設置

must-revalidate/proxy-revaliate

表示如果緩存的內容失效,請求必須發送到伺服器/代理以進行重新驗證,在請求頭中設置

max-age=xxx

表示緩存的內容將在xxx秒後失效,這個選項只有HTTP1.1可用,在響應頭中設置

Pragma是為了兼容HTTP1.0,它的的作用和Cache-Control是一樣的。

如果我們使用Ctrl+F5組合件刷新一個頁面時,那麼在HTTP請求頭中會增加一些信息,它告訴伺服器我們要獲取的是最新的數據而不是緩存。

推薦閱讀:

相关文章