HTTP探索之初學乍練

1、什麼是HTTP?

Hypertext Transfer Protocol(HTTP)協議(RFC7230)
一種無狀態的、應用層、以請求/應答方式運行的協議,它使用可擴展的語義和自描述消息格式,與基於網絡的超文本信息系統靈活的互動。
 web

2、HTTP請求行與響應行

請求行格式(ABNF方式描述)

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

HTTP常見方法(RFC7231)

GET:主要的獲取信息方法,大量的性能優化都針對該方法,冪等方法
HEAD:相似GET方法,但服務器不發送BODY,用以獲取HEAD元數據,冪等方法
POST:經常使用於提交HTML FORM表單、新增資源等
PUT:更新資源,帶條件時是冪等方法
DELETE:刪除資源,冪等方法
CONNECT:創建tunnel隧道
OPTIONS:顯示服務器對訪問資源支持的方法,冪等方法
TRACE:回顯服務器收到的請求,用於定位問題。有安全風險

Request-target

origin-form:後端請求資源的路徑,爲空時傳遞/
absolute-form:用於正向代理
authority-form:用於CONNECT方法
asterisk-form:用於OPTIONS方法

HTTP-version 版本號發展歷史

HTTP/0.9:只支持GET,已過期
HTTP/1.0:RFC1945,1996,常見使用於代理服務器(例如NGINX默認配置)
HTTP/1.1:RFC2616,1999
HTTP/2.0:2015.5 正式發佈 

 

響應行格式(ABNF方式描述)

Status-line = HTTP-version SP status-code SP reason-phrase CRLF
    status-code = 3DIGIT
        Reason-phrase=*(HTAB/SP/VCHAR/obs-text)

Status-code(響應碼)分類

響應碼規範:RFC6585(2012.4) RFC7231 (2014.6)
1xx:請求已經收到,須要進一步處理才能完成,HTTP1.0不支持算法

  • 100 Continue:上傳大文件前使用
    • 由客戶端發起請求中攜帶Expect:100-continue 頭部觸發
  • 101 Switch Protocols:協議升級使用
    • 由客戶端發起請求中攜帶Upgrade:頭部觸發,如升級websocket或者http/2.0
  • 102 Processing:WedDAV請求可能包含許多設計文件操做的子請求,須要很長時間才能完成請求。該代碼表示服務器已經收到並正在處理請求,但無響應可用。這樣能夠防止客戶端超時,並假設請求丟失。

2xx:成功處理請求後端

  • 200 OK:成功返回響應
  • 201 Created:有新資源在服務器端被成功建立
  • 202 Accepted:服務器接收並開始處理請求,但請求未處理完成。這樣一個模糊的概念是有意如此設計,能夠覆蓋更多的場景。例如異步‘須要長時間處理的任務。
  • 203 Non-Authoritative Information:當代理服務器修改了 origin server 的原始響應包體時(例如更換了HTML中的元素值),代理服務器能夠經過修改200爲203的方式告知客戶端這一事實,方便客戶端爲這一行爲做出相應的處理。203響應能夠被緩存。
  • 204 No Content:成功執行了請求且不攜帶響應包體,並暗示客戶端無需更新當前的頁面視圖
  • 205 Reset Content:成功執行了請求且不攜帶響應包體,同時指明客戶端須要更新當前頁面視圖
  • 206 Partial Content:使用range協議時返回部分響應內容時的響應碼
  • 207 Multi-Status:RFC4918 ,在WEBDAV協議中以XML返回多個資源的狀態
  • 208 Already Reported:RFC5842,爲避免相同集合下資源在207響應碼下重複上報,使用208可使用父集合的響應碼

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

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

4xx:客戶端出現錯誤瀏覽器

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

5xx:服務器端出現錯誤緩存

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

3、HTTP/1.1

一、connection頭部

connection:keep-alive 長鏈接(HTTP/1.1默認使用長鏈接,keep-alive無心義)
connection:close 短鏈接
 安全

二、host頭部

HTTP/1.1規範要求,不傳遞Host頭部則返回400錯誤響應碼
host頭部用於http消息在服務器端路由
Host頭部與消息的路由性能優化

一、創建TCP鏈接
    肯定服務器的IP地址
二、接收請求
三、尋找虛擬主機
    匹配Host頭部與域名
四、尋找URI的處理代碼
    匹配URI
五、執行處理請求的代碼
    訪問資源
六、生成HTTP響應
    各中間件基於PF架構串行修改響應
七、發送HTTP響應
八、記錄訪問日誌

 

三、代理服務器轉發消息時的頭部

X-Forwarded-For:用於代理服務器傳遞IP
X-Real-IP:用於傳遞用戶IP
Max-Forwards:限制Proxy代理服務器的最大轉發次數,僅對TRACE/OPTIONS方法有效
Via:指明通過的代理服務器名稱及版本
Cache-Control:禁止代理服務器修改響應包體
 服務器

四、請求與響應上下文頭部

User-Agent:指明客戶端的類型信息,服務器能夠據此對資源的表述作抉擇
Referer:瀏覽器對來自某一頁面的請求自動添加的頭部
From:主要用於網絡爬蟲,告訴服務器如何經過郵件聯繫到爬蟲的負責人
Server:指明服務器上所用軟件的信息,用於幫助客戶端定位問題或統計數據
Allow:告訴客戶端,服務器上該URI對應的資源容許哪些方法的執行
Accept-Ranges:告訴客戶端服務器上該資源是否容許range請求(容許服務器基於客戶端的請求只發送響應包體的一部分給到客戶端,而客戶端自動將多個片斷的包體組合成完整的體積更大的包體)
 websocket

五、內容協商與資源表述

Accept-Encoding:內容編碼,主要指壓縮算法協商
Accept-Language:語言協商
Content-type:資源表述,媒體類型、編碼
Content-encoding:資源表述,內容編碼
Content-Language:資源表述,語言
 

六、HTTP包體傳輸頭部

Content-Length:使用Content-Length頭部明確指出包體長度
Transfer-Encoding:指明使用Chunk 傳輸方式,含Transfer-Encoding 頭部後Content-Length頭部應被忽略
TE頭部:客戶端在請求在聲明是否接受Trailer頭部
Trailer頭部:服務器告知接下來chunk包體會傳輸哪些Trailer頭部

如下頭部不容許出如今Trailer 的值中:
        用於信息分幀的首部(例如Transfer-Encoding 和Content-Length)
        用於路由用途的首部(例如Host)
        請求修飾首部(例如控制類和條件類的,如Cache-Control, Max-Forwards, 或者TE)
        身份驗證首部(例如Authorization或者Set-Cookie)
        Content-Encoding, Content-Type, Content-Range, 以及Trailer 自身

 

七、Content-Disposition 頭部(RFC6266)

disposition-type =" inline"|" attachment"| disp-ext-type
inline: 指定包體是以inline 內聯的方式,做爲頁面的一部分展現
attachment: 指定瀏覽器將包體以附件的方式下載
在multipart/form-data類型應答中,能夠用於子消息體部分
 

八、Cookie與Set-Cookie頭部

Cookie-header:Cookie頭部中能夠存放多個name/value 名值對
Set-Cookie:Set-Cookie頭部一次只能傳遞1個name/value名值對,響應中能夠包含多個頭部
 

九、跨域請求資源請求頭部

Access-Control-Request-Method:在preflight預檢請求(OPTIONS)中,告知服務器接下來的請求會使用哪些方法
Access-Control-Request-Headers:在preflight預檢請求(OPTIONS)中,告知服務器接下來的請求會傳遞哪些頭部
 

十、跨域請求資源響應頭部

Access-Control-Allow-Methods:在preflight預檢請求的響應中,告知客戶端後續請求容許使用的方法
Access-Control-Allow-Headers:在preflight預檢請求的響應中,告知客戶端後續請求容許攜帶的頭部
Access-Control-Max-Age:在preflight預檢請求的響應中,告知客戶端該響應的信息能夠緩存多久
Access-Control-Expose-Headers:告知瀏覽器哪些響應頭部能夠供客戶端使用,默認狀況下只有Cache-Control.、Content-Language、Content-Type、Expires、 Last-Modified、Pragma 可供使用
Access-Control-Allow-Origin:告知瀏覽器容許哪些域訪問當前資源, *表示容許全部域。 爲避免緩存錯亂,響應中須要攜帶Vary: Origin
Access-Control-Allow-Credentials:告知瀏覽器是否能夠將Credentials暴露給客戶端使用,Credentials包含cookie、 authorization類頭部、TLS證書等。
 

十一、驗證器響應頭部

Etag:給出當前資源表述的標籤
Last-Modified:表示對應資源表述的上次修改時間
 

十二、驗證請求與響應頭部

驗證請求
若緩存響應中含有Last-Modified頭部

If-Unmodified-Since
If-Modified-Since
If-Range

若緩存響應中含有Etag頭部

If-None-Match
If-Match
If-Range

 

1三、緩存相關頭部

Age:Age表示自源服務器發出響應(或者驗證過時緩存) ,到使用緩存的響應發出時通過的秒數
Cache-Control:緩存控制頭部
Cache-Control頭部在請求中的值

Max-age:告訴服務器,客戶端不會接受Age超出max-age秒的緩存
Max-stale:告訴服務器,即便緩存再也不新鮮,但陳舊秒數沒有超出max-stale時,客戶端扔打算使用。若max-stale後沒有值,則表示不管過時多久客戶端均可使用
Min-fresh:告訴服務器,Age至少通過min-fresh秒後緩存纔可以使用
No-cache:告訴服務器,不能直接使用已有緩存做爲響應返回,除非帶着緩存條件到上游服務端獲得304驗證返回碼纔可以使用現有緩存
No-store:告訴各代理服務器不要對該請求的響應緩存(實際有很多不遵照該規定的代理服務器)
No-transform:告訴代理服務器不要修改消息包體的內容
Only-if-cached:告訴服務器僅能返回緩存的響應,不然若沒有緩存則返回504錯誤碼

 
Cache-Control頭部在響應中的值

Must-revalidate:告訴客戶端一旦緩存過時,必須向服務器驗證後纔可以使用
Proxy-revalidate:與Must-revalidate相似,但它僅對代理服務器的共享緩存有效
No-cache:告訴客戶端不能直接使用緩存的響應,使用前必須在源服務器驗證獲得304返回碼。若是no-cache後指定頭部,則若客戶端的後續請求及響應中不含有這些頭則可直接使用緩存
Max-age:告訴客戶端緩存Age超出max-age秒後則緩存過時
S-maxage:與max-age類似,但僅對共享緩存,且優先級高於max-age和Expires
public:表示不管私有緩存或者共享緩存,皆可將該響應緩存
private:表示該響應不能被代理服務器做爲共享緩存使用。若private後指定頭部,則在告訴代理服務器不能緩存指定的頭部,但可緩存其餘部分
No-store:告訴全部下游節點不能對響應進行緩存
No-transform:告訴代理服務器不能修改消息包體的內容

 

1四、重定向頭部

Location :當瀏覽器接收到重定向響應碼時,須要讀取響應頭部Location頭部的值,獲取到新的URI再跳轉訪問該頁面
 
參考文章:http://taohui.pub/

相關文章
相關標籤/搜索