《一篇就夠系列》之HTTP詳解,覆蓋高頻面試考點!

JavaBuild發表於2024-10-28

一、寫在開頭

前幾篇博文大概介紹了什麼是網路程式設計,以及網路程式設計的實戰作用,今日起,我們將針對裡面涉及到的重要知識點,進行詳細的梳理與學習!

在整個WEB程式設計中,有個應用層的協議是我們無法跳過的,那就是HTTP,一個超文字傳輸協議 我們瀏覽網頁的時候,它總是第一個出現,我們今天就來學習瞭解一下它。

二、HTTP

2.1 HTTP的定義

HTTP是應用層的一個重要協議,中文譯為超文字傳輸協議,是基於TCP協議之上的,主要為WEB瀏覽器和WEB伺服器通訊所設計,可傳輸超文字和多媒體內容,當我們使用瀏覽器瀏覽網頁的時候,我們網頁就是透過 HTTP/HTTPS 請求進行載入的。

2.2 HTTP 響應狀態碼

HTTP狀態碼是描述HTTP請求結果的一個特定碼值,透過它我們可以快速定位到本次請求的問題出現在了哪裡。

在這裡插入圖片描述 狀態碼中,基本上以阿拉伯數字1-5作為開頭,分別代表不同含義,其中1XX我們很少看到,它表示服務端正在處理接收到的請求:

  1. 100 Continue:客戶端可以繼續請求。通常在客戶端已傳送請求的初始部分後使用,表示伺服器已接收請求的初步部分,客戶端應繼續傳送其餘部分。
  2. 101 Switching Protocols:伺服器正在切換到客戶端請求的協議。這在客戶端請求更改協議(如從 HTTP/1.1 切換到 HTTP/2)時使用。

2XX(成功狀態碼)

  1. 200(成功) 伺服器已成功處理了請求。這個狀態碼對servlet是預設的,如果沒有呼叫setStatus方法的話,就會得到 200;
  2. 201 Created:請求被成功處理並且在服務端建立了一個或多個新的資源。例如,透過 POST 請求建立一個新的使用者。
  3. 204(無內容) 伺服器成功處理了請求,未返回任何內容;
  4. 205(重置內容) 伺服器成功處理了請求,未返回任何內容,重置文件檢視,如清除表單內容;
  5. 206(部分內容) 伺服器成功處理了部分 GET 請求。

3XX(重定向狀態碼)

  1. 300(多種選擇) 伺服器根據請求可執行多種操作。伺服器可根據請求者 來選擇一項操作,或提供操作列表供其選擇;
  2. 301(永久移動) 請求的網頁已被永久移動到新位置。伺服器返回此響應時,會自動將請求者轉到新位置;
  3. 302(臨時移動) 伺服器目前正從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以後的請求。會自動將請求者轉到新位置;
  4. 304(未修改) 自從上次請求後,請求的網頁未被修改過,不會返回網頁內容;
  5. 305(使用代理) 請求者只能使用指定的代理訪問請求的網頁。

4XX(客戶端錯誤狀態碼)

  1. 400(錯誤請求) 伺服器不理解請求的語法 ;
  2. 401(身份驗證錯誤) 此頁要求授權;
  3. 403(禁止) 伺服器直接拒絕 HTTP 請求,不處理。一般用來針對非法請求;
  4. 404你請求的資源未在服務端找到。比如你請求某個使用者的資訊,服務端並沒有找到指定的使用者;
  5. 406(不接受) 無法使用請求的內容特性響應請求的網頁;
  6. 408(請求超時) 伺服器等候請求時發生超時;
  7. 414(請求的 URI 過長) 請求的 URI 過長,伺服器無法處理。

5XX(伺服器錯誤狀態碼)

  1. 500(伺服器內部錯誤) 伺服器遇到錯誤,無法完成請求;
  2. 503(服務不可用) 目前無法使用伺服器(由於超載或進行停機維護)。通常,這只是一種暫時的狀態;
  3. 504(閘道器超時) 伺服器作為閘道器或代理,未及時從上游伺服器接收請求;
  4. 505(HTTP 版本不受支援) 伺服器不支援請求中所使用的 HTTP 協議版本。

2.2 HTTP請求報文

根據如下報文案例,我們看一下,其中①,②和③屬於請求行;④屬於請求頭;⑤屬於報文體。 在這裡插入圖片描述

  • ① 是請求方法,HTTP/1.1 定義的請求方法有8種:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE,最常的兩種GET和POST;
  • ② 為請求對應的URL地址,它和報文頭的Host屬性組成完整的請求URL;
  • ③ 是協議名稱及版本號;
  • ④ 是HTTP的報文頭,報文頭包含若干個屬性,格式為“屬性名:屬性值”,服務端據此獲取客戶端的資訊。
  • ⑤ 是報文體,它將一個頁面表單中的元件值透過param1=value1&param2=value2的鍵值對形式編碼成一個格式化串,它承載多個請求引數的資料。不但報文體可以傳遞請求引數,請求URL也可以透過類似於“/chapter15/user.html? param1=value1&param2=value2”的方式傳遞請求引數。

2.3 HTTP VS HTTPS

我們從下圖四個方面,對比分析HTTP與HTTPS。 在這裡插入圖片描述

  • 埠號: HTTP的埠號是80,而HTTPS的埠號是443;
  • URL字首: HTTP 的 URL 字首是 http://,HTTPS 的 URL 字首是 https://;
  • 安全性和資源消耗: HTTP是執行在TCP之上的協議,傳輸皆為明文,客戶端和服務端無法驗證對方身份,而HTTPS是執行在SSL/TLS之上的,傳輸內容經過了對稱加密,並且堆成加密的秘鑰,又在伺服器端進行了非對稱加密,相對HTTP安全很多,不過因為這一系列的操作,也讓HTTPS耗費了更多的伺服器資源;
  • SEO: 搜尋引擎通常會更青睞使用 HTTPS 協議的網站,因為 HTTPS 能夠提供更高的安全性和使用者隱私保護。使用 HTTPS 協議的網站在搜尋結果中可能會被優先顯示,從而對 SEO 產生影響。

2.4 HTTP不同版本

自1996年5月公佈的HTTP1.0版本開始,經歷了幾十年時間,HTTP已經誕生了1.0,1.1,2.0,3.0等諸多版本,順勢時代發展,不斷向前進步!

2.4.1 HTTP1.0 VS HTTP1.1

  1. 連線方式:HTTP1.0 為短連線,需要使用 keep-alive 引數建立長連線,HTTP1.1 預設支援keep-alive長連線。
  2. 狀態響應碼:HTTP1.1在原有的基礎上增加了很多的響應碼,光是錯誤響應狀態碼就新增了 24 種,如100、204、409、410等。
  3. 快取機制:在 HTTP1.0 中主要使用 Header 裡的 If-Modified-Since,Expires 來做為快取判斷的標準,HTTP1.1 則引入了更多的快取控制策略例如 Entity tag,If-Unmodified-Since, If-Match, If-None-Match 等更多可供選擇的快取頭來控制快取策略。
  4. 頻寬:HTTP1.0無法請求部分物件內容,不能斷點續傳,在HTTP1.1在請求頭引入了 range 頭域,它允許只請求資源的某個部分,即返回碼是 206(Partial Content),這樣就方便了開發者自由的選擇以便於充分利用頻寬和連線。
  5. Host頭處理:HTTP1.1 引入了 Host 頭欄位,允許在同一 IP 地址上託管多個域名,從而支援虛擬主機的功能。而 HTTP1.0 沒有 Host 頭欄位,無法實現虛擬主機。

2.4.2 HTTP1.1 VS HTTP2.0

  1. 多路複用:HTTP2.0在同一個連線中允許同時傳輸多個請求和響應,互不干擾。而HTTP1.1中則採用的是序列方式,每個請求和響應都需要一個連線來處理,由於瀏覽器為了資源損耗控制在了6-8個TCP連線數限制,這樣HTPP1.1的處理速度大大受限。 在這裡插入圖片描述

  2. 二進位制幀:HTTP2.0 使用二進位制幀進行資料傳輸,而 HTTP1.1 則使用文字格式的報文。二進位制幀更加緊湊和高效,減少了傳輸的資料量和頻寬消耗。

  3. 頭部壓縮:HTTP1.1 支援Body壓縮,Header不支援壓縮。HTTP2.0 支援對Header壓縮,使用了專門為Header壓縮而設計的 HPACK 演算法,減少了網路開銷。

2.4.3 HTTP2.0 VS HTTP3.0

  1. 傳輸協議:HTTP2.0 是基於 TCP 協議實現的,HTTP3.0 新增了 QUIC(Quick UDP Internet Connections) 協議來實現可靠的傳輸,提供與 TLS/SSL 相當的安全性,具有較低的連線和傳輸延遲。你可以將 QUIC 看作是 UDP 的升級版本,在其基礎上新增了很多功能比如加密、重傳等等。HTTP3.0 之前名為 HTTP-over-QUIC,從這個名字中我們也可以發現,HTTP3.0 最大的改造就是使用了 QUIC。
  2. 建立連線: HTTP2.0 需要經過經典的 TCP 三次握手過程(由於安全的 HTTPS 連線建立還需要 TLS 握手,共需要大約 3 個 RTT)。由於 QUIC 協議的特性(TLS 1.3,TLS 1.3 除了支援 1 個 RTT 的握手,還支援 0 個 RTT 的握手)連線建立僅需 0-RTT 或者 1-RTT。這意味著 QUIC 在最佳情況下不需要任何的額外往返時間就可以建立新連線。
  3. 頭部壓縮:HTTP2.0 使用 HPACK 演算法進行頭部壓縮,而 HTTP3.0 使用更高效的 QPACK 頭壓縮演算法。
  4. 容錯性:HTTP3.0 具有更好的錯誤恢復機制,當出現丟包、延遲等網路問題時,可以更快地進行恢復和重傳。而 HTTP2.0 則需要依賴於 TCP 的錯誤恢復機制。
  5. 安全性:在 HTTP2.0 中,TLS 用於加密和認證整個 HTTP 會話,包括所有的 HTTP 頭部和資料負載。TLS 的工作是在 TCP 層之上,它加密的是在 TCP 連線中傳輸的應用層的資料,並不會對 TCP 頭部以及 TLS 記錄層頭部進行加密,所以在傳輸的過程中 TCP 頭部可能會被攻擊者篡改來干擾通訊。而 HTTP3.0 的 QUIC 對整個資料包(包括報文頭和報文體)進行了加密與認證處理,保障安全性。
  6. 連線遷移:HTTP3.0 支援連線遷移,因為 QUIC 使用 64 位 ID 標識連線,只要 ID 不變就不會中斷,網路環境改變時(如從 Wi-Fi 切換到移動資料)也能保持連線。而 TCP 連線是由(源 IP,源埠,目的 IP,目的埠)組成,這個四元組中一旦有一項值發生改變,這個連線也就不能用了。

三、總結

好啦,今天的HTTP學習就到這裡啦,其實對於java開發工程師而言,對於HTPP的瞭解程度,到此也就結束了,但對於網路工程師來說,HTPP是一個至關重要的知識,需要更深層次的去探究,推薦看《圖解 HTTP》這本書。

相關文章