溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

HTTP協(xié)議的詳細介紹

發(fā)布時間:2020-05-26 14:14:58 來源:億速云 閱讀:358 作者:鴿子 欄目:系統(tǒng)運維

一、什么是HTTP?

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

二、HTTP請求行與響應行

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

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

HTTP常見方法(RFC7231)

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

Request-target

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

HTTP-version 版本號發(fā)展歷史

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

 

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

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

Status-code(響應碼)分類

響應碼規(guī)范:RFC6585(2012.4) RFC7231 (2014.6)
1xx:請求已經(jīng)收到,需要進一步處理才能完成,HTTP1.0不支持

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

2xx:成功處理請求

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

 
3xx:重定向使用Location指向的資源或者緩存中的資源。在RFC2068中規(guī)定客戶端重定向次數(shù)不應超過5次,以防止死循環(huán)

  • 300 Multiple Choices:資源有多種表述,通過300返回給客戶端后由其自行選擇訪問哪一種表述。由于缺少明確的細節(jié),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:客戶端出現(xiàn)錯誤

  • 400 Bad Request:服務器認為客戶端出現(xiàn)了錯誤,但不能明確判斷為以下哪種錯誤時使用此錯誤碼。例如HTTP請求格式錯誤
  • 401 Unauthorized:用戶認證信息缺失或者不正確,導致服務器無法處理請求
  • 407 Proxy Authentication Required:對需要經(jīng)由代理的請求,認證信息未通過代理服務器的驗證
  • 403 Forbidden:服務器理解請求的含義,但沒有權(quán)限執(zhí)行此請求
  • 404 Not Found:服務器沒有找到對應的資源
  • 410 Gone:服務器沒有找到對應的資源,且明確的知道該位置永久性找不到該資源
  • 405 Method Not Allowed:服務器不支持請求行中的method方法
  • 406 Not Acceptable:對客戶端指定的資源表述不存在(例如對語言或者編碼有要求),服務器返回表述列表供客戶端選擇
  • 408 Request Timeout:服務器接收請求超時
  • 409 Conflict:資源沖突,例如上傳文件時目標位置已經(jīng)存在版本更新的資源
  • 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:服務器認為這個請求不該發(fā)給它,因為他沒有能力處理
  • 426 Upgrade Required:服務器拒絕基于當前HTTP協(xié)議提供服務,通過Upgrade頭部告知客戶端必須升級協(xié)議才能繼續(xù)處理
  • 428 Precondition Required:用戶請求中缺失了條件類頭部,例如If-Match
  • 429 Too Many Requests:客戶端發(fā)送請求的速率過快
  • 431 Request Header Fields Too Large:請求的HEADER頭部大小超過限制
  • 451 Unavailable For Legal Reasons: RFC7725,由于法律原因資源不可訪問

5xx:服務器端出現(xiàn)錯誤

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

三、HTTP/1.1

1、connection頭部

connection:keep-alive 長連接(HTTP/1.1默認使用長連接,keep-alive無意義)
connection:close 短連接
 

2、host頭部

HTTP/1.1規(guī)范要求,不傳遞Host頭部則返回400錯誤響應碼
host頭部用于http消息在服務器端路由
Host頭部與消息的路由

1、建立TCP連接
    確定服務器的IP地址
2、接收請求
3、尋找虛擬主機
    匹配Host頭部與域名
4、尋找URI的處理代碼
    匹配URI
5、執(zhí)行處理請求的代碼
    訪問資源
6、生成HTTP響應
    各中間件基于PF架構(gòu)串行修改響應
7、發(fā)送HTTP響應
8、記錄訪問日志

 

3、代理服務器轉(zhuǎn)發(fā)消息時的頭部

X-Forwarded-For:用于代理服務器傳遞IP
X-Real-IP:用于傳遞用戶IP
Max-Forwards:限制Proxy代理服務器的最大轉(zhuǎn)發(fā)次數(shù),僅對TRACE/OPTIONS方法有效
Via:指明經(jīng)過的代理服務器名稱及版本
Cache-Control:禁止代理服務器修改響應包體
 

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

User-Agent:指明客戶端的類型信息,服務器可以據(jù)此對資源的表述做抉擇
Referer:瀏覽器對來自某一頁面的請求自動添加的頭部
From:主要用于網(wǎng)絡爬蟲,告訴服務器如何通過郵件聯(lián)系到爬蟲的負責人
Server:指明服務器上所用軟件的信息,用于幫助客戶端定位問題或統(tǒng)計數(shù)據(jù)
Allow:告訴客戶端,服務器上該URI對應的資源允許哪些方法的執(zhí)行
Accept-Ranges:告訴客戶端服務器上該資源是否允許range請求(允許服務器基于客戶端的請求只發(fā)送響應包體的一部分給到客戶端,而客戶端自動將多個片段的包體組合成完整的體積更大的包體)
 

5、內(nèi)容協(xié)商與資源表述

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

6、HTTP包體傳輸頭部

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

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

 

7、Content-Disposition 頭部(RFC6266)

disposition-type =" inline"|" attachment"| disp-ext-type
inline: 指定包體是以inline 內(nèi)聯(lián)的方式,作為頁面的一部分展示
attachment: 指定瀏覽器將包體以附件的方式下載
在multipart/form-data類型應答中,可以用于子消息體部分
 

8、Cookie與Set-Cookie頭部

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

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

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

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

Access-Control-Allow-Methods:在preflight預檢請求的響應中,告知客戶端后續(xù)請求允許使用的方法
Access-Control-Allow-Headers:在preflight預檢請求的響應中,告知客戶端后續(xù)請求允許攜帶的頭部
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證書等。
 

11、驗證器響應頭部

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

12、驗證請求與響應頭部

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

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

若緩存響應中含有Etag頭部

If-None-Match
If-Match
If-Range

 

13、緩存相關頭部

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

Max-age:告訴服務器,客戶端不會接受Age超出max-age秒的緩存
Max-stale:告訴服務器,即使緩存不再新鮮,但陳舊秒數(shù)沒有超出max-stale時,客戶端扔打算使用。若max-stale后沒有值,則表示無論過期多久客戶端都可使用
Min-fresh:告訴服務器,Age至少經(jīng)過min-fresh秒后緩存才可使用
No-cache:告訴服務器,不能直接使用已有緩存作為響應返回,除非帶著緩存條件到上游服務端得到304驗證返回碼才可使用現(xiàn)有緩存
No-store:告訴各代理服務器不要對該請求的響應緩存(實際有不少不遵守該規(guī)定的代理服務器)
No-transform:告訴代理服務器不要修改消息包體的內(nèi)容
Only-if-cached:告訴服務器僅能返回緩存的響應,否則若沒有緩存則返回504錯誤碼

 
Cache-Control頭部在響應中的值

Must-revalidate:告訴客戶端一旦緩存過期,必須向服務器驗證后才可使用
Proxy-revalidate:與Must-revalidate類似,但它僅對代理服務器的共享緩存有效
No-cache:告訴客戶端不能直接使用緩存的響應,使用前必須在源服務器驗證得到304返回碼。如果no-cache后指定頭部,則若客戶端的后續(xù)請求及響應中不含有這些頭則可直接使用緩存
Max-age:告訴客戶端緩存Age超出max-age秒后則緩存過期
S-maxage:與max-age相似,但僅對共享緩存,且優(yōu)先級高于max-age和Expires
public:表示無論私有緩存或者共享緩存,皆可將該響應緩存
private:表示該響應不能被代理服務器作為共享緩存使用。若private后指定頭部,則在告訴代理服務器不能緩存指定的頭部,但可緩存其他部分
No-store:告訴所有下游節(jié)點不能對響應進行緩存
No-transform:告訴代理服務器不能修改消息包體的內(nèi)容

 

14、重定向頭部

Location :當瀏覽器接收到重定向響應碼時,需要讀取響應頭部Location頭部的值,獲取到新的URI再跳轉(zhuǎn)訪問該頁面

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI