前端基礎重點回顧2: HTTP協議

weixin_33895657發表於2018-01-24

HTTP協議的主要特點

  • 簡單快速
    URI固定,處理簡單
  • 靈活
    http協議可以通過修改header 指定傳輸的資料型別,一個http 傳輸可以完成不同資料型別的傳輸
  • 無連線
    http協議每次傳輸後連線都會斷開
  • 無狀態
    客戶端和服務端是兩塊,客戶端再次訪問服務端是無法區分客戶端的(單從http 協議上是無法區分客戶端身份的)

HTTP報文組成

請求報文

  • 請求行
    http方法、請求地址、http協議版本
  • 請求頭
    header:key value 格式
  • 空行(CR+LF)
    用於識別請求頭和請求體的分隔符,CR+LF 回車+換行符
  • 請求體

響應報文

  • 狀態行
    狀態碼、http協議版本
  • 響應頭
    header:key value 格式
  • 空行(CR+LF)
    用於識別響應頭和響應體的分隔符,CR+LF 回車+換行符
  • 響應體
    響應的實體內容

HTTP方法

  • get 獲取
  • post 傳輸
  • put 更新
  • delete 刪除
  • header 獲得報文首部
  • options 對伺服器預先請求告知

GET / POST 區別

  • get產生的url地址可以被收藏,post不可以
  • get會被瀏覽器主動快取,post不會,除非手動設定
  • get只能進行url編碼,post支援多種編碼方式
  • get引數會被完整保留在瀏覽器歷史記錄裡,post引數不會保留
  • get在url中引數有長度限制2kb,post沒有限制
  • 引數的資料型別:get只接受ASCII字元,post沒有限制
  • get引數直接暴露在url上,不能傳遞敏感資訊
  • get通過url傳遞,post放在request body中

HTTP狀態碼

1xx: 指示資訊 - 請求已接收

2xx: 成功 - 請求被成功接收

  • 200 OK
  • 206 Partiaml Content 客戶端傳送了一個帶Range頭多get請求,伺服器完成了它(音訊、視訊應用)

3xx: 重定向

  • 301 Moved Permanently 所請求的資源已經轉移至新的url地址
  • 302 Found 所請求的資源臨時轉移至新url地址
  • 304 Not Modified 客戶端有快取的文件併發出了一個條件性請求,伺服器告訴客戶端原來快取的資原始檔可以繼續使用

4xx: 客戶端錯誤

  • 400 Bad Request 客戶端存在語法錯誤,伺服器無法理解
  • 401 Unauthorized 請求未授權 必須和www-Authenticate 報頭域一起使用(JWT鑑權應用)
  • 403 Forbidden 請求被禁止訪問(只能通過伺服器端訪問)
  • 404 Not Found 請求的資源不存在

5xx: 伺服器錯誤

  • 500 Internal server Error 伺服器錯誤
  • 503 Server Unavailable 請求未完成或伺服器臨時過載當機

HTTP持久連線

HTTP協議採用“請求-應答”模式,每進行一次http連線就會斷開TCP連線

Keep-Alive

  • Keep-Alive 模式,只要有一方未明確表示斷開連線則保持TCP連線狀態,此功能避免重複建立連線
  • HTTP/1.0 未標準化
  • HTTP/1.1 版本預設支援

HTTP管線化

在HTTP/1.1 版本使用Keep-Alive 下可以使用管線化(pipelining)方式傳送請求

// 未使用管線化 單個請求
req1 > server
res1 < server

req2 > server
res2 < server

req3 > server
res3 < server
// 使用管線化 打包傳送
req1 > server
req2 > server
req3 > server

res1 < server
res2 < server
res3 < server
  • 管線化只通過Keep-Alive 完成,http/1.1 才支援
  • 只有get 和head 方法請求才可以,post 有限制
  • 初次建立連線不啟動管線化機制,因為對方伺服器不一定支援http/1.1
  • 管線化不會影響伺服器響應順序
  • http/1.1 要求服務端支援管線化處理不失敗即可
  • chrmoe firefox 預設未開啟管線化支援,因為管線化功能不一定能帶來效能提升,伺服器支援也不好。

Cookie 維持客戶端訪問狀態

瀏覽器每次訪問會攜帶cookie 資訊,伺服器可以設定cookie,通過這個特性可以建立帶狀態(session)的http 訪問連線

// 客戶端首次訪問服務端
client -----------無cookie------------> server
client <-----set-cookie: sid=user1----- server
// 客戶端再次訪問服務端
client -----cookie: sid=user1---------> server
client <--------確認是user1訪問---------- server

session 就是服務端手動維護每個客戶端訪問的cookie,可以維護在記憶體裡也可以維護在redis 快取中。

相關文章