當你訪問一個網站時,你的瀏覽器在後臺向其伺服器發出幾十或幾百個請求。伺服器響應這些請求,提供網站需要載入的所有資料和檔案。然而,真正的過程比這更復雜。
如果你想提高你的網站效能,瞭解HTTP請求是如何工作的是至關重要的。其中一些優化措施涉及最小化和壓縮請求。從本質上講,你正在優化你的伺服器,以便更好地響應HTTP請求。
在這篇文章中,我們將仔細研究HTTP請求如何工作。我們還將向你展示HTTP請求的結構,以及如何在必要時對其進行故障排除。
什麼是HTTP?
HTTP是一種協議。事實上,這個首字母縮寫代表了超文字傳輸協議。該協議規定了客戶端和伺服器之間的請求和響應的結構和語言。客戶端通常是網路瀏覽器,但它們可以有多種形式,如搜尋引擎機器人。
當你通過瀏覽器訪問網站時,整個連線是通過HTTP進行的。該協議使你能夠接收資料,包括文字、影象、視訊、樣式表、指令碼等等。
自90年代初以來,HTTP一直是網路的骨幹之一。在過去的幾十年裡,它不斷髮展,變得更加高效。2010年代後半期,HTTP/2得到了發展,它使客戶端能夠同時載入資源,而不是非同步。這導致了巨大的效能提升。
在2022年,46%的網路都在使用HTTP/2。現在,已經有關於採用HTTP/3的討論,這也被稱為HTTP-over-QUIC。HTTP/3與UDP協議一起工作,這使它比傳統的TCP連線(也就是HTTP和HTTP/2所使用的)更具優勢。
什麼是HTTP請求(以及它是如何工作的)?
把HTTP請求看作是你的瀏覽器與伺服器的連線,並要求獲得一個特定的資源或向其傳送資料。有幾種型別的HTTP請求方法,它們完全改變了你從伺服器得到的響應型別。最常見的有以下幾種:
- GET -這是迄今為止最經常使用的HTTP請求方法。一個GET請求要求伺服器提供一個特定的資訊或資源。當你連線到一個網站時,你的瀏覽器通常會傳送幾個GET請求,以接收它所需要的資料,從而載入頁面。
- HEAD -通過HEAD請求,你只收到你想要載入的頁面的標頭資訊。你可以使用這種型別的HTTP請求,在你使用GET下載一個檔案之前,瞭解它的大小。
- POST -當你的瀏覽器需要向伺服器傳送資料時,它就會使用POST HTTP請求方法。例如,如果你在一個網站上填寫了一個聯絡表並提交,你就使用了POST請求,這樣伺服器就會收到這些資訊。
- PUT -PUT請求在功能上與POST方法相似。然而,你使用PUT請求來更新終端伺服器上已經存在的資訊,而不是提交資料。
還有一些其他型別的HTTP請求你可以使用,包括DELETE、PATCH和OPTIONS方法。然而,它們在日常使用中相對不常見。
提交一個HTTP請求涉及到以特定的格式向接收伺服器傳送一個訊息。伺服器返回一個響應,而客戶端則採取相應的行動。例如,它可以載入資源或重新引導你到另一個頁面。
當你得到一個HTTP錯誤時,通常是因為伺服器不能滿足你的請求。你得到的錯誤程式碼應該說明原因。HTTP錯誤的一些最常見的原因包括無法連線到伺服器並找到所請求的資源。
HTTP請求和響應結構的介紹
HTTP請求和響應有著相似的結構。如果你想通過分析HTTP請求和響應來了解網站的潛在錯誤,那麼瞭解這些結構就很重要。
一般來說,HTTP請求被分為三個部分。讓我們仔細看看每一個部分。
HTTP請求行
每個HTTP請求都以一行開始,表明你使用的是什麼型別的方法和HTTP協議的版本。例如,一個HTTP GET請求的開頭可以是這樣的:
GET /XXX HTTP/1.1
在這種情況下,GET方法後面的 “XXX” 字樣表示你要接收的檔案。
HTTP響應的開始部分重新重申了雙方使用的協議版本。它還包括一個HTTP程式碼,與響應的狀態相對應。
如果你訪問一個網站併成功載入,你會看到一個2XX的HTTP成功資訊:
HTTP/1.1 200 OK
如果資源因任何原因無法載入,HTTP響應的這一部分將顯示錯誤程式碼。如果伺服器找不到這個頁面,你會看到一個類似這樣的響應頭:
HTTP/1.1 400 OK
如果你瞭解請求方法和HTTP狀態碼,那麼起跑線就能準確地告訴你客戶端和伺服器之間正在進行什麼樣的交易。總的來說,這是請求中最簡單的部分,可以理解。
請求標頭
請求頭緊隨請求行之後,它們提供了關於交易的額外資訊。頭部指定了關於主機的資訊,終端客戶使用的網路伺服器軟體,客戶的使用者代理是什麼,以及更多。
下面是一個HTTP請求標頭的樣子:
Host: website.com User-Agent: Chrome/5.0 (Windows 10) Accept-Language: en-US Accept-Encoding: gzip, deflate Connection: keep-alive
這些只是你可以使用的HTTP標頭引數的一些例子。下面是該標頭中每一行的含義:
- Host: 這是你發出請求的伺服器的IP或URL。
- User-agent: 這個引數包含有關客戶端及其作業系統(OS)的資訊。通常情況下,它概述了你所使用的瀏覽器及其版本。
- Accept-language: 這一行告訴伺服器客戶喜歡什麼語言,以防你請求的檔案有多個版本。
- Accept-encoding: 這一行表示客戶端可以處理的編碼或壓縮型別。
- Connection: 這個引數告訴伺服器是否保持連線狀態或為其設定超時。如果連線在完成請求前超時,你會收到一個錯誤。
讓我們把請求行和標標頭檔案放在一起,以瞭解你需要使用的整體結構:
GET /XXX HTTP/1.1 Host: website.com User-Agent: Chrome/5.0 (Windows 10) Accept-Language: en-US Accept-Encoding: gzip, deflate Connection: keep-alive
在上面的例子中,你正在向website.com主機提交一個GET請求,以獲取一個特定的資源。現在,讓我們看看響應中的頭像是怎樣的:
HTTP/1.1 200 OK Date: Mon, 27 Jul 2022 12:28:53 GMT Server: Apache/2.2.14 (Win32) Last-Modified: Wed, 22 Jul 2022 19:15:56 GMT Content-Length: 88 Content-Type: text/html Connection: Closed
響應頭從第二行開始,它包括連線的日期和關於主機使用什麼網路伺服器和作業系統的資訊。如果你請求的是一個檔案,頭也會顯示它的最後修改日期,檔案有多長,以及你處理的是什麼型別的內容。最後一行告訴你,由於請求已經完成,連線已經關閉。
標題中的資訊和引數可能會有所不同,這取決於你所做的是什麼樣的請求。然而,整體結構仍然是相同的。
HTTP報文主題
報文主題是HTTP請求中最直接的部分。它包含了你要傳送或接收的資料,這取決於你所使用的請求方法。
如果你用GET方法請求一個HTML檔案,你可能會收到一個結構如下的響應:
HTTP/1.1 200 OK Date: Mon, 27 Jul 2022 12:28:53 GMT Server: Apache/2.2.14 (Win32) Last-Modified: Wed, 22 Jul 2022 19:15:56 GMT Content-Length: 88 Content-Type: text/html Connection: Closed <!DOCTYPE HTML PUBLIC “-//IETF//DTD HTML 2.0//EN”>
檔案的其餘部分在這裡
HTTP請求或響應的主體是用一個空行與標頭分開的。我們在上面的例子中沒有包括一個完整的HTML檔案,以避免混淆。
如何監控和排除HTTP請求的故障
有幾種方法可以監測網站上的HTTP請求,例如使用應用效能管理(APM)工具。這些工具可以讓你監控網站上的 “transactions”,如PHP任務、HTTP錯誤、資料庫請求等等。
如果你是Kinsta的使用者,你可以使用一個內建的APM工具,你可以從MyKinsta儀表盤上啟用。Kinsta APM工具可以讓你檢查你的網站正在接收哪些型別的外部HTTP請求,並監控它們的狀態:
MyKinsta
它還能讓你監測反覆出現的HTTP錯誤,這在排除網站故障時很方便。如果你在網站中看到一個HTTP狀態錯誤,你可以啟用Kinsta APM,複製這個錯誤,並從請求中獲取細節。
APM工具還可以幫助你識別DDoS攻擊,這應該是相當容易發現的,因為你會看到一連串的HTTP請求。知道你是在處理DDoS攻擊還是流量激增,將有助於你想出如何處理這種情況。
小結
瞭解什麼是HTTP請求以及它們是如何工作的,可以幫助你解決網站的問題。當你遇到HTTP錯誤時,這意味著伺服器無法滿足客戶的請求。如果你知道那個請求是什麼,並理解HTTP響應中的錯誤程式碼,你就有足夠的資訊來解決問題。
要了解一個HTTP請求,你就需要知道它可以使用哪些方法。此外,你還需要知道HTTP請求和響應的結構,並瞭解不同的HTTP狀態程式碼。
評論留言