HTTP協(xié)議是建立在TCP之上的簡(jiǎn)單的請(qǐng)求-響應(yīng)協(xié)議蝗羊。
- 特點(diǎn)
1.支持客戶/服務(wù)器模式
2.簡(jiǎn)單快速
3.靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對(duì)象
4.無連接:無連接的含義是限制每次連接只處理一個(gè)請(qǐng)求拱燃。服務(wù)器處理完客戶的請(qǐng)求,并收到客戶的應(yīng)答后奋刽,即斷開連接尺棋。采用這種方式可以節(jié)省傳輸時(shí)間缸夹。
5.無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議匀油。無狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息腥椒,則它必須重傳阿宅,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面笼蛛,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快洒放。 - 內(nèi)容
請(qǐng)求報(bào)文如圖,由四個(gè)部分組成
請(qǐng)求行(request line)伐弹、請(qǐng)求頭部(header)拉馋、空行和請(qǐng)求數(shù)據(jù)
圖片.png
服務(wù)器回應(yīng)如圖
狀態(tài)行、消息報(bào)頭惨好、空行和響應(yīng)正文
圖片.png - 請(qǐng)求方法
有8種,常用GET和POST随闺,兩者區(qū)別是GET有數(shù)據(jù)長(zhǎng)度的限制日川,所以GET常用來發(fā)送查詢請(qǐng)求,而POST則用來傳輸數(shù)據(jù) - HTTP步驟
1矩乐、客戶端連接到Web服務(wù)器
一個(gè)HTTP客戶端龄句,通常是瀏覽器回论,與Web服務(wù)器的HTTP端口(默認(rèn)為80)建立一個(gè)TCP套接字連接。
2分歇、發(fā)送HTTP請(qǐng)求
通過TCP套接字傀蓉,客戶端向Web服務(wù)器發(fā)送一個(gè)文本的請(qǐng)求報(bào)文,一個(gè)請(qǐng)求報(bào)文由請(qǐng)求行职抡、請(qǐng)求頭部葬燎、空行和請(qǐng)求數(shù)據(jù)4部分組成。
3缚甩、服務(wù)器接受請(qǐng)求并返回HTTP響應(yīng)
Web服務(wù)器解析請(qǐng)求谱净,定位請(qǐng)求資源。服務(wù)器將資源復(fù)本寫到TCP套接字擅威,由客戶端讀取壕探。一個(gè)響應(yīng)由狀態(tài)行、響應(yīng)頭部郊丛、空行和響應(yīng)數(shù)據(jù)4部分組成李请。
4、釋放連接TCP連接
若connection 模式為close厉熟,則服務(wù)器主動(dòng)關(guān)閉TCP連接捻艳,客戶端被動(dòng)關(guān)閉連接,釋放TCP連接;若connection 模式為keepalive庆猫,則該連接會(huì)保持一段時(shí)間认轨,在該時(shí)間內(nèi)可以繼續(xù)接收請(qǐng)求;
5、客戶端瀏覽器解析HTML內(nèi)容
例如:在瀏覽器地址欄鍵入U(xiǎn)RL月培,按下回車之后會(huì)經(jīng)歷以下流程:
1嘁字、瀏覽器向 DNS 服務(wù)器請(qǐng)求解析該 URL 中的域名所對(duì)應(yīng)的 IP 地址;
2、解析出 IP 地址后杉畜,根據(jù)該 IP 地址和默認(rèn)端口 80纪蜒,和服務(wù)器建立TCP連接;
3、瀏覽器發(fā)出讀取文件(URL 中域名后面部分對(duì)應(yīng)的文件)的HTTP 請(qǐng)求此叠,該請(qǐng)求報(bào)文作為 TCP 三次握手的第三個(gè)報(bào)文的數(shù)據(jù)發(fā)送給服務(wù)器;
4纯续、服務(wù)器對(duì)瀏覽器請(qǐng)求作出響應(yīng),并把對(duì)應(yīng)的 html 文本發(fā)送給瀏覽器;
5灭袁、釋放 TCP連接;
6猬错、瀏覽器將該 html 文本并顯示內(nèi)容
- HTTP狀態(tài)碼
100 continue
101 switching protocol
200 ok
201 created
202 accepted
203 Non-Authoritative Information
204 no content
205 reset content
206 partical content
300 multiple choices
301 moved permanently永久移動(dòng)
302 found暫時(shí)移動(dòng)
303 see other
304 not modified
305 use proxy
306 unused
307 temporary redirect GET重定向
400 bad request 客戶端請(qǐng)求語法錯(cuò)誤
401 unauthorized 需要身份驗(yàn)證
402 payment require(預(yù)留以后用,現(xiàn)在沒卵用)
403 forbidden 服務(wù)器拒絕請(qǐng)求
404 not found 找不到資源
405 method not allowed
406 not acceptable
后面還有很多茸歧,但記住常見的就差不多了
500 interval server error服務(wù)器內(nèi)部錯(cuò)誤
501 not implement服務(wù)器不支持請(qǐng)求的功能
502 bad gateway代理服務(wù)器接收到無效請(qǐng)求
503 service unavailable服務(wù)器暫時(shí)無法處理請(qǐng)求
504 gateway timeout代理服務(wù)器未及時(shí)獲取請(qǐng)求
505 http version not supported
- 長(zhǎng)連接和短連接
短連接:在三次握手之后建立連接倦炒,每次發(fā)送數(shù)據(jù)包并得到服務(wù)器返回的結(jié)果之后,通過客戶端和服務(wù)端的四次握手進(jìn)行關(guān)閉斷開软瞎。如果需要發(fā)送新的數(shù)據(jù)逢唤,需要建立新連接拉讯。
長(zhǎng)連接:執(zhí)行三次握手鏈接后,不斷開鏈接鳖藕,保持客戶端和服務(wù)端通信魔慷,直到服務(wù)器超時(shí)自動(dòng)斷開鏈接,或者客戶端主動(dòng)斷開鏈接著恩。
使用長(zhǎng)連接后院尔,可以應(yīng)用pipelined request(不知道怎么翻譯),就是在上一個(gè)請(qǐng)求的應(yīng)答完成之前就發(fā)起新的請(qǐng)求页滚。
HTTP1.1默認(rèn)使用長(zhǎng)連接
HTTP請(qǐng)求和響應(yīng)頭都有Connection: Keep-alive
召边,可能后面還會(huì)跟著Keep-Alive:timeout=20
還可能有max=XXX