Web-Server

Web 伺服器/http 協議如何處理版本控制和壓縮?

  • May 10, 2010

當客戶端瀏覽器向 Web 伺服器請求文件時,我知道執行了某種檢查,因為提供網頁所需的文件可能已經被 Web 瀏覽器記憶體。因此,如果記憶體中存在文件,則不會發送任何文件。但是,如果伺服器上的文件在文件被記憶體在瀏覽器中後發生了變化,無論如何都會發送和更新文件。

然後,如果您在伺服器上啟用了 gzipping 之類的壓縮,則要提供給客戶端的文件必須在途中進行 gzip 壓縮,這需要一些伺服器端處理。

但這是如何管理的?在我看來,邏輯方法是,Web 伺服器也應該有一個記憶體,包含在一定時間跨度內請求的所有文件的最新版本,因此是這些文件的壓縮版本,這樣壓縮就不必每次請求文件時完成。

而且,文件最終是如何被請求的?瀏覽器是否每次在 HTML 程式碼中遇到一個文件並且特定文件未儲存在本地記憶體中時都要求文件,或者它是否匯總了所有需要的文件並同時要求整個文件?

但這只是從程式的角度猜測,我真的不知道。

如果 Web 伺服器系統之間的答案非常不同,我主要對 Apache 感興趣,但也歡迎其他答案。

您可以在HTTP 規範中詳細了解它,但要點如下:當瀏覽器需要請求文件時,它首先檢查其本地記憶體。主要有以下三種可能性:

  1. 瀏覽器具有文件的本地(記憶體)版本,該版本被標記為在某個時間到期,並且該時間是將來的時間。在這種情況下,瀏覽器可以選擇按原樣使用記憶體版本,也可以向伺服器發送請求以查看文件是否已更改。如果瀏覽器發送請求,它將包含一個If-Modified-Since包含文件上次訪問時間的標頭。
  2. 瀏覽器具有已過期文件的記憶體版本。在這種情況下,瀏覽器肯定會向伺服器發送請求以查看是否有新版本,並且該請求將(通常)包含一個If-Modified-Since包含上次訪問文件時間的標頭。
  3. 瀏覽器根本沒有記憶體文件,在這種情況下,它會發送一個沒有If-Modified-Since標頭的請求。

當請求到達伺服器時,基本上會發生幾件事。如果請求不包含If-Modified-Since頭,則伺服器將繼續使用 HTTP 200 (OK) 響應程式碼發回文件。(或者它會發送一個 404 File Not Found,或 403 Forbidden,或任何合適的)但是如果請求確實包含一個If-Modified-Sinceheader,伺服器知道它只需要發回文件,如果它自包含時間以來被修改在標題中。現在,如果文件從那時起被修改過,那麼伺服器將再次發送回帶有 200、403、404 程式碼的文件。但是如果文件沒有自指定時間以來被修改 - 請記住,這意味著瀏覽器的記憶體版本仍然是最新的 - 伺服器可以使用 304(未修改)程式碼進行響應,並忽略文件本身的內容。這節省了一些網路流量。

現在,假設伺服器將使用文件的全部內容進行響應,有幾種方法可以解決它,具體取決於伺服器的編寫和/或配置方式。顯然,它可以在每次請求進入時從磁碟讀取文件(或者執行程序來生成它,如果它是一個動態頁面),然後將其發送回來,但如您所知,這有點低效。如果瀏覽器指定,伺服器可以做的一件事是發回文件的 gzip 壓縮版本Accept-Encoding: gzip在其要求中。伺服器保留 gzip 文件的記憶體版本確實很有意義,並且 Apache(可能還有大多數其他伺服器)可以配置為這樣做。當伺服器準備發回 gzip 響應時,它會檢查 gzip 記憶體版本的修改時間與原始文件的修改時間,如果原始文件已更新,它將再次對其執行 gzip 並替換記憶體中的舊版本與新版本。

有時伺服器也可以在 RAM 中記憶體文件,如果它們經常被請求的話。我認為 Apache 可以配置為這樣做,但我不確定。(您現在可能已經猜到了,使用 Apache,一切都與配置有關。)

關於您關於如何請求文件的問題,瀏覽器實際上一次只要求一個文件。每個 HTML 頁面、CSS 文件、Javascript 文件、圖像文件等都對應一個單獨的 HTTP 請求。如果您有興趣,像Wireshark這樣的工具實際上可以向您顯示進出您的電腦的各個 HTTP 請求和響應。但是為了節省資源,TCP/IP 連接通常會通過一整套請求保持打開狀態。例如,如果您有一個包含 3 個圖像和一個 CSS 樣式表的網頁,您可能會得到這樣的序列:

  • 瀏覽器打開連接
  • 伺服器確認連接
  • 瀏覽器請求 HTML 頁面
  • 伺服器發送 HTML 頁面
  • 瀏覽器請求 CSS 樣式表
  • 伺服器發送 CSS 樣式表
  • 瀏覽器請求圖片 1
  • 伺服器發送圖像 1
  • 瀏覽器請求圖像 2
  • 伺服器發送圖像 2
  • 瀏覽器請求帶有Connection: close標題的圖像 3
  • 伺服器發送圖像 3
  • 伺服器關閉連接

任何一方都可以發送標Connection: close頭以指定在該請求完成後應關閉 TCP/IP 連接。

希望這主要是您所要求的,但是 HTTP 規範是一個巨大的文件,我忽略了很多細微之處。我實際上覺得它讀起來很有趣,所以我建議你去看看(再說一遍,我可能有點奇怪)。

引用自:https://serverfault.com/questions/140065