HTTP 協(xié)議
HTTP 協(xié)議詳解
超文本傳輸協(xié)議(HTTP,HyperText Transfer Protocol)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議棋枕。所有的WWW文件都必須遵守這個(gè)標(biāo)準(zhǔn)。設(shè)計(jì)HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁(yè)面的方法片橡。1960年美國(guó)人Ted Nelson構(gòu)思了一種通過(guò)計(jì)算機(jī)處理文本信息的方法贯涎,并稱(chēng)之為超文本(hypertext),這成為了HTTP超文本傳輸協(xié)議標(biāo)準(zhǔn)架構(gòu)的發(fā)展根基。Ted Nelson組織協(xié)調(diào)萬(wàn)維網(wǎng)協(xié)會(huì)(World Wide Web Consortium)和互聯(lián)網(wǎng)工程工作小組(Internet Engineering Task Force )共同合作研究痊远,最終發(fā)布了一系列的RFC,其中著名的RFC 2616定義了HTTP 1.1氏捞。
HTTP協(xié)議工作流程
Http協(xié)議與其他協(xié)議一樣碧聪,也需要以特定的方式進(jìn)行數(shù)據(jù)包的封裝,并按照一定的流程實(shí)現(xiàn)通信交互液茎,而基于HTTP協(xié)議的請(qǐng)求/響應(yīng)模式的信息交互過(guò)程可分為四個(gè)步驟逞姿。
- (1) 客戶(hù)端與服務(wù)器需要建立連接,如:TCP連接
- (2) 連接建立后捆等,客戶(hù)端向服務(wù)器發(fā)送一個(gè)請(qǐng)求滞造,請(qǐng)求報(bào)文由三部分組成:請(qǐng)求行、消息報(bào)頭栋烤、響應(yīng)內(nèi)容谒养。
- (3) 服務(wù)器接到請(qǐng)求后,解析該請(qǐng)求并返回響應(yīng)信息明郭,響應(yīng)報(bào)文由三部分組成:狀態(tài)行买窟、消息頭、響應(yīng)內(nèi)容薯定。
- (4) 客戶(hù)端接收服務(wù)器所返回的信息并進(jìn)行解析始绍、處理和顯示。
通常话侄,瀏覽器訪(fǎng)問(wèn)一個(gè)頁(yè)面亏推,需要發(fā)出多次請(qǐng)求獲取不同的響應(yīng)內(nèi)容,在HTTP/1.0版本中默認(rèn)是傳輸一次數(shù)據(jù)就關(guān)閉連接年堆,而在HTTP/1.1版本中默認(rèn)為是持久連接吞杭,即一次TCP連接可以完成多次HTTP請(qǐng)求。是否支持持久連接嘀韧,是由消息報(bào)頭中的connection字段決定的篇亭,如果請(qǐng)求或響應(yīng)中的connection設(shè)置為close,則客戶(hù)端和服務(wù)器的連接為非持久連接锄贷。
請(qǐng)求報(bào)文和響應(yīng)的報(bào)文結(jié)構(gòu)簡(jiǎn)介
HTTP協(xié)議的請(qǐng)求和響應(yīng)數(shù)據(jù)包一般被稱(chēng)為請(qǐng)求報(bào)文和響應(yīng)報(bào)文译蒂,根據(jù)協(xié)議標(biāo)準(zhǔn)曼月,請(qǐng)求報(bào)文和響應(yīng)報(bào)文是由報(bào)文首部、空行和報(bào)文主題組成的柔昼,而請(qǐng)求報(bào)文的首部又由請(qǐng)求行哑芹、請(qǐng)求首部字段、通用首部字段捕透、實(shí)體首部字段組成聪姿,響應(yīng)報(bào)文的首部由狀態(tài)行、響應(yīng)首部字段乙嘀、通用首部字段末购、實(shí)體首部字段組成。結(jié)構(gòu)圖請(qǐng)看往下看:
根據(jù)以上結(jié)構(gòu)虎谢,可以將HTTP協(xié)議報(bào)文包含的內(nèi)容分為五類(lèi):
- 一盟榴、請(qǐng)求行,由請(qǐng)求方法婴噩、請(qǐng)求URL擎场、HTTP版本組成;
- 二几莽、是狀態(tài)行迅办,由HTTP版本、狀態(tài)碼章蚣、原因短語(yǔ)組成站欺;
- 三、首部字段纤垂,包含了請(qǐng)求首部镊绪、響應(yīng)首部、通用首部洒忧、實(shí)體首部四種類(lèi)型,一般有名字和值組成够颠;
- 四熙侍、是其他報(bào)文首部字段,包含了一些RFC()未定義的首部?jī)?nèi)容履磨;
- 五蛉抓、是報(bào)文主體,由任意數(shù)據(jù)組成剃诅。
分析下 Laravel 官網(wǎng)的Http協(xié)議
這里我們?cè)L問(wèn) laravel官網(wǎng) 的請(qǐng)求報(bào)文和響應(yīng)報(bào)文巷送,來(lái)具體分析
(1) 請(qǐng)求行 (火狐可以查看到)
請(qǐng)求行中的請(qǐng)求方法用來(lái)描述服務(wù)器應(yīng)該執(zhí)行的操作,而請(qǐng)求URL指定了操作的資源矛辕,HTTP版本用來(lái)標(biāo)識(shí)客戶(hù)端使用的HTTP版本笑跛。圖中 訪(fǎng)問(wèn)的Laravel網(wǎng)站請(qǐng)求報(bào)文的請(qǐng)求方法為“GET”付魔,請(qǐng)求URL為“https://laravel.com/”,HTTP版本位 “HTTP/1.1”飞蹂。在HTTP規(guī)范中定義了一組方法几苍,用于指定服務(wù)器的響應(yīng)動(dòng)作,如GET方法是指從服務(wù)器獲取一個(gè)文本陈哑,具體請(qǐng)求報(bào)文頭方法及其功能描述見(jiàn)下表:
HTTP請(qǐng)求報(bào)文方法及其功能
方法名稱(chēng) | 功能描述 | 是否包含主體數(shù)據(jù) |
---|---|---|
GET | 從服務(wù)器獲取文本 | 否 |
POST | 向服務(wù)器發(fā)送客戶(hù)端數(shù)據(jù) | 是 |
PUT | 上傳客戶(hù)端的文件到服務(wù)器 | 是 |
DELETE | 從服務(wù)器刪除一個(gè)文件 | 否 |
HEAD | 只獲取服務(wù)器可以執(zhí)行的方法 | 否 |
OPTIONS | 獲取服務(wù)器可以執(zhí)行的方法 | 否 |
TRACE | 對(duì)經(jīng)過(guò)代理服務(wù)器的報(bào)文進(jìn)行追蹤 | 否 |
(2) 狀態(tài)行
狀態(tài)行包含響應(yīng)報(bào)文服務(wù)器使用的HTTTP版本妻坝、數(shù)字狀態(tài)碼和原因短語(yǔ),對(duì)于圖響應(yīng)報(bào)文的狀態(tài)行惊窖,其中HTTP版本為“HTTP/1.1”刽宪,數(shù)字狀態(tài)碼位 “200”,原因短語(yǔ)“OK”界酒。HTTP的狀態(tài)共分為五大類(lèi)圣拄,用于描述返回的響應(yīng)結(jié)果。實(shí)際HTTP規(guī)范中定義的狀態(tài)碼有十幾種盾计,比較具有代表性的狀態(tài)碼及含義如下:
HTTP響應(yīng)報(bào)文狀態(tài)碼及其含義
狀態(tài)碼范圍 | 狀態(tài)碼類(lèi)別 | 含義 | |
---|---|---|---|
100~199 | 信息類(lèi)狀態(tài)碼 | 收到請(qǐng)求初始部分售担,請(qǐng)繼續(xù)發(fā)送 | |
200~299 | 成功狀態(tài)碼 | ||
300~399 | 重定向狀態(tài)碼 | ||
400~499 | 客戶(hù)端錯(cuò)誤狀態(tài)碼 | ||
500~599 | 服務(wù)器錯(cuò)誤狀態(tài)碼 |
典型狀態(tài)碼
典型狀態(tài)碼 | 原因短語(yǔ) | 含義 |
---|---|---|
100 | continue | 收到請(qǐng)求初始部分,請(qǐng)繼續(xù)發(fā)送 |
200 | OK | 請(qǐng)求已經(jīng)被正常處理 |
204 | No Content | 請(qǐng)求被成功處理署辉,但沒(méi)有主體數(shù)據(jù) |
206 | Partial Content | 對(duì)資源部分請(qǐng)求成功 |
301 | Moved Permanently | 請(qǐng)求的URL資源已被更新族铆,響應(yīng)首部包含新的URL |
302 | Found | 請(qǐng)求的URL資源臨時(shí)更新 |
304 | Not Modified | 請(qǐng)求不符合條件,需要更改條件 |
400 | Bad Request | 客戶(hù)端發(fā)送一個(gè)錯(cuò)誤請(qǐng)求 |
401 | Unauthorized | 請(qǐng)求需要包含通過(guò)HTTP認(rèn)證的信息 |
403 | Forbiden | 訪(fǎng)問(wèn)被拒絕 |
404 | Not Found | 沒(méi)有找到請(qǐng)求的URL |
500 | Internal Server Error | 服務(wù)器出現(xiàn)錯(cuò)誤哭尝,無(wú)法提供請(qǐng)求的資源 |
503 | Service Unavailable | 服務(wù)器正忙哥攘,無(wú)法提供正常請(qǐng)求的服務(wù) |
(3) 首部字段
首部字段是構(gòu)成HTTP報(bào)文的基本要素之一,這部分包含的信息也是最為豐富材鹦,主要用于規(guī)定客戶(hù)端和服務(wù)端在處理請(qǐng)求和響應(yīng)時(shí)的操做逝淹。通常,根據(jù)首部字段的用途可以分為四類(lèi):
- 通用首部字段
- 請(qǐng)求首部字段
- 響應(yīng)首部字段
- 實(shí)體首部字段
首部字段通常由字段名和字段值構(gòu)成桶唐,中間通過(guò)“:”分隔栅葡。下面簡(jiǎn)要介紹下四類(lèi)字段的作用和部分首部字段含義。
通用首部字段
通用首部字段一般用來(lái)提供HTTP報(bào)文的最基本信息尤泽,這些信息無(wú)論是請(qǐng)求報(bào)文還是響應(yīng)報(bào)文都可以使用欣簇,主要用于描述HTTP協(xié)議本身。比如描述HTTP是否支持久連接的Connetion 字段坯约、HTTP發(fā)送日期的Date字段熊咽、用于緩存控制的Cache-Control 字段等。下面列出了通用首部字段及含義:
通用首部字段名 | 功能說(shuō)明 |
---|---|
Connection | 用于指定客服端/服務(wù)器間連接選項(xiàng)闹丐,例如指定連續(xù)連接或者通過(guò)“close”選項(xiàng)通知服務(wù)器在響應(yīng)完成后關(guān)閉連接 |
Date | 報(bào)文創(chuàng)建日期 |
Transfer-Enocoding | 指定報(bào)文主體數(shù)據(jù)的編碼方式 |
Update | 發(fā)送端協(xié)議準(zhǔn)備升級(jí)為新版本 |
Via | 報(bào)文經(jīng)過(guò)中間節(jié)點(diǎn)(網(wǎng)關(guān)横殴、代理等)的信息 |
Cache-Control | 指定緩存行為 |
Warning | 錯(cuò)誤通知 |
請(qǐng)求首部字段
請(qǐng)求首部字段一般用于HTTP請(qǐng)求報(bào)文中,主要描述客戶(hù)端的版本卿拴、處理能力等信息衫仑,用于幫助服務(wù)器更好的地提供請(qǐng)求響應(yīng)字段梨与,如告訴服務(wù)器只接收某種響應(yīng)內(nèi)容的Accept字段、發(fā)送Cookies的Cookie字段等惑畴。下面列出的是常用的請(qǐng)求首部字段及含義:
HTTP 報(bào)文請(qǐng)求首部字段及含義
請(qǐng)求首部字段名 | 功能說(shuō)明 |
---|---|
Accept | 客戶(hù)端可處理的媒體類(lèi)型 |
Accept-Charset | 客戶(hù)端優(yōu)先接收的字符集 |
Accept-Encoding | 客戶(hù)端優(yōu)先接收的編碼格式蛋欣,如 zip |
Accept-Langular | 客戶(hù)端希望的語(yǔ)言種類(lèi) |
Authorization | 授權(quán)信息,通常用于對(duì)服務(wù)器發(fā)送的WWW-Authenticate |
Cookie | 用于客戶(hù)端向服務(wù)器發(fā)送一個(gè)令牌 |
Cookie2 | 用來(lái)說(shuō)明客戶(hù)端支持的Cookie版本 |
From | 客戶(hù)端的E-mail 地址如贷,由一些特殊的Web客戶(hù)程序使用陷虎,瀏覽器不會(huì)用到它 |
Host | 請(qǐng)求資源所在服務(wù)器的主機(jī)和端口 |
If-Modified-Since | 只有當(dāng)所有請(qǐng)求的內(nèi)容在指定的日期之后又經(jīng)過(guò)修改才會(huì)返回它,否則返回 304 “Not Modified”應(yīng)答 |
Referer | 包含一個(gè)URL頁(yè)面出發(fā)訪(fǎng)問(wèn)請(qǐng)求頁(yè)面 |
User-Agent | 客戶(hù)端信息杠袱,如客戶(hù)端應(yīng)用程序名稱(chēng)尚猿、版本等 |
UA-OS | 客戶(hù)端主機(jī)上的操作系統(tǒng)名稱(chēng)、版本等信息 |
UA-Pixels | 客服端顯示器像素信息 |
響應(yīng)首部字段
響應(yīng)首部字段是描述HTTP 響應(yīng)本身的字段楣富,一般用于HTTP響應(yīng)報(bào)文中凿掂,主要用于描述響應(yīng)主機(jī)的信息、功能等纹蝴,通過(guò)響應(yīng)首部字段有助于客戶(hù)端處理響應(yīng)庄萎,并在將來(lái)發(fā)出更適合服務(wù)器的請(qǐng)求,如定時(shí)刷新的Refresh頭塘安、設(shè)置Cookie的Set-Cookie頭等糠涛。下面列出常用的響應(yīng)首部字段及含義:
響應(yīng)首部字段名 | 功能含義 |
---|---|
Age | 響應(yīng)資源創(chuàng)建的時(shí)間 |
Set-Cookie | 在客戶(hù)端設(shè)置一個(gè)Cookie,服務(wù)器用來(lái)對(duì)客戶(hù)端進(jìn)行標(biāo)識(shí) |
Server | 服務(wù)器應(yīng)用程序軟件的名稱(chēng)兼犯、版本等信息 |
Retry-After | 當(dāng)資源不可用時(shí)忍捡,在此期間再次發(fā)送請(qǐng)求 |
Refresh | 表示瀏覽器應(yīng)該在多長(zhǎng)時(shí)間之后刷新文檔,以秒計(jì) |
實(shí)體首部字段
實(shí)體首部字段用于描述HTTP報(bào)文體數(shù)據(jù)字段切黔。由于報(bào)文主體可以存在于請(qǐng)求報(bào)文和響應(yīng)報(bào)文中砸脊,所以這種類(lèi)型首部字段可以應(yīng)用在這兩種類(lèi)型的報(bào)文中。實(shí)體首部字段用于描述主體內(nèi)容的元信息纬霞,包括實(shí)體信息類(lèi)型凌埂、長(zhǎng)度、壓縮方法诗芜、最后一次修改時(shí)間侨舆、數(shù)據(jù)有效性等,以便告訴接收者如何進(jìn)行處理绢陌,如Content-Language 用于描述報(bào)文主體的語(yǔ)言等。下面列出常用的實(shí)體首部字段及含義:
實(shí)體首部字段名 | 功能含義 |
---|---|
Allow | 資源主體可以支持的HTTP請(qǐng)求方法 |
Content-Location | 通知接收端主體的URL熔恢,用于接收端定位到該資源 |
Content-Encoding | 主體適用的編碼方式 |
Content-Language | 解釋主體時(shí)適用的語(yǔ)言 |
Content-Length | 主體的大小脐湾,通常以字節(jié)數(shù)表示 |
Content-MD5 | 主體的MD5校驗(yàn)和 |
Content-Type | 主體的對(duì)象類(lèi)型 |
HTTP協(xié)議作為應(yīng)用層協(xié)議離不開(kāi)TCP/IP協(xié)議的支持!