HTTP是創建在TCP協議上的,HTTP協議的瓶頸及優化都是基於TCP協議自己的特性。web
TCP創建鏈接時有三次握手 會有1.5RTT的延遲,爲了不每次請求都經歷握手待來的延遲,應用層會選擇不一樣策略的http長鏈接。算法
http1.0協議頭裏能夠設置Connection:Keep-Alive。在header裏設置Keep-Alive能夠在必定時間內複用鏈接,具體複用時間的長短能夠由服務器控制,通常在15s左右。到http1.1以後Connection的默認值就是Keep-Alive,若是要關閉鏈接複用須要顯式的設置Connection:Close。 <br /> head of line blocking會由於一個request沒有到達服務器或者一個response由於網絡沒有及時返回而影響後續全部請求。
客戶端在初始狀態會發送一個polling請求到服務器,服務器並不會立刻返回業務數據,而是等待有新的業務數據產生時返回。因此鏈接會被保持,一旦結束立刻又會發起一個新的polling請求,反覆如此。安全
與long-polling不一樣,server並不會結束初始的streaming請求,而是持續的經過這個通道返回最新的業務數據,但這個通道時單向的。服務器
與傳統的 tcp socket鏈接類似,也是基於tcp協議,並提供雙向的數據通道。cookie
讓每一個請求不用等待其餘請求的response返回以後才發出,而是幾乎在同一時間把request發送給服務器。網絡
http 1.X存在諸多問題,在嘗試了各類優化手段後提出的SPDY方案。socket
X-Associated-Content header
告知客戶端會有新的內容推送過來。X-Subresources header
來通知。http://和https://
的服務和應用不會要作任何更改。http 1.x是明文協議,格式由strat line
,header
,body
組成。須要作協議解析來識別這3哥部分,http1.x的解析是基於文本的,而文本格式解析存在自然缺陷,二進制比文本格式更方便且健壯。
http 2.0的格式定義更接近tcp。由Length
,Type
,Flags
,Stream ID
,Payload
5個部分組成。tcp
length
定義了整個frame的開始到結束type
定義frame的類型flags
用bit位定義了一些重要的參數stream id
用做流控制payload
就是request的正文stream id
做用就是鏈接共享機制,一個request對應一個stream並分配一個id,這樣一個鏈接上能夠有多個stream,每一個stream的frame隨機混雜在一塊兒,接收方根據stream id將frame再歸屬到各自不一樣的request裏面。每一個stream均可以設置優先級和依賴。優化
http2.0使用encoder來減小須要傳輸的header大小,通信雙方各自cache一份header fields表,避免重複header傳輸,減小傳輸大小。加密
SPDY/2使用的是gzip 壓縮算法,後來出現BREACH
和CRIME
2種攻擊方式,即便走SSL的SPDY也能夠破解內容,http2.0採用HPACK
的壓縮算法。
對於http 1.x來講,是經過設置tcp segment裏的reset flag來通知對端關閉鏈接。http2.0引入RST_STREAM
類型的frame,能夠在不斷開鏈接的前提下取消某個request的stream。
http2.0 經過相似receive window
的作法,數據的接收方經過告知對方本身的flow window
大小代表本身還能接收多少數據。只有Data類型的 frame纔有流量控制功能。
http2.0 經過push的方式將客戶端需求的內容預先推送過去,也叫cache push
。若是客戶端退出,需取消server push
,能夠經過發送RST_STREAM
類型的frame來作到。
Nagle Algorithm/TCP Delayed Ack
是一組對立的算法。http2.0能夠經過TCP_NODELAY
禁用Nagle或TCP_QUICKACK
禁用ACK。官方推薦設置TCP_NODELAY
HTTP2.0使用了tls的拓展ALPN來作協議升級,除此以外加密這塊還有一個改動,HTTP2.0對tls的安全性作了近一步增強