1. 程式人生 > >HTTP學習三:其他知識點

HTTP學習三:其他知識點

1.請求方法的闡述:

http協議中定義了7種請求方法,分別如下:
GET:最常用的請求方法,通常用於請求伺服器傳送某個資源
HEAD:HEAD方法和GET方法的行為類似,但是伺服器只會在響應中返回頭部。不會返回實體的主體部分。這就允許了客戶端在不獲取資源實體的情況下,對資源的首部進行檢查。一般會在如下的情況中使用HEAD:
-在不獲取資源的情況下,瞭解資源的具體情況
- 判斷某個資源是否存在
- 通過檢視首部,判斷某個資源是否發生過更改
PUT:這個方法會向伺服器寫入文件。這個方法的語義就是讓伺服器用請求的主體部分來建立一個由所請求的url命名的文件。
POST:用來向伺服器輸入資料的。
TRACE:這個方法主要用於診斷。用來驗證請求是否如願的穿過了請求/響應鏈。這個方法是不能帶有實體的主體部分。
OPTIONS:請求伺服器所支援的各種功能。
DELETE:請求伺服器刪除指定url所指向的資源。

2.http快取的介紹:

在具體瞭解 HTTP 快取之前先來明確幾個術語:

  • 快取命中率:從快取中得到資料的請求數與所有請求數的比率。理想狀態是越高越好。
  • 過期內容:超過設定的有效時間,被標記為“陳舊”的內容。通常過期內容不能用於回覆客戶端的請求,必須重新向源伺服器請求新的內容或者驗證快取的內容是否仍然準備。
  • 驗證:驗證快取中的過期內容是否仍然有效,驗證通過的話重新整理過期時間。
  • 失效:失效就是把內容從快取中移除。當內容發生改變時就必須移除失效的內容

簡單的介紹一下`http快取`的整個過程:

首次訪問一個url的時候,瀏覽器中是不存在快取的。當伺服器響應的時候,會響應一些控制瀏覽器快取行為的header。比如:expires,cache-control,last-modified,etag等。這寫響應頭部主要是用來控制瀏覽器對資源是否快取,如何快取等。


當再次訪問相同的url的時候,瀏覽器會根據上面的這個header資訊,來決定是否向伺服器傳送請求。


下面主要介紹的就是瀏覽器再次訪問一個url的時候,如何根據快取來決定請求的行為。


第一個條件:當瀏覽器再次訪問一個url的時候,會首先根據header資訊判斷這次請求是否命中強快取(expires和cache-control)。如果命中了強快取,就會直接從瀏覽器中讀取快取的資源,而不會向伺服器傳送請求。否則,就進行第二個條件的判斷。
第二個條件:如果沒有命中強快取,瀏覽器會向伺服器傳送請求,請求會攜帶第一次請求時候伺服器所返回的一些header資訊(Last-Modified/If-Modified-since和ETag/if-none-match)。伺服器在接收到請求的時候,會根據這些header中的資訊來判斷請求的資源是否命中了協商快取。如果命中了協商快取,伺服器會發送304狀態碼和空的響應體給客戶端。否則,伺服器就會發送200的狀態碼和新的響應體及新的header給客戶端。

強快取和協商快取的區別:
- 強快取:從快取中讀取資料,不會向伺服器傳送請求,200狀態碼
- 協商快取:從快取中讀取資料,會向伺服器傳送請求並判斷資源的有效性,返回200或者304的狀態碼。

強快取相關的header
  expires:這個欄位的值是一個表示絕對時間的字串。如果傳送請求的時間在這個值設定的時間之前,那麼本地的快取是始終有效的,不需要向伺服器傳送請求獲取新的資源。
cache-control:max-age=xxx,瀏覽器會利用這個欄位的max-age值來判斷資源的有效性。這個值是一個相對時間。資源第一次請求的時間和max-age值來確定一個有效期。如果請求的時間在這個有效期之前,那麼就可以認定資源是有效的。不必再向伺服器傳送請求獲取新的資源。除了`max-age`,這個欄位還可能有其他的值。
no-cache:不使用強快取,使用協商快取。每次請求都會向伺服器確定資源的有效性。
no-store:禁止使用快取,每次都要向伺服器發起新的請求,獲取最新的資源
public:可以被所有的使用者快取,包括終端使用者和中間的cdn代理服務商
private:只能被終端的使用者快取,不允許cdn等代理伺服器對其進行快取

協商快取相關的header:
和協商快取相關的響應頭主要有last-modified和etag兩種,響應頭主要有if-modified-since和if-none-match兩種。其中last-modified和if-modified-since相對應,etag和if-none-match相對應。

1. last-modified和if-modified-since:
這兩個欄位的值都是`GMT`格式的字串。這組欄位在確定快取是否有效的過程如下:
瀏覽器第一次向伺服器請求一個資源的時候,服務會在響應頭中加入last-modified欄位。這個欄位表示請求的資源在伺服器上最後的修改時間。
當瀏覽器再次向伺服器請求這個資源的時候,就會在請求的header中加入if-modified-since欄位。這個欄位的值就是第一次請求資源的時候,伺服器的響應頭last-modified的值。

當伺服器再次收到對這個資源的請求的時候,就會通過請求頭中的if-modified-since欄位的值和資源最後一次被修改的時間做對比。如果兩者一致,就返回304 not modified和空的響應體。如果兩者不一致,就會返回對應的資源。如果伺服器返回了304狀態碼,並不會再次向響應頭中新增last-modified。因為資源並沒有發生改變,上次的last-modified的值依然有效。
瀏覽器在收到304的響應的時候,就會從快取中讀取資料。
如果瀏覽器收到了200的響應,表示協商快取沒有命中。瀏覽器在接收新的資源的同時也會同步更新對應的last-modified的值。以便下次請求的時候啟用新的last-modified。

etag和if-none-match:
etag是伺服器對每個資源生成的一個唯一表示符,只要資源發生變化,這個也會隨之改變。這組欄位的驗證過程和上述類似,唯一不同的就是伺服器在進行響應的時候,依然會把etag作為響應頭的一部分進行響應,及時這個值沒有發生變化。

對於協商快取的這兩組欄位,伺服器會優先驗證etag。當etag驗證一致的情況下才會對last-modified進行驗證。這是因為有些資源是不太適合生成etag的,比如圖片資源。根據上述的判斷才會決定是否要返回304的響應。

關於 last-modified 和 Etag 區別,已經有很多人總結過了:

  • 某些伺服器不能精確得到資源的最後修改時間,這樣就無法通過最後修改時間判斷資源是否更新。
  • Last-modified 只能精確到秒。
  • 一些資源的最後修改時間改變了,但是內容沒改變,使用 Last-modified 看不出內容沒有改變。
  • Etag 的精度比 Last-modified 高,屬於強驗證,要求資源位元組級別的一致,優先順序高。如果伺服器端有提供 ETag 的話,必須先對 ETag 進行 Conditional Request。

3.https的介紹

https在傳輸資料之前需要客戶端和伺服器進行一次握手。握手的過程中會確立雙方加密傳輸資料的密碼資訊。TLS/SSL使用了對稱加密,非對稱加密,以及HASH演算法。下面是握手的簡單的過程:
1. 瀏覽器將自己支援的一套加密規則傳送給伺服器
2. 伺服器從中選出一組加密演算法和hash演算法,並將自己的身份資訊以證書的形式傳送給瀏覽器。證書中包含了網站的網址,加密的公鑰以及證書的頒發機構等資訊。
3. 瀏覽器在收到伺服器的證書之後需要做如下幾件事情:
- 驗證證書的合法性。如果證書受信任,瀏覽器位址列裡會顯示一個小鎖頭,否則會給出不受信任的提示
- 如果證書受信任,或者使用者接受了不受信任的證書,瀏覽器會生成一段隨機數密碼,並使用證書中提供的公鑰加密。
- 使用之前約定好的hash演算法計算握手資訊,並使用生成的隨機數對訊息進行加密,最後將之前生成的所有資訊傳送給網站
4. 網站接收到瀏覽器傳送來的資料之後需要做如下幾件事情
- 使用自己的私鑰將資訊解密取出密碼,使用密碼解密瀏覽器發來的握手訊息,並驗證HASH是否與瀏覽器發來的一致
- 使用密碼加密一段握手訊息,傳送給瀏覽器
5. 瀏覽器解密並計算握手訊息的hash,如果和伺服器傳送過來的hash一致,此時握手過程結束。之後所有的通訊將使用之前瀏覽器生成的隨機密碼,並使用對稱加密演算法進行加密
http協議和https協議的區別:
https協議需要申請ca證書,一般免費證書很少,需要交費
http是明文傳輸資料的,https則是具有安全性的ssl加密傳輸協議
https的預設埠是443, http的預設埠是80
https是ssl+http,比http更安全一些

4.實際的應用:

考慮快取的內容:

  • css樣式檔案
  • js檔案
  • logo、圖示
  • html檔案
  • 可以下載的內容

一些不應該被快取的內容:

  • 業務敏感的 GET 請求

可快取的內容又分為幾種不同的情況:

不經常改變的檔案:

給 max-age 設定一個較大的值,一般設定 max-age=31536000

比如引入的一些第三方檔案、打包出來的帶有 hash 字尾 css、js 檔案。一般來說檔案內容改變了,會更新版本號、hash 值,相當於請求另一個檔案。

標準中規定 max-age 的值最大不超過一年,所以設成 max-age=31536000。至於過期內容,快取區會將一段時間沒有使用的檔案刪除掉

可能經常需要變動的檔案:

Cache-Control: no-cache / max-age=0

比如入口 index.html 檔案、檔案內容改變但名稱不變的資源。選擇 ETag 或 Last-Modified 來做驗證,在使用快取資源之前一定會去伺服器端做驗證,命中快取時會比第一種情況慢一點點,畢竟還要發請求進行通訊。

自己使用的感悟:更多的是理解各個欄位的含義(無論是欄位還是code碼),利用好瀏覽器這個好的幫手。

  • Accept-Language:表示瀏覽器所支援的語言型別。(這裡指中文、簡體中文和英文)
  • Cache-Control:指定請求和響應遵循的快取機制。(這裡表示不需要快取)
  • Connection:表示是否需要持久連線。(HTTP 1.1 預設進行持久連線即為 keep-alive, HTTP 1.0 則預設為 close)
  • Cookie:用於會話追蹤,在本文後面就繼續介紹。
  • Host:表示請求的伺服器網址
  • User-Agent:使用者代理,簡稱 UA,它是一個特殊字串頭,使得伺服器能夠識別客戶端使用的作業系統及版本、CPU 型別、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器外掛等。
  • Date:原始伺服器訊息發出的時間。
  • Last-Modified:請求資源的最後修改時間。
  • Expires:響應過期的日期和時間,如果下次訪問在時間允許的範圍內,可以不用重新請求,直接訪問快取。
  • Set-Cookie: 設定Http Cookie,下次瀏覽器再次訪問的時候會帶上這個 Cookie 值。
  • Server:伺服器軟體名稱,常見的有 Apache 和 Nginx

http2的介紹,放在下一篇文章中介紹。