HTTP 詳解

我的bug寫的太好了發表於2018-12-05

參考地址: https://developer.mozilla.org/zh-CN/docs/W...


版本區別

  • HTTP/0.9 : 單行協議
  • HTTP/1.0 : 構建可擴充套件性
  • HTTP/1.1 標準協議
    • 連線可以複用,節省了多次開啟TCP連線載入網頁文件資源的時間。
    • 增加流水線操作,允許在第一個應答被完全傳送之前就傳送第二個請求,以降低通訊延遲。
    • 支援響應分塊。
    • 引入額外的快取控制機制。
    • 引入內容協商機制,包括語言,編碼,型別等,並允許客戶端和伺服器之間約定以最合適的內容進行交換。
    • 感謝Host頭,能夠使不同域名配置在同一個IP地址的伺服器上。
  • HTTP2/
    • HTTP/2是二進位制協議而不是文字協議。不再可讀,也不可無障礙的手動建立
    • 這是一個複用協議。並行的請求能在同一個連結中處理,移除了HTTP/1.x中順序和阻塞的約束。
    • 壓縮了headers。因為headers在一系列請求中常常是相似的,其移除了重複和傳輸重複資料的成本。
    • 其允許伺服器在客戶端快取中填充資料,通過一個叫伺服器推送的機制來提前請求。

快取

  • 禁止快取: 不得儲存客戶端或服務端響應的內容
    Cache-Control: no-store
    Cache-Control: no-cache, no-store, must-revalidate
  • 強制確認快取:使用副本之前伺服器端都會驗證請求中所描述的快取是否過期
    Cache-Control: no-cache
  • 公共快取: 響應可以被任何中間人快取 :例如 (中間代理,CDN)
    Cache-Control: public
  • 私有快取:響應是專用於某單個使用者的 (預設私有)
    Cache-Control: private
  • 快取過期:響應時間 + 快取時間 是否大於 當前時間
    Cache-Control: max-age=31536000
  • 確認快取:本地未過期使用本地副本。過期則去伺服器端校驗
    Cache-Control: must-revalidate

Cookie

  • 會話期: 瀏覽器關閉之後它會被自動刪除
    Cookie: yummy_cookie=choco; tasty_cookie=strawberry
  • 持久期: 指定一個特定的過期時間
    Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
  • Secure 和 HttpOnly 標記 :secure -> 只能通過HTTPS協議傳送 ; HttpOnly -> 無法通過指令碼(javascirpt)訪問
    Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
  • 作用域 : Domain 和 Path 標識定義了Cookie的作用域:即Cookie應該傳送給哪些URL

訪問控制(CORS)

  • 跨網站請求 : https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS

訊息頭

  • 一般訊息頭 : 同時適用於請求和訊息的響應, 但與最終訊息主體中傳輸的資料無關
    • Remote Address : 請求的遠端地址
    • Referrer Policy : 來源請求資訊
      • no-referrer : 不傳遞 Referrer 報頭的值
      • no-referrer-when-downgrade : 當發生降級( 比如從 https:// 跳轉到 http:// )時
      • same-origin : 同源,即當協議、域名和埠(如果有一方指定的話)都相同
      • origin : 將當前頁面過濾掉引數及路徑部分,僅將協議、域名和埠傳遞
      • unsafe-url : 任意情況下,都傳送當前頁的全部地址到 Referrer
      • Keep-Alive : 暗示請求者連線狀態。 超時時長和最大連線數
  • 請求頭 : 包含更多有關獲取的資源和客戶端本身資訊的訊息頭
    • Accept : 告知伺服器 ,客戶端能處理的內容型別
    • Accept-Encoding : 告知伺服器, 傳輸資料應採用那種加密方式
    • Accept-Language : 客戶端宣告它可以理解的自然語言
    • Accept-Charset : 客戶端宣告可以處理的字符集型別
    • Pragma : 用於向後相容 HTTP1.0協議的伺服器
    • Connection : 決定當前的事務完成後,是否會關閉網路連線
      • keep-alive : 持久
      • close : 關閉
    • Referer : 當前請求頁面的來源頁面的地址
    • Upgrade-Insecure-Requests : 客戶端優先選擇加密及身份驗證
    • User-Agent : 發起請求的使用者代理資訊
    • Content-Location : 返回資料的實際地址 ( 不需要協商 )
    • Access-Control-Request-Headers: 預檢請求 (真正的請求採用哪些首部欄位)
    • From : 傳送方聯絡方式
    • Proxy-Authorization : 使用者代理提供給代理伺服器的用於身份驗證的憑證
    • If-Range : 用於斷點續傳的下載過程中
  • 響應頭 : 包含有關響應的補充資訊, 位置資訊,版本
    • Content-Type : 告訴客戶端實際傳送的資料型別
    • Transfer-Encoding : 告訴客戶端安全傳遞採用的編碼格式
      • chunked : 資料以一系列分塊的形式進行傳送
      • deflate : 採用 zlib 結構
      • gzip : 表示採用 Lempel-Ziv coding 壓縮演算法
      • identity : 未經過壓縮和修改
    • Vary : 告訴客戶端如何進行篩選, 快取是否可用
    • Expires : 響應的過期時間
    • X-Ua-Compatible : 以哪個低版本的IE瀏覽器來渲染頁面
    • Location : 告知客戶端頁面重新定向至新的地址
    • Access-Control-Allow-Headers : 預檢請求 (列出真正請求的首部資訊)
    • Access-Control-Allow-Credentials : 是否可將請求的響應暴露給頁面
    • Access-Control-Allow-Origin : 響應資源是否共享
    • Content-Range : 顯示的是一個資料片段在整個檔案中的位置
    • WWW-Authenticate : 定義了使用何種驗證方式去獲取對資源的連線
    • ETag : 資源的特定版本的識別符號 (加密) 避免快取碰撞
    • Retry-After : 使用者代理需要等待多長時間之後才能繼續傳送請求
    • Clear-Site-Data : 清除當前遊覽網站的資料 ( cookie, 儲存, 快取 )
      • cache : 刪除響應的本地快取資料
      • cookies : 刪除響應的本地所有cookie
      • storage: 刪除響應的所有DOM儲存
      • executionContexts : 服務端希望瀏覽器重新載入本請求
      • *
    • Server : 伺服器的版本資訊
    • X-Content-Type-Options : 提醒遊覽器遵循 Content-Type 的設定
  • 實體頭 : 包含更多主體資訊
    • Content-Length : 用來指定傳送方和接收方訊息主體大小
    • Content-Disposition : 內容以何種形式展示
      • inline : 訊息體會以頁面的一部分或者整個頁面的形式展示
      • attachment : 訊息體應該被下載到本地
        • filename : 指定名稱

狀態碼

  • 資訊響應
    • 100 : 迄今為止的所有內容都是可行的
    • 102 : 伺服器已收到並正在處理該請求,但沒有響應可用
  • 成功響應
    • 200 : 請求成功
    • 201 : 請求成功, 並建立一個新的資源 ( PUT請求之後傳送的響應 )
    • 202 : 請求已經接受到, 但還未響應
    • 204 : 伺服器成功處理了請求,但不需要返回任何實體內容
    • 205 : 伺服器成功處理了請求, 不返回任何實體內容。 但需要請求者重置文件檢視
    • 206 : 實現斷點續傳,大檔案分段下載的響應
  • 重定向
    • 300 : 使用者或瀏覽器能夠自行選擇一個首選的地址進行重定向
    • 301 : 被請求的資源已永久移動到新位置
    • 302 : 請求的資源現在臨時從不同的 URI 響應請求
    • 304 : 自上次訪問以來或者根據請求的條件並沒有改變
  • 客戶端響應
    • 400 : 語義有誤,當前請求無法被伺服器理解
    • 401 : 當前請求需要使用者認證
    • 403 : 伺服器已經理解請求,但是拒絕執行它
    • 404 : 資源未在伺服器上找到
    • 405 : 請求行中指定的請求方法不能被用於請求相應的資源
    • 406 : 請求的資源的內容特性無法滿足請求頭中的條件,因而無法生成響應實體。
    • 408 : 請求超時
    • 410 : 請求的資源在伺服器上已不可用
    • 411 : 伺服器拒絕在沒有定義 Content-Length 頭的情況下接受請求
    • 413 : 請求提交的實體資料大小超過了伺服器願意或者能夠處理的範圍
    • 414 : 請求的URI 長度超過了伺服器能夠解釋的長度
    • 415 : 請求中提交的實體並不是伺服器中所支援的格式
    • 416 : 請求頭包含Range 請求頭, 同時請求中又沒有定義 If-Range 請求頭
    • 429 : 使用者在給定的時間內傳送了太多請求(“限制請求速率”)
    • 451 : 使用者請求非法頁面
  • 服務端響應
    • 500 : 伺服器故障
    • 503 : 伺服器沒有準備好處理請求
    • 504 : 伺服器作為閘道器,不能及時得到響應時返回此錯誤程式碼
    • 505 : 伺服器不支援請求中使用的HTTP協議
    • 507 : 伺服器有內部配置錯誤
    • 508 : 伺服器在處理請求時檢測到無限迴圈。
    • 510 : 伺服器需要對請求進一步擴充套件才能實現它。
    • 511 : 客戶端需要進行身份驗證才能獲得網路訪問許可權
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章