1.報(bào)文格式
1.1 請(qǐng)求報(bào)文
以下是發(fā)起一個(gè) HTTP 請(qǐng)求需要的主要信息,在發(fā)起網(wǎng)絡(luò)請(qǐng)求時(shí)我們一般只提供 URL 和請(qǐng)求實(shí)體拒垃,剩下的交給框架(Okhttp3或者 Retrofit等)完成。
請(qǐng)求行:請(qǐng)求方法+路徑+版本號(hào)
-
請(qǐng)求頭:
Host
: 請(qǐng)求的主機(jī)名Connection
:是否保持連接User-Agent
:用戶信息Accept
:客戶端接受的數(shù)據(jù)類型Accept-Encoding
:客戶端識(shí)別的數(shù)據(jù)編碼格式Cookie
:cookie 信息
請(qǐng)求體:內(nèi)容
Host: www.baidu.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Linux; Android 7.0; m3 note) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Mobile Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
ip=172.56.168.66&imei=86521684611</pre>
1.2 響應(yīng)報(bào)文
準(zhǔn)備好http 請(qǐng)求信息后乒省,接下來(lái)就可以發(fā)起網(wǎng)絡(luò)請(qǐng)求了榨惠,請(qǐng)求一般使用socket 闷祥,具體實(shí)現(xiàn)可以通過(guò) TCP/UDP 來(lái)傳輸。
狀態(tài)行:版本號(hào)+狀態(tài)碼+狀態(tài)信息
響應(yīng)頭:Content-Type构挤,Content-Length等
響應(yīng)體:返回內(nèi)容
Server: nginx/1.8.1
Date: Thu, 03 Jan 2019 07:31:02 GMT
Content-Type: text/plain;charset=UTF-8
Content-Length: 93
Connection: keep-alive
Accept-Charset: big5, big5-hkscs, euc-jp, euc-kr, gb18030, gb2312, gbk, ibm-thai, ibm00858, ibm01140, ibm01141
?
{"adlist":{"kaiping":{"ad":{}},"yunying":{"ad":{}}},"showadtime":"10","getadlisttime":"1200"}</pre>
1.2.1 狀態(tài)嗎
2xx:成功,報(bào)文已成功收到并被正確處理 3xx:重定向髓介,資源位置發(fā)生變動(dòng),需要客戶端重新發(fā)送請(qǐng)求 4xx:客戶端錯(cuò)誤筋现,請(qǐng)求報(bào)文有誤唐础,服務(wù)器無(wú)法處理 5xx:服務(wù)器錯(cuò)誤箱歧,服務(wù)器在處理請(qǐng)求時(shí)內(nèi)部發(fā)生了錯(cuò)誤</pre>```
200 請(qǐng)求成功
304 緩存可以繼續(xù)用
404 地址有問(wèn)題
500 服務(wù)器內(nèi)部錯(cuò)誤
301:請(qǐng)求的資源永久遷移到新的位置
302:請(qǐng)求的資源暫時(shí)需要從另一個(gè)地址響應(yīng),后續(xù)的請(qǐng)求中應(yīng)該繼續(xù)使用原地址
305:使用代理一膨,請(qǐng)求的資源需要通過(guò)指定的代理訪問(wèn)
307:請(qǐng)求資源臨時(shí)需要從新地址響應(yīng)(與 302 不同的是它是 HTTP1.1 出現(xiàn)的呀邢;此外,如果重定向 307 的原請(qǐng)求不是 GET 或者 HEAD 方法豹绪,瀏覽器一定不能自動(dòng)的進(jìn)行重定向)
400:客戶端請(qǐng)求語(yǔ)法錯(cuò)誤
403:禁止訪問(wèn)价淌,服務(wù)器理解請(qǐng)求,但由于沒(méi)有授權(quán)服務(wù)器拒絕提供資源
404:找不到瞒津,請(qǐng)求的位置無(wú)法找到任何資源
406:無(wú)法訪問(wèn)蝉衣,請(qǐng)求資源的類型和想要的不一樣
1.2.2 響應(yīng)頭
Cache-Control
:緩存策略,private(中間節(jié)點(diǎn)不能緩存數(shù)據(jù)巷蚪,個(gè)性信息)/public(中間節(jié)點(diǎn)能緩存數(shù)據(jù)病毡,公有信息)Pramga
:用于在舊版本兼容
Cache-Control`Connection
:連接是否要保持,在 HTTP1.1 開(kāi)始允許保持連接Cotent-Encoding
:服務(wù)器使用了什么壓縮方法屁柏,客戶端需要進(jìn)行相應(yīng)的處理Content-Type
:返回的數(shù)據(jù)類型Content-Length
:服務(wù)器告知相應(yīng)對(duì)象的長(zhǎng)度Content-Range
:服務(wù)器告知該想要屬于哪個(gè)部分啦膜,一般用于斷點(diǎn)續(xù)傳Range
:客戶端告知服務(wù)器自己想取對(duì)象的哪部分,一般用于斷點(diǎn)續(xù)傳Set-Cookie
:服務(wù)端告知當(dāng)前 Cookie 的使用限制淌喻,包括:過(guò)期日期僧家、路徑、域似嗤、端口啸臀、版本等ETag
:對(duì)當(dāng)前相應(yīng)的一個(gè)標(biāo)識(shí),用于判斷請(qǐng)求資源是否修改Expired
:服務(wù)器表明該相應(yīng)將在什么時(shí)候過(guò)期(過(guò)期了的對(duì)象烁落,只有在跟服務(wù)器驗(yàn)證其有效性后乘粒,才能用來(lái)響應(yīng)客戶請(qǐng)求)Location
:指定重定向的url地址,請(qǐng)求http://www.baidu.com重定向到https://www.baidu.com
Location: https://www.baidu.com/
Non-Authoritative-Reason: HSTS</pre>
Proxy-Authenticate
: 代理服務(wù)器處理的請(qǐng)求伤塌,要求客戶端提供代理身份驗(yàn)證信息Referer
:客戶端告知服務(wù)器自己是從哪個(gè) URL 點(diǎn)擊當(dāng)前請(qǐng)求中的 URLTransfer-Encoding
:服務(wù)器表明自己對(duì)本響應(yīng)體作了怎樣的編碼灯萍,比如是否分塊(chunked)Last-Modified:服務(wù)器返回一個(gè)過(guò)期時(shí)間
User-Agent:用戶代理,實(shí)際發(fā)送請(qǐng)求每聪,接受響應(yīng)的瀏覽器和手機(jī)旦棉。(返回手機(jī)頁(yè)面還是pc頁(yè)面)
Cache-Control:no-cache(下次使用時(shí),詢問(wèn)一下),no-store(不要緩存),max-age(未過(guò)期直接使用)
1.2.3 使用緩存過(guò)程如下圖:
2.HTTP 的特點(diǎn):
-
靈活可擴(kuò)展
-
HTTP 協(xié)議是一個(gè)“靈活可擴(kuò)展”的傳輸協(xié)議
只規(guī)定了報(bào)文的基本格式,各個(gè)組成部分并沒(méi)有嚴(yán)格的語(yǔ)法語(yǔ)義限制,開(kāi)發(fā)者可自由定制
能夠傳輸圖片,音頻,視頻等任意數(shù)據(jù)
-
-
可靠傳輸
-
HTTP 協(xié)議是一個(gè)“可靠”的傳輸協(xié)議
基于 TCP/IP 的药薯,而 TCP 本身是一個(gè)“可靠”的傳輸協(xié)議
HTTP 并不能 100% 保證數(shù)據(jù)一定能夠發(fā)送到另一端绑洛,在網(wǎng)絡(luò)繁忙、連接質(zhì)量差等惡劣的環(huán)境下童本,也有可能收發(fā)失敗.
-
-
應(yīng)用層協(xié)議
-
HTTP 協(xié)議是一個(gè)應(yīng)用層的協(xié)議
- 對(duì)比其他應(yīng)用層協(xié)議,HTTP 協(xié)議稱得上是一個(gè)萬(wàn)能的協(xié)議,只要性能不太苛刻,幾乎可以傳輸一切東西
-
-
請(qǐng)求 - 應(yīng)答
- HTTP 協(xié)議使用的是請(qǐng)求 - 應(yīng)答通信模式
-
無(wú)狀態(tài)
-
HTTP 協(xié)議是無(wú)狀態(tài)的
TCP 協(xié)議:有狀態(tài),一開(kāi)始處于 CLOSED 狀態(tài)真屯,連接成功后是ESTABLISHED 狀態(tài),斷開(kāi)連接后是 FIN-WAIT 狀態(tài)穷娱,最后又是 CLOSED 狀態(tài)绑蔫。
HTTP 協(xié)議:客戶端和服務(wù)器永遠(yuǎn)是處在一種“無(wú)知”的狀態(tài),建立連接前兩者互不知情运沦,每次收發(fā)的報(bào)文也都是互相獨(dú)立的,沒(méi)有任何的聯(lián)系。收發(fā)報(bào)文也不會(huì)對(duì)客戶端或服務(wù)器產(chǎn)生任何影響,連接后也不會(huì)要求保存任何信息配深。
UDP 協(xié)議:它是無(wú)連接也無(wú)狀態(tài)的携添,順序發(fā)包亂序收包,數(shù)據(jù)包發(fā)出去后就不管了,收到后也不會(huì)順序整理篓叶。而 HTTP 是有連接無(wú)狀態(tài)烈掠,順序發(fā)包順序收包,按照收發(fā)的順序管理報(bào)文.
-
3. HTTP 的優(yōu)點(diǎn)和缺點(diǎn)
3.1 優(yōu)點(diǎn)
1.簡(jiǎn)單澜共、靈活向叉、易于擴(kuò)展
2.應(yīng)用廣泛、環(huán)境成熟
3.2 雙刃劍
-
無(wú)狀態(tài)
-
優(yōu)點(diǎn):
節(jié)省資源,實(shí)現(xiàn)簡(jiǎn)單
容易組成集群(服務(wù)器都是相同的,無(wú)狀態(tài)差異)
缺點(diǎn):無(wú)法支持需要多個(gè)步驟的"事務(wù)操作",如電商購(gòu)物,用戶首先需要登陸,然后添加購(gòu)物車,再下單,結(jié)算,支付,而這一系列過(guò)程都需要知道用戶的身份信息才可以,又因?yàn)?http 的無(wú)狀態(tài),每一次都需要問(wèn)一遍身份信息,不僅麻煩,還浪費(fèi)資源.
-
-
明文
協(xié)議里的報(bào)文(準(zhǔn)確地說(shuō)是 header 部分)不使用二進(jìn)制數(shù)據(jù)嗦董,而是用簡(jiǎn)單可閱讀的文本形式母谎。
優(yōu)點(diǎn):不需要借助任何外部工具,容易查看或修改,方便調(diào)試
缺點(diǎn):報(bào)文所有信息都暴露在傳輸鏈路里
3.3 缺點(diǎn):
-
不安全
安全有很多的方面,明文只是“機(jī)密”方面的一個(gè)缺點(diǎn)京革,在“身份認(rèn)證”和“完整性校驗(yàn)”這兩方面 HTTP 也是欠缺的奇唤。
身份認(rèn)證:HTTP 無(wú)法提供有效的手段來(lái)確認(rèn)通信雙方的真實(shí)身份,很可能會(huì)連到一個(gè)一模一樣的假冒 站
不支持完整性校驗(yàn),數(shù)據(jù)在傳輸過(guò)程中容易被篡改而無(wú)法辨別真?zhèn)?
- 雖然銀行可以用 MD5、SHA1 等算法給報(bào)文加上數(shù)字摘要匹摇,但還是因?yàn)椤懊魑摹边@個(gè)致命缺點(diǎn)咬扇,黑客可以連同摘要一同修改,最終還是判斷不出報(bào)文是否被竄改
如何解決:HTTPS
- 性能
概括:不算好,不夠好
基于 TCP ,TCP的性能是不差的,但現(xiàn)在的互聯(lián)網(wǎng)特點(diǎn)是移動(dòng)和高并發(fā),不能保證穩(wěn)定的連接質(zhì)量,所以在 TCP 層面上 HTTP 協(xié)議有時(shí)候就會(huì)表現(xiàn)的不夠好
請(qǐng)求 - 應(yīng)答”模式則加劇了 HTTP 的性能問(wèn)題,即隊(duì)頭阻塞”(Head-of-line blocking),當(dāng)順序發(fā)送的請(qǐng)求序列中的一個(gè)請(qǐng)求因?yàn)槟撤N原因被阻塞時(shí),在后面排隊(duì)的所有請(qǐng)求也一并被阻塞廊勃,會(huì)導(dǎo)致客戶端遲遲收不到數(shù)據(jù)
如何解決:Web 性能優(yōu)化,緩存等
終極解決方案:HTTP/2 和 HTTP/3