0.什麼是HTTP?
HTTP(HyperText Transfer Protocol): 超文本傳輸協定。是網際網路上應用最廣泛的一種網絡協定。
所有www檔案都必須遵守的一個标準,是以 ASCII 碼傳輸,建立在 TCP/IP 協定之上的應用層規範。
簡單點說就是一種固定的通訊規則。
1.HTTP/0.9版本
這是最早定稿的HTTP版本,這個版本中它的内容非常地簡單。
- 首先它隻有一個指令GET。對應到現在的GET請求和POST請求,這些叫做HTTP的指令或者方法。
- 它沒有HEADER等描述資料的資訊。因為這個時候的請求非常簡單,它需要達到的目的也非常簡單,沒有那麼多資料格式。
-
伺服器發送完内容之後,就關閉TCP連接配接。這裡需要注意一點,這裡的TCP連接配接和http請求是不一樣的。http請求和TCP連接配接不是一個概念。一個http請求通過TCP連接配接發送,
而一個TCP連接配接裡面可以發送很多個http請求(HTTP/0.9不能這麼做,但是HTTP/1.1可以這麼做,而且在HTTP/2這方面會更大程度地優化,來提高HTTP協定傳輸的效率以及伺服器的性能)
是以一個TCP連接配接對應的是多個http請求,一個http請求肯定是在某一個TCP連接配接裡面進行發送的,
2.HTTP/1.0版本
這個版本和現在普遍使用的HTTP/1.1差不多,在HTTP/0.9版本基礎上進行了改進。
- 增加了很多指令。比如:POST、PUT、HEADER這些指令。
- 增加了status code和header相關的内容。status code是用來描述伺服器端處理某一個請求之後的狀态的;header主要包含:請求和發送資料的描述以及對這部分資料進行操作的方法。
- 增加了多字元集支援、多部分發送、權限、緩存等相關的内容。這些内容有利于更好地使用http請求去實作WEB服務。
3.HTTP/1.1版本
這個版本是在HTTP/1.0的基礎上增加了一些功能來優化網絡連接配接的過程。
-
在這個版本支援了持久連接配接。在HTTP/1.0版本裡面,一個http請求要發送就要先在用戶端和伺服器端之間建立一個TCP連接配接,建立完這個TCP連接配接之後,等伺服器端傳回完資料之後,這個TCP連接配接就關閉了。
這個成本是相對比較高的,因為在建立一個TCP連接配接的過程中要進行http的三次握手,這一部分是通過TCP來完成的,在建立這個連接配接的過程中消耗是比較高的,延遲也會比較高。
是以如果在建立完一個連接配接之後,它可以不關閉,之後新的http請求就可以一直在這個連接配接裡面進行資料發送的話,它的性能和效率肯定會提升很多,HTTP/1.1已經實作了這個功能。
-
增加了pipeline。可以在同一個TCP連接配接裡面發送多個http請求,就是上面說的那樣。但是在HTTP/1.1裡面,雖然是可以在同一個TCP連接配接裡面發送多個http請求,但是伺服器端對于進來的請求,是要按照順序進行資料傳回的。
是以,如果前一個請求等待時間非常長,而後一個請求處理得比較快。這個時候後一個請求不能先發送,而是要等第一個請求資料全部發送完成之後,才能進行發送,即是串行的。等待的這部分時間就展現出了與并行傳輸性能之間的差距。
而這個在HTTP/2裡面得到了優化。
-
增加了HTTP的頭host和其他一些指令。其中比較重要的就是host,有了host之後就可以在同一台伺服器(實體伺服器)上同時跑多個web服務。比如說一個Node.js的web服務,一個Java的web服務。
通過host這個字段來表示兩個服務都是請求到同一個實體伺服器上,但是我要請求的是裡面哪一個軟體服務,Node.js還是Java?
這就是通過host來進行判斷的。這個host頭增加的好處就是,在同一個實體伺服器或者同一個叢集裡面可以部署很多不同的web服務來,提高了實體伺服器的使用效率。
4.HTTP/2版本
雖然現在還沒有普及,但是毫無疑問是未來的趨勢。
- 所有資料都是以二進制進行傳輸的。在HTTP/1.1裡面大部分的資料傳輸是通過字元串,是以資料的分片方式是不太一樣的。在HTTP/2裡面所有的資料都是以幀進行傳輸的。
- 正是因為有了這個好處,同一個連接配接裡面發送多個請求時,伺服器端不再需要按照順序來傳回處理後的資料了。而是可以在傳回第一個請求裡面資料的時候,同時傳回第二個請求裡面的資料。這樣的并行傳輸能夠更大限度地提高web應用的傳輸效率。
- 新增頭資訊壓縮以及推送等功能,提高了傳輸效率。HTTP/2其實主要就是改善了HTTP/1.1裡面造成性能低下的一些問題。
第一個頭資訊的壓縮。在HTTP/1.1裡面每一次發送請求和傳回請求,很多http頭都是必須要進行完整的發送和傳回的,但是這一部分頭資訊裡面有很多的内容比如說:Headers字段、Content-Type、accept等字段是以字元串的形式儲存的。
是以占用較大的帶寬量。是以HTTP/2裡面對頭資訊進行了壓縮,可以有效地減少帶寬使用;
第二個是推送的功能。指的是HTTP/2之前,隻能由用戶端發送資料,伺服器端傳回資料。用戶端是主動方,伺服器端永遠是被動方。在HTTP/2裡面有了”推送”的概念,也就是說伺服器端可以主動向用戶端發起一些資料傳輸。
舉個例子:我們知道一個web頁面加載時會要求一些html、css、js等檔案,css和js檔案是以連結的形式在html文本裡面顯示的,隻有通過浏覽器解析了html裡面的内容之後,才能根據連結裡面包含的URL位址去請求對應的css和js檔案。
在HTTP/2之前,這個傳輸過程會包含順序問題,需要先請求到html的檔案,通過浏覽器運作解析這個html檔案之後,才能去發送css的請求和js的請求。
HTTP/2中有了推送功能之後,在請求html的同時,伺服器端可以主動把html裡面所引用到的css和js檔案推送到用戶端,這樣html、css和js的發送就是并行的而不是串行的,整體的傳輸效率和性能就提高了不少。
5.HTTP/2與HTTP/1.1性能對比
官方測試網站 https://http2.akamai.com/demo/http2-lab.html
官網提供了多種版本的對比測試有HTTP1.1與HTTP2的比較,還有伺服器端推送(server-push)不同個數之間的比較:(由于網絡延遲不同,測試結果或有差異)

-
HTTP1.1與HTTP2的對比:Compare HTTP1.1 (HTTP) vs HTTP2 (HTTPS):
可以看到分别使用HTTP/1.1和HTTP/2加載同一張由多張小圖檔組成的大圖檔:HTTP/1.1用了7.41s,而HTTP/2隻用了1.47s。HTTP2比HTTP/1.1快了将近5倍。
因為為了加載這張大圖,需要請求許多的小圖,HTTP/1.1采用的是串行地請求,是以速度要比采用并行請求的HTTP/2要慢上許多。
這就是HTTP的簡要發展曆史,除此之外還包含了HTTPS協定。HTTPS實際上是附加了安全屬性的HTTP協定,實際使用與HTTP/1.1差別不大。
多抽出1分鐘來學習,讓你的生命更加精彩!