1.起源
- 在現(xiàn)有的互聯(lián)網(wǎng)設(shè)置基礎(chǔ)和http協(xié)議廣泛使用的前提下,是可以通過修改協(xié)議層來優(yōu)化http1.x的
- 針對http1.x的修改確實效果明顯而且業(yè)界反饋很好(SPDY)
所以追逮,IETF開始正式考慮制定HTTP2.0泣栈,最后決定以SPDY/3為藍(lán)圖起草HTTP2.0
2.需要思考的問題
-
HTTP的不足
1)單路連接,請求低效
HTTP 協(xié)議的最大弊端就是每個 TCP 連接只能對應(yīng)一個 HTTP 請求抑进,即每個 HTTP 連接只請求一個資源强经,瀏覽器只能通過建立多個連接來解決。此外在 HTTP 中對請求是嚴(yán)格的先入先出(FIFO)進(jìn)行的寺渗,如果中間某個請求處理時間較長會阻塞后面的請求(head of line blocking)匿情。雖然HTTP pipelining對連接請求做了改善,但是復(fù)雜度太大信殊,并沒有普及
2)只允許客戶端主動發(fā)起請求
3)頭冗余
HTTP 頭在同一個會話里是反復(fù)發(fā)送的炬称,中間的冗余信息,比如 User-Agent涡拘、Host 等不需要重復(fù)發(fā)送的信息也在反復(fù)發(fā)送玲躯,浪費帶寬和資源
3.HTTP2.0主要改動
1)二進(jìn)制格式
HTTP1.x是明文協(xié)議,由三部分組成:start line、header跷车、body棘利。要識別這3部分需要做協(xié)議解析。HTTP1.x的解析是基于文本的朽缴,文本的表現(xiàn)形式多樣善玫,要做到健壯性考慮場景需很多
HTTP2.0實際上只是把原來HTTP1.x的header和body部分用frame重新封裝,并沒有改變其語義
2)多路復(fù)用
一個request對應(yīng)一個stream并分配一個id密强,這樣一個連接上可以有多個stream蝌焚,每個steam的frame可以隨機(jī)的混雜在一起,接收方根據(jù)stream id將frame再歸屬到各自不同的request里面
3)header壓縮
header由于cookie誓斥、user agent只洒、host等信息容易膨脹,而且每次要重復(fù)發(fā)送劳坑。HTTP2.0使用encoder來減少header大小
4)重置連接表現(xiàn)變好
HTTP1.x是通過tcp segment里的reset flag來通知對端關(guān)閉連接的毕谴。這種方式會直接斷開連接,下次再發(fā)請求就必須重新建立連接距芬。HTTP2.0引入RST_STREAM類型的frame涝开,可以在不斷開連接的前提下取消對某個request的stream
5)Server Push
HTTP2.0能通過push的方式將客戶端需要的內(nèi)容預(yù)先推送過去(cache push)
6)更安全的SSL
4.HTTP2.0的不足
HTTP2.0對SSL的依賴使得有些開發(fā)者望而生畏
6.iOS的HTTP現(xiàn)狀
1)iOS系統(tǒng)從iOS8開始通過NSURLSession來支持SPDY
2)iOS9+自動支持HTTP2.0,iOS9+的SDK里NSURLSession默認(rèn)使用HTTP2.0
3)APN在iOS9上使用HTTP2.0實現(xiàn)
對于開發(fā)者而言框仔,主要從2個方面考慮HTTP的使用方案
- 1.app本身HTTP流量是否大而密集舀武,。在這種場景下离斩,HTTP2.0的才能更好的展示它的優(yōu)勢
- 2.開發(fā)團(tuán)隊本身的技術(shù)條件(是選擇基于iOS9+適配HTTP2.0银舱,還是基于iOS6+適配SPDY)
參考資料:《iOS成長之路》--- 第二章(MrPeak)