理解 HTTP

LeoooY發表於2019-02-14

封面圖片來自Google

概述

Http

超文字傳輸協議 HypeText Transfer Protocol

  • 是一種用於分散式、協作式和超媒體傳輸的應用層協議
  • HTTP是全球資訊網的資料通訊基礎

http是客戶端與伺服器做出請求響應的標準(基於TCP)。

通常,由HTTP客戶端發起一個請求,繼而建立一個到伺服器指定埠(預設80)的TCP連線。 HTTP伺服器則在該埠上監聽客戶端的請求,一旦受到請求,就會向客戶端返回一些響應,一般包含協議版本、HTTP狀態碼以及返回的內容

此外,在客戶端和伺服器中間還可能存在多箇中間層,比如代理伺服器、閘道器或者隧道等。

協議版本

  • 1999.6 HTTP/1.1
  • 2015.5 HTTP/2
  • 2018 提出HTTP/3
    基於QUIC,標準制定中..

HTTP訊息結構概述

  • 客戶端請求
    • 請求行
    • 請求頭
    • 空行
    • 請求主體 body
Example
GET /hello.text HTTP/1.1  //請求行
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi   //請求頭部
//空行
//請求資料
複製程式碼
  • 伺服器響應
    • 狀態行
    • 響應頭
    • 空行
    • 響應正文 body
HTTP/1.1 200 OK         //狀態行
Date: Mon, 27 Jul 2009 12:28:53 GMT  //訊息報文
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
//空行
//響應正文
複製程式碼

接下來會對一些常見的知識點進行展開

  • 客戶端請求
    • HTTP協議8種請求型別
  • 服務端響應
    • 常見狀態碼
  • 常見頭欄位
    • 通用頭
    • 請求頭
    • 響應頭
    • 實體頭
  • 代理 (Proxieds
  • HTTPS
    • TLS加密
    • SSL加密
  • HTTP2/HTTP3

進一步

HTTP8種請求型別

HTTP/1.1協議種定義了8種方法,以不同的方式操作指定資源:

  • GET

讀取資源,不產生副作用

  • HEAD

GET類似,區別在於不會包含響應正文

  • POST

請求包含請求正文

  • PUT

向指定資源位置上傳其最新內容。

  • TRACE

回顯伺服器收到的請求,主要用於測試或診斷

  • OPTIONS

這個方法可使伺服器傳回該資源所支援的所有HTTP請求方法。用'*'來代替資源名稱,向Web伺服器傳送OPTIONS請求,可以測試伺服器功能是否正常運作。

  • CONNECT

HTTP/1.1協議中預留給能夠將連線改為管道方式的代理伺服器。通常用於SSL加密伺服器的連結(經由非加密的HTTP代理伺服器)。

常見響應狀態碼

1XX 訊息

這一類狀態碼代表請求已經被接受,需要繼續處理。這類響應是臨時響應。
HTTP/1.0協議中沒有定義1XX狀態碼,所以一般伺服器禁止傳送1XX響應碼

2XX 成功

表示請求已成功被伺服器接受、理解,並接受

  • 200 OK 表示從客戶端發來的請求在服務端被正確處理

  • 204 No Content 伺服器成功處理了請求,沒有返回任何內容 (不含響應正文)

  • 205 Reset Content 表示請求成功,沒有返回響應正文,與204的區別在於要求請求方重置內容

  • 206 Partial Content 客戶端進行指定內容範圍的請求(斷點下載)

3XX 重定向

這類狀態碼百事需要客戶端採取進一步的操作才能完成請求。通常用來重定向後續請求地址在響應的location域中指明。

  • 301 Moved Permanatly 永久重定向,表示資源已經被分配了新的URL

  • 302 Found 臨時重定向,表示資源臨時被分配了新的URL

  • 303 See Other 表示資源存在另一個URL,應使用GET方法獲取資源

  • 304 Not Modified 表示請求的資源與之前請求頭中引數指定的版本相比,沒有做修改。 在這種情況下,由於客戶端任具有之前下載的副本,因此不需要重新傳輸資源

  • 307 Temporary Redirect 臨時重定向,與302類似。區別在於後續請求仍使用原始的URL

4XX 客戶端錯誤

  • 400 Bad Request 明顯的客戶端錯誤:請求報文語法錯誤、請求超過限制大小、無效的請求或欺騙性路由請求
  • 401 Unauthorized 沒有認證的請求,表示當前請求需要使用者驗證。 請求需要包含一個正確的Authorization證書頭資訊。 另外,有的網站禁止從特定的IP地址傳送的請求,也是返回401。
  • 403 Forbidden 表示對請求資源的訪問被伺服器拒絕
  • 404 Not Found 請求失敗,表示在伺服器上沒有找到請求的資源。 廣泛適用於當伺服器不想解釋為何請求被拒絕或有無其他可用響應的適合。 (被強行拒絕,沒有為什麼)

5XX 服務端錯誤

  • 500 Internal Server Error 表示伺服器端執行請求時候發生了錯誤
  • 501 Not Implemented 表示伺服器不支援當前請求所需要的某個功能
  • 503 Service Unavailable 表示臨時的伺服器停機維護或者過載,會在一段時間以後恢復。

HTTP Headers

HTTP Headers頭欄位是客戶端和伺服器進行請求和響應時候傳遞的額外資訊。根據頭欄位作用大致分組AuthenticationCachingClient hintsConditionalConnention ManagementContent negontiationControlsCookiesCORSDo not trackDownloadsMessage Body InformationProxiesRedirectsRequest ContextRespose ContextRange RequestSecurityServer-sent eventTransfering CodeWebsocketOther 參考 | MDN

HTTPS

HTTPS 還是通過了 HTTP 來傳輸資訊,只不過資訊通過 TLS或者SSL 協議進行了加密。 圖解TSL/SSL | 阮一峰

參考:

水平有限,可能會有許多不準確的地方,歡迎指正!

相關文章