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 ![](http://static.javashuo.com/static/loading.gif)
- 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,對做者也是一種鼓勵