Http系列:http1.1協議基礎

http協議格式

ABNF

巴科斯範式的英文縮寫爲BNF,它是以美國人巴科斯(Backus) 和丹麥人諾爾 (Naur) 的名字命名的一種形式化的語法表示方法,用於描述語法的一種形式體系,是一種典型的元語言。又稱巴科斯-諾爾形式(Backus-Naurform)。它不只能嚴格地表示語法規則,並且所描述的語法是與上下文無關的。它具備語法簡單,表示明確,便於語法分析和編譯的特色。html

擴充巴科斯-瑙爾範式(ABNF)是一種基於巴科斯-瑙爾範式(BNF)的元語言。git

問:爲何用ABNF來定義HTTP協議呢
答:舉個例子,如圖所示 github


這種表達看似挺正確的,其實稍不注意就錯誤百出,並且並不容易發現。好比Host:後沒有空格, Content-Type中間不是-而是_。這就形成了協議的錯誤。

這就須要嚴謹的表達協議的格式:ABNF格式
下面簡單介紹ABNF中經常使用的操做符,具體請點擊上面的連接。c#

  • 空白字符:用來分割定義中的各個元素。
  • 選擇/:表示多個規則都是可供選擇的規則
  • 值範圍%c##-##:OCTAL = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7"與OCTAL = %x30-37等價
  • 序列組合():將規則組合起來,視爲單個元素。
  • 不定量重複m*n:
    一、*元素表示零個或更多元素
    二、1*元素表示一個或更多元素
  • 可選序列[]

再來看看核心規則:緩存

規則 形式定義 意義
DIGIT %x30-39 數字(0-9)
HEXDIF DIGIT / "A" / "B" / "C" / "D" / "E" / "F" 十六進制數字(0-9, A-F, a-f)
SP %x20 空格
HTAB %x09 橫向製表符
VCHAR %x21-7E 可見打印字符
CRLF %x0D %x0A 互聯網標準換行

基於ABNF描述的HTTP協議格式

HTTP-message = start-line *(header-fielf CRLF) CRLF [message-body]服務器

  • start-line = request-line / status-line
    一、request-line = method SP request-target SP HTTP-version CRLF
    二、status-line = HTTP-version SP status-code SP reason-phrase CRLF
  • header-field = field-name ":" OWS field-value OWS
    一、OWS = *(SP / HTAB)
    二、field-name = token
    三、field-value = *(field-content / obs-fold)
  • message-body = *OCTET

在wireshark中 網絡

能夠看到Host中是以0d0a結尾的,也就是CRLF換行。
接下來逐行解釋HTTP協議

請求行

request-line = method SP request-target SP HTTP-version CRLF oop

  • method方法:指明操做目的,動詞
  • request-target = origin-form / absoulte-form / authority-form / asterisk-form
    origin-form = absolute-path["?" query]。
    向origin server發起的請求,path爲空時必須傳遞/
  • absolut-form = absolute-URI
    僅用於向正向代理proxy發起請求時
  • authority-form = authority
    僅用於CONNECT方法
  • asterisk-form = "*"
    僅用於OPTIONS方法

HTTP-version版本號:學習

  • HTTP/0.9: 只支持GET方法,過期
  • HTTP/1.0: RFC1945, 1996, 常見使用於代理服務器
  • HTTP/1.1: RFC2616, 1999
  • HTTP/2.0: 2015年正式發佈

Method常見方法:ui

  • GET:獲取資源,冪等。
  • HEAD:相似GET,但服務器不發送body,用以獲取HEAD元數據,冪等。
  • POST:用於提交form表單,新增資源等。
  • PUT:更新資源,帶條件時時冪等。
  • DELETE:刪除資源,冪等。
  • CONNECT:創建tunnel隧道。
  • OPTIONS:顯示服務器對訪問資源支持的方法,冪等。

響應行

status-line = HTTP-version SP status-code SP reason-phrase CRLF

  • status-code = 3DIGIT
  • reason-phrase = *(HTAB / SP / VCHAR / obs-text)

status-code:
一、1xx:請求已收到,須要進一步處理才能完成,HTTP1.0不支持

  • 100Continue:上傳大文件前使用,由客戶端發起請求中攜帶Expect:100-continue頭部觸發
  • 101Switch Protocols:協議升級使用,由客戶端發起請求中攜帶Upgrade:頭部觸發
  • 102Processing:表示服務器已經收到並正在處理請求,但無響應可用。

二、2xx:成功處理請求

  • 200OK:成功返回響應
  • 201Created:有新資源在服務器端被成功建立
  • 202Accepted:服務器接收並開始處理請求,但請求未處理完成
  • 203Non-Authoriative Informatino:當代理服務器修改了origin server的原始響應包體時,代理服務器能夠經過修改200爲203方式告知客戶端這一事實
  • 204No Content:成功執行了請求且不攜帶響應包體,並暗示客戶端無需更新當前的頁面
  • 205Reset Content:成功執行了請求且不攜帶響應體,同時指明客戶端須要更新當前頁面
  • 206Partial Content:使用range協議時返回部分響應內容的響應碼
  • 207Multi-Status:在WEBDAV協議中以XML返回多個資源的狀態
  • 208Already Reportd:爲避免相同集合下資源在207響應碼下重複上報,使用208可使用父集合的響應碼

三、3xx:重定向使用Location指向的資源或者緩存中的資源。並且規定客戶端重定向次數不該該超過5次,以防止死循環。

  • 300Multiple Choiecs:資源有多種表述,經過300返回給客戶端後由其自行選擇訪問哪種表述。
  • 301Moved Permanently:資源永久性的重定向到另外一個URI中
  • 302Found:資源臨時的重定向到另外一個URI中。
  • 303See Other:重定向到其餘資源,經常使用於POST/PUT等方法的響應中。
  • 304Not Modified:當客戶端擁有可能過時的緩存時,會攜帶緩存的標示etag、時間等信息詢問服務器緩存是否仍可複用,而304是告訴客戶端能夠重用緩存
  • 307Temporary Redirect:相似302,但明確重定向後請求方法必須與原請求方法相同,不得改變。

四、4xx:客戶端出現錯誤

  • 400Bad Request:服務器認爲客戶端出現了錯誤,但不能明確判斷爲一下哪一種錯誤時,使用此錯誤碼
  • 401Unauthorized:用戶認證信息確實或者不正確,致使服務器沒法處理請求
  • 403Forbidden:服務器理解請求的含義,但沒有權限執行此請求
  • 404Not Found:服務器沒有找到對應的資源
  • 405Method Not Allowed:服務器不支持請求行中的method方法
  • 406Not Acceptable:對客戶端指定的資源表述不存在,服務器返回表述列表供客戶端選擇
  • 407Proxy Authentication Required:對須要經由代理的請求,認證信息未經過服務器的驗證
  • 408Reqest Timeout:服務器接收請求超時
  • 409Confli:資源衝突
  • 410Gone:服務器沒有找到對應的資源,且明確的知道該位置永久性找不到該資源
  • 411Length Required:若是請求含有包體且爲攜帶Content-Length頭部,且不屬於chunk類請求時返回
  • 412Precondition Failed:複用緩存時傳遞的If-Umodified-Since或If-None-Match頭部不被知足
  • 413Payload Too Large/Request Entity Too Large:請求的包體超出服務器能處理的最大長度
  • 414URI Too Long:請求的URI超出服務器能接受的最大長度
  • 415Unsupported Media Type:上傳的文件類型不被服務器支持
  • 416Range Not Satisfiable:沒法提供Range請求中的指定的那段包體
  • 417Expectation Failed:對於Expect請求頭部期待的狀況沒法知足時的響應碼
  • 421Misdirected Request:服務器認爲這個請求不應發給它,由於它沒能力處理
  • 426Upgrade Required:服務器拒絕基於當前HTTP協議提供服務,經過Upgrade頭部告知客戶端必須升級協議才能繼續處理
  • 428Precondition Required:用戶請求中缺失了條件類頭部,例如If-Match
  • 429Too Many Requests:客戶端發送請求的速率過快
  • 431Request Header Fields Too Large:請求的HEADER頭部大小超出限制
  • 451Unavailable For Legal Reasons:因爲法律緣由不可訪問

五、5xx:服務器出現錯誤

  • 500Internal Server Error:服務器內部錯誤,且不屬於如下錯誤類型
  • 501Not Implemented:服務器不支持實現請求所須要的功能
  • 502Bad Gateway:代理服務器沒法獲取到合法資源
  • 503Service Unavailable:服務器資源還沒有準備好處理當前請求
  • 504Gateway Timeout:代理服務器沒法及時的從上游得到響應
  • 505HTTP Verson Not Supported:請求使用的HTTP協議版本不支持
  • 507Insufficient Storage:服務器沒有足夠的空間處理請求
  • 508Loop Detected:訪問資源時檢測到循環
  • 511Network Authentication Required:代理服務器發現客戶端須要進行身份驗證才能得到網絡訪問權限

總結

學習ABNF語法,有助於咱們更好的理解和更爲嚴謹學習HTTP協議。

備註

更多文章請移步樓主github,若是喜歡請點一下star,對做者也是一種鼓勵

相關文章
相關標籤/搜索