web項目開發中,咱們經過http來傳輸數據,這裏咱們來看一下,http是什麼以及發展歷程。css
HTTP,超文本傳輸協議。html
在咱們很是頁面的開發中,用來傳輸html、css、js、圖片、cgi等。git
HTTP 0.9版本,很簡單,只有一行請求(請求方法+路徑),響應只有一個HTML。github
正式的版本是HTTP 1.0web
請求:請求版本 + 首部瀏覽器
響應:響應狀態 + 首部(響應對象能夠包含任何類型:html、純文本、圖片等)服務器
HTTP 1.1 是對於HTTP 1.0的優化,減小延遲。下面看下1.1增長的新功能。websocket
1.1的持久連接能夠說是1.1的一大特點。socket
在1.0中,每次http連接都要進行tcp的三次握手和四次揮手。若是說請求很少的話,影響卻是不大,可是請求多的話,那麼請求的總時間就會大大延長。tcp
因而,1.1支持了持久連接(keep-alive),第一次連接以後,若是客戶端&服務器都沒有進行斷開的操做,那麼,tcp連接就一直保持。這樣,當http請求多的時候,天然,速度相比於1.0的話就快得多了。
咱們能夠抓一下掘金的請求,響應頭中能夠看到,使用的是http 1.1 ,而且connection的狀態是keep-alive。
http的請求隊列,是一個先進先出的隊列,在1.0的時候,這個隊列是由客戶端控制的,每次發送請求的時候,需求等待上一個請求回包以後,再繼續發下一個請求。這樣會出現服務器會有大部分時間是屬於空閒狀態的。
因此1.1的版本,把http請求隊列放到了服務器,客戶端能夠不用等待回包就能夠繼續發送下一個請求,服務器直接在隊列中獲取請求,而後一個一個處理,這樣,就能夠有效提高請求的效率。
http請求隊列的處理移動到服務端以後,確實速度能夠加快,不過這也是串行的,要提高服務器的效率,那咱們須要進行並行的操做。
因此,1.1作的就是能夠同時開多個tcp連接,這樣就能夠作到並行啦。不過,因爲瀏覽器限制,每一個域名的tcp連接最多隻能開6個。
固然,若是頁面想開更多的tcp連接,也是有辦法的,tcp連接數是按域名區分的,那麼咱們只要再添加域名就能夠增長tcp連接數啦~
2.0是第二個正式的版本,對1.1作了更多的優化。
1.1版本傳輸的數據是文本,相比於文本,二進制傳輸起來更加方便,底層不用再進行解析。
1.1的時候,爲了解決並行,開了多個tcp連接。多路服用,就是爲了解決並行而出現的。
1.1傳輸的數據是文本,不能亂序傳輸,因此只能串行。
2.0傳輸的是二進制,幀是最小的單位,這裏對幀標誌順序,既然有順序,傳輸就能夠並行了,接受數據方再根據數據幀進行拼接,就能夠獲得正確的信息。
因而,多路複用解決了單個tcp並行傳輸的問題。
客戶端&服務器對首部表進行存儲
第一次發送整個首部,以後根據diff來更新diff部分的數據。
雖然首部內容很少,可是每條數據都少一點的話,世界也將更加美好。
服務器推送,有點像websocket。
當用戶請求頁面的時候,服務器先返回html,而後客戶端再根據html解析請求須要的資源,這樣子客戶端其實要進行多個請求。
那麼服務器推送的效果呢?當客戶端訪問html以後,服務器就先把客戶端須要的資源發送給客戶端,那麼,客戶端須要資源的時候,就不用發送請求來,由於客戶端預先就拿到來資源,從而減小請求的時間。
3.0的版本,能夠說是改頭換貌。
咱們知道http 2.0以前,都是基於tcp的,由於tcp穩定。
而3.0卻拋棄來tcp,擁抱udp,穩定的事情就交給上層來作,也就是quic。
這個後面再細講,先留白。
http無處不在,不管是開發需求也好,仍是優化項目也好,都要熟悉http,才能更好的理解。
最後補充一下樓主以前的文章 HTTP1.1 vs HTTP2.0