HTTP協(xié)議屬于TCP/IP中的應(yīng)用層束凑,用于客戶端與服務(wù)端之間的通信杠园,客戶端請(qǐng)求訪問(wèn)文本或圖像等資源,服務(wù)器端則提供資源響應(yīng)筒狠,HTTP協(xié)議中猪狈,必定是客戶端先發(fā)起請(qǐng)求,服務(wù)端在未收到請(qǐng)求之前不會(huì)進(jìn)行響應(yīng)辩恼。這一章主要針對(duì)HTTP/1.1版本進(jìn)行講解雇庙,因?yàn)楹虷TTP/2.0有些區(qū)別谓形。后面有空會(huì)對(duì)比這兩個(gè)版本的區(qū)別。
1 HTTP在TCP/IP中的位置
找了張神圖状共,很清晰明了的標(biāo)明了HTTP的應(yīng)用層協(xié)議與其它層協(xié)議的關(guān)系套耕。
- 1.1 DNS:屬于應(yīng)用層谁帕,域名解析系統(tǒng)峡继,通過(guò)把域名轉(zhuǎn)換為IP地址,因?yàn)榈讓拥木W(wǎng)絡(luò)層是通過(guò)IP來(lái)尋址的匈挖,域名它不認(rèn)識(shí)碾牌;
- 1.2 TCP協(xié)議:屬于傳輸層,負(fù)責(zé)端對(duì)端的連接儡循,通過(guò)三次握手提供可靠性連接舶吗;
- 1.3 IP協(xié)議:屬于網(wǎng)絡(luò)層,負(fù)責(zé)把上面要傳輸?shù)臄?shù)據(jù)從一臺(tái)主機(jī)打包帶到目標(biāo)IP主機(jī)上择膝;
2 HTTP協(xié)議請(qǐng)求與響應(yīng)頭
HTTP協(xié)議通過(guò)客戶端請(qǐng)求和服務(wù)端的響應(yīng)來(lái)建立通信誓琼,所以必須請(qǐng)求和響應(yīng)的信息必須得按照特定的套路來(lái),不然雙方就不認(rèn)識(shí)肴捉,比如說(shuō)腹侣,給日本人打電話先你得先確認(rèn)好用哪種語(yǔ)言進(jìn)行溝通,這個(gè)舉例有些蒼白齿穗,但是Who Care傲隶!
2.1 請(qǐng)求報(bào)文
客戶端請(qǐng)求的格式我們稱之為請(qǐng)求報(bào)文,由請(qǐng)求的方法窃页,URI跺株,HTTP協(xié)議的版本號(hào),請(qǐng)求的字段(可選)脖卖,還有請(qǐng)求的內(nèi)容(可選)構(gòu)成乒省。
請(qǐng)求方法、請(qǐng)求URI和協(xié)議版本號(hào)構(gòu)成請(qǐng)求行畦木,請(qǐng)求首部是可選的作儿,包括請(qǐng)求首部,通用首部馋劈,實(shí)體首部攻锰,報(bào)文主體與報(bào)文首部之間必須有空行,因?yàn)榉?wù)端是通過(guò)空行來(lái)判斷報(bào)文主體的妓雾。
下面講一下這些各個(gè)組成娶吞。
- 2.1.1 請(qǐng)求方法:首先,你客戶端需要服務(wù)端提供服務(wù)械姻,你首先要讓服務(wù)器知道你要干嘛妒蛇,是洗腳還是按摩或者一條龍机断,不同的請(qǐng)求意圖價(jià)位可是不一樣的,服務(wù)器應(yīng)對(duì)方式也會(huì)有所區(qū)別绣夺。
2.1.1.1 GET方法:獲取資源吏奸。
2.1.1.2 POST方法:獲取資源的時(shí)候帶上傳輸實(shí)體,GET也可以陶耍,但GET一般不這樣用奋蔚。
2.1.1.3 PUT方法:傳輸實(shí)體文件。一般不用烈钞,因?yàn)椴话踩幢椒ㄗ陨頉](méi)有安全驗(yàn)證,導(dǎo)致誰(shuí)都可以
給你的服務(wù)器傳文件毯欣。
2.1.1.4 HEAD方法:和GET一樣獲取資源馒过,但是只拿響應(yīng)頭,服務(wù)端不返回報(bào)文主體酗钞;
2.1.1.5 DELETE: 刪除指定的資源腹忽,作用和PUT相反;
2.1.1.6 OPTIONS: 獲取服務(wù)端針對(duì)請(qǐng)求的URI支持的方法砚作;
2.1.1.7 TRACE: 追蹤路徑窘奏,追蹤請(qǐng)求經(jīng)過(guò)的代理服務(wù)器,可以用來(lái)確認(rèn)請(qǐng)求經(jīng)過(guò)代理時(shí)進(jìn)行的操作偎巢;
2.1.1.8 CONNECT:用隧道協(xié)議連接代理蔼夜,用隧道協(xié)議進(jìn)行通信。 -
2.1.2 URI(統(tǒng)一資源標(biāo)識(shí)符 Uniform Resource Identifier)
URI用于標(biāo)識(shí)資源压昼,而URL(統(tǒng)一資源定位符)是用于標(biāo)識(shí)互聯(lián)網(wǎng)資源求冷,URL是狹義的概念,URI是廣義的概念窍霞,URI包含URL匠题,在RFC文檔中,已經(jīng)不再使用URL但金,轉(zhuǎn)用URI韭山,絕對(duì)URI的格式為
- 2.1.3 客戶端使用的HTTP協(xié)議版本,顧名思義冷溃,HTTP協(xié)議的版本號(hào)
HTTP/0.9(出現(xiàn)的時(shí)候沒(méi)有作為標(biāo)準(zhǔn))钱磅,HTTP/1.0(開(kāi)始作為標(biāo)準(zhǔn)),
HTTP/1.1(目前的普及版本)似枕,HTTP/2.0(最新版本盖淡,正在快速普及的版本)。 - 2.1.4 請(qǐng)求首部字段
需要服務(wù)端處理的請(qǐng)求內(nèi)容或?qū)傩栽浼撸梢蕴砑右恍└郊拥囊笸食伲@一塊的字段超級(jí)多冗恨,后面再講。 - 2.1.5 內(nèi)容實(shí)體
客戶端要發(fā)送數(shù)據(jù)內(nèi)容味赃,比如用POST請(qǐng)求附加的文件和字段就是加在這里掀抹。
2.2 響應(yīng)報(bào)文
收到客戶端的大佬請(qǐng)求后,服務(wù)端會(huì)返回對(duì)應(yīng)的請(qǐng)求信息心俗,即響應(yīng)報(bào)文傲武,響應(yīng)報(bào)文主要包括服務(wù)器端的HTTP協(xié)議版本、狀態(tài)碼另凌、表示狀態(tài)碼的原因短語(yǔ)谱轨,這三者組成狀態(tài)行戒幔,除此之外還有響應(yīng)首部字段吠谢,以及響應(yīng)主體,整體結(jié)構(gòu)除了狀態(tài)行诗茎,其它部分結(jié)構(gòu)和請(qǐng)求報(bào)文類似工坊。
報(bào)文主體和首部字段之間有一個(gè)必不可少的空行。
這里也大概講一下響應(yīng)報(bào)文各部分信息:
- 2.2.1 協(xié)議版本
服務(wù)器端使用的HTTP協(xié)議版本號(hào) - 2.2.2 狀態(tài)碼和原因短語(yǔ):這兩個(gè)是孿生的敢订,狀態(tài)碼會(huì)伴隨著描述狀態(tài)碼的原因短語(yǔ)王污,我們客戶端就是通過(guò)狀態(tài)碼來(lái)判斷請(qǐng)求是成功了還是失敗了,狀態(tài)碼以3位數(shù)字組成楚午,主要分為下面幾類
2.2.2.1 1xx 信息性狀態(tài)碼昭齐,表示請(qǐng)求正在處理中
2.2.2.2 2xx 請(qǐng)求成功狀態(tài)碼,請(qǐng)求正常處理完成矾柜,常用的有200阱驾,204,206
2.2.2.3 3xx 重定向狀態(tài)碼怪蔑,需要進(jìn)行一些附加的操作才能完成請(qǐng)求里覆,常用的有301,302缆瓣,303喧枷,307
2.2.2.4 4xx 客戶端錯(cuò)誤狀態(tài)碼,表示客戶端的請(qǐng)求存在錯(cuò)誤弓坞,常用的有400隧甚,401,403渡冻,404
2.2.2.5 5xx 服務(wù)器端錯(cuò)誤狀態(tài)碼戚扳,表示服務(wù)器端處理發(fā)生錯(cuò)誤,常用的有500菩帝,503
大概碼一下這些常用的咖城,以后翻起來(lái)也方便不是茬腿。
狀態(tài)碼 | 原因短語(yǔ) | 原因短語(yǔ) |
---|---|---|
200 | OK | 成功處理客戶端發(fā)來(lái)的請(qǐng)求 |
204 | No Content | 成功處理請(qǐng)求,但不返回主體內(nèi)容宜雀,通常用于客戶端向服務(wù)器發(fā)送信息而服務(wù)器無(wú)需返回新內(nèi)容的情況下使用 |
206 | Partial Content | 客戶端進(jìn)行范圍請(qǐng)求切平,即GET方法要求獲取資源的部分內(nèi)容 |
301 | Moved Permanently | 永久重定向,所請(qǐng)求的資源已經(jīng)更換URI了 |
302 | Found | 臨時(shí)重定向辐董,所請(qǐng)求的資源暫時(shí)更換成新的URI |
303 | See Other | 資源存在另一個(gè)URI悴品,明確要求客戶端采用GET方法獲取資源 |
304 | Not Modified | 表示客戶端帶有附加條件請(qǐng)求資源時(shí),服務(wù)器端已找到資源简烘,但是不滿足客戶端的附加條件苔严,3xx里的奇葩,因?yàn)楦囟ㄏ驔](méi)關(guān)系 |
307 | Temporary Redirect | 臨時(shí)重定向孤澎,和302有一樣的意思届氢,滿足特定瀏覽器需求 |
400 | Bad Request | 請(qǐng)求報(bào)文中存在語(yǔ)法錯(cuò)誤 |
401 | Unauthorized | 表示請(qǐng)求的內(nèi)容需要有身份認(rèn)證信息,嗯覆旭,大概就是你權(quán)限還不夠的意思 |
403 | Forbidden | 服務(wù)器拒絕服務(wù)退子,沒(méi)有為什么,就是拒絕 |
404 | Not Found | 服務(wù)器找不到對(duì)應(yīng)請(qǐng)求的資源型将,在服務(wù)器想委婉拒絕你的時(shí)候也會(huì)用這個(gè)借口 |
500 | Internal Server Error | 什么都不用說(shuō)了寂祥,服務(wù)器端出現(xiàn)bug了 |
503 | Service Unavailable | 還請(qǐng)求個(gè)蛋啊,服務(wù)器已經(jīng)掛了 |
請(qǐng)求報(bào)文還有響應(yīng)報(bào)文的首部字段還沒(méi)有細(xì)講七兜,因?yàn)檫@些字段實(shí)在太多了丸凭,看緣分,后面再碼一下腕铸,就當(dāng)做掃盲了惜犀。