HTTP協(xié)議 (Hyper Text Transfer Protocol)
HTTP是一個(gè)基于TCP/IP通信協(xié)議來(lái)傳遞數(shù)據(jù)掘宪,包括html文件、圖像、結(jié)果等猎物,即是一個(gè)客戶端和服務(wù)器端請(qǐng)求和應(yīng)答的標(biāo)準(zhǔn)秆吵。
HTTP協(xié)議特點(diǎn)
- http無(wú)連接:限制每次連接只處理一個(gè)請(qǐng)求淮椰,服務(wù)端完成客戶端的請(qǐng)求后,即斷開(kāi)連接纳寂。(傳輸速度快主穗,減少不必要的連接,但也意味著每一次訪問(wèn)都要建立一次連接毙芜,效率降低)
- http無(wú)狀態(tài):對(duì)于事務(wù)處理沒(méi)有記憶能力忽媒。每一次請(qǐng)求都是獨(dú)立的,不記錄客戶端任何行為腋粥。(優(yōu)點(diǎn)解放服務(wù)器晦雨,但可能每次請(qǐng)求會(huì)傳輸大量重復(fù)的內(nèi)容信息)
- 客戶端/服務(wù)端模型:客戶端支持web瀏覽器或其他任何客戶端,服務(wù)器通常是nginx或者apache等
- 簡(jiǎn)單快速
- 靈活:可以傳輸任何類型的數(shù)據(jù)
一次HTTP請(qǐng)求過(guò)程
域名 =》DNS域名解析 =》TCP三次握手建立連接 =》傳輸http報(bào)文 =》四次揮手?jǐn)嚅_(kāi)連接
TCP三次握手過(guò)程
- 第一次握手客戶端需要發(fā)送一個(gè)syn=1告訴服務(wù)端需要聯(lián)機(jī)隘冲,并且會(huì)同時(shí)發(fā)送一個(gè)隨機(jī)生成的順序號(hào)碼(seq)闹瞧。
- 第二次握手由服務(wù)端發(fā)起,服務(wù)端需要回復(fù)客戶端一個(gè)確認(rèn)ACK展辞,這個(gè)值為第一次客戶端生成的順序號(hào)碼加1奥邮,另外也生成一個(gè)隨機(jī)順序號(hào)碼給到客戶端。
- 第三次握手由客戶端收到第二次握手的消息后罗珍,回復(fù)服務(wù)端一個(gè)確認(rèn)消息ACK洽腺,這個(gè)值為服務(wù)端的順序號(hào)碼加1,也會(huì)發(fā)送一個(gè)seq覆旱。
第一次握手已脓,是客戶端需要確認(rèn)自己發(fā)消息沒(méi)問(wèn)題,服務(wù)端收到消息以后證明自己收消息沒(méi)問(wèn)題通殃,這時(shí)他還需要證明自己發(fā)消息沒(méi)問(wèn)題所以他發(fā)起第二次握手度液。
客戶端收到第二次握手的消息后確認(rèn)了自己的發(fā)消息和收消息都沒(méi)問(wèn)題厕宗,但這時(shí)候服務(wù)端只知道自己收消息沒(méi)有問(wèn)題,他第二次發(fā)出的消息他并不知道客戶端是否成功接收了堕担。
所以有了第三次握手已慢,告訴服務(wù)端我收到了,你發(fā)消息沒(méi)問(wèn)題霹购。這時(shí)佑惠,就證明了客戶端和服務(wù)端雙方的收發(fā)都沒(méi)有問(wèn)題。
HTTP請(qǐng)求報(bào)文
一個(gè)HTTP請(qǐng)求報(bào)文由請(qǐng)求行(request line)齐疙、請(qǐng)求頭部(header)和請(qǐng)求體(body)組成膜楷。
- 請(qǐng)求行:請(qǐng)求方法、請(qǐng)求地址和協(xié)議版本
- 請(qǐng)求頭:主要說(shuō)Content-Type(請(qǐng)求的與實(shí)體對(duì)應(yīng)的MIME信息)
- 常見(jiàn)取值 :
application/x-www-form-urlencoded (使用jquery發(fā)送ajax請(qǐng)求會(huì)默認(rèn)類型)
application/json
multipart/form-data (傳輸文件固定類型) - 后端如何接收:(PHP)
取值為application/x-www-data-urlencoded情況下$_POST 和 php://input均有值贞奋。
取值為 application/json 時(shí)$_POST無(wú)值赌厅。
取值為multipart/form-data 時(shí)php://input無(wú)值。此時(shí)應(yīng)該用$_POST來(lái)獲取字段轿塔,$_FILES 來(lái)獲取上傳的文件信息
- 常見(jiàn)取值 :
- 請(qǐng)求體:
- 常見(jiàn)類型 :
application/x-www-form-urlencoded :a=1&b=2
application/json :"{"a":1,"b":2}"
- 常見(jiàn)類型 :
HTTP響應(yīng)報(bào)文
HTTP響應(yīng)報(bào)文主要由狀態(tài)行特愿、響應(yīng)頭、及響應(yīng)數(shù)據(jù)組成勾缭。
- 狀態(tài)行:協(xié)議版本揍障,狀態(tài)碼,狀態(tài)碼描述俩由。
- 響應(yīng)頭:主要說(shuō)Content-Type
- 常見(jiàn)值 :
text/html : HTML格式
text/plain :純文本格式
text/xml : XML格式
image/gif :gif圖片格式
image/jpeg :jpg圖片格式
image/png:png圖片格式
- 常見(jiàn)值 :
四次揮手?jǐn)嚅_(kāi)
通過(guò)前面毒嫡,我們已經(jīng)知道ACK是用來(lái)應(yīng)答的,SYN是用來(lái)代表連接的幻梯。而這里的FIN報(bào)文就是代表斷開(kāi)連接的审胚,當(dāng)主動(dòng)方?jīng)]有數(shù)據(jù)再需要傳輸給對(duì)方時(shí),會(huì)向?qū)Ψ桨l(fā)起FIN報(bào)文礼旅,但這時(shí)候被動(dòng)方不會(huì)立馬斷開(kāi)連接,他只會(huì)回復(fù)一個(gè)ACK告訴主動(dòng)方你發(fā)的FIN報(bào)文我收到了洽洁,很可能不會(huì)立馬關(guān)閉痘系,因?yàn)樗赡苓€沒(méi)處理完請(qǐng)求,可能還有消息需要發(fā)送饿自,這時(shí)主動(dòng)方進(jìn)入FIN_WAIT_2狀態(tài)汰翠。等被動(dòng)發(fā)也沒(méi)有消息需要發(fā)送了,這時(shí)候才會(huì)也發(fā)一個(gè)FIN給主動(dòng)方昭雌,主動(dòng)方回復(fù)以后复唤,連接斷開(kāi)。
COOKIE
Http 協(xié)議中引入了 cookie 技術(shù)烛卧,用來(lái)解決 http 協(xié)議無(wú)狀態(tài)的問(wèn)題佛纫。通過(guò)在請(qǐng)求和響應(yīng)報(bào)文中寫(xiě)入 Cookie 信息來(lái)控制客戶端的狀態(tài)妓局;Cookie會(huì)根據(jù)從服務(wù)器端發(fā)送的響應(yīng)報(bào)文內(nèi)的一個(gè)叫做 Set-Cookie 的首部字段信息,通知客戶端保存 Cookie呈宇。當(dāng)下次客戶端再往該服務(wù)器發(fā)送請(qǐng)求時(shí)好爬,客戶端會(huì)自動(dòng)在請(qǐng)求報(bào)文中加入 Cookie 值后發(fā)送出去。后端以 session 這樣的機(jī)制來(lái)保存服務(wù)端的對(duì)象狀態(tài)甥啄。