如何理解http、http1.0、http1.1、http2.0、https?
web開發,對http有所瞭解是很重要的。
這裡是我對幾個概念的講解。
http
http是一種資料傳輸的協議,它工作在應用層,基於網路層的tcp協議,中文全稱叫“超文字傳輸協議”,最開始的用途就是為了傳輸超文字(html)。
http協議是無狀態的,也就是前後兩次請求,沒有必然聯絡,不會儲存上一次請求的相關資訊和狀態,每一次請求都是獨立的,伺服器和瀏覽器都只知道這次請求的資訊。也正是因為“無狀態”,瀏覽器和伺服器需要通過cookie和session來儲存一些狀態和標識,比如是否已登入。
http是以一個請求對應一個響應的形式設計的,也就是說,基於http的話,伺服器只有接收到請求後才能響應。
http和tcp
http之所以採用tcp(傳輸控制協議)在網路層上傳輸資料,主要因為它可能傳輸很多資料,而tcp支援按順序組織資料並保證資料完整性。
也正因為http採用了tcp作為網路層的支援,其本身也就具備了tcp必然的特性,比如握手機制、新建tcp連線的慢啟動問題等。
慢啟動:當tcp連線被建立時,它會先進行一次握手,以確保資料能夠到達另一方,然後再開始傳輸資料,剛開始傳輸資料的時候,不會以最大速率進行傳輸,而是慢慢加大傳輸速率,慢啟動主要是為了保證資料完整性和tcp所追求的穩定性。
http1.0
最先廣泛使用的版本。
主要採用短連線的設計,一次請求,就建立一個tcp連線,響應結束,就立刻關閉。
這導致一個網頁的資源一旦很複雜,比如需要請求很多資料,就會開啟大量的tcp連線,而因此,tcp慢啟動的特性嚴重影響了http的效率,同樣因為多個tcp開啟需要經歷多個三次握手,也是浪費。
http1.1
目前最流行的版本。
- 效率優化(tcp長連線)
它改進了1.0的效率問題,將之前採用tcp短連線的形式優化到了tcp長連線,也就是一個tcp連線,可以處理多次http傳輸(請求)。我們可以在請求頭或者響應頭中看到一個connection引數,它等於close的時候,可以使http請求使用tcp短連線,預設情況下它是keep-alive(長連線)。
- 併發請求
因為改成了長連線,http1.1支援針對統一域名同時發起多個http請求(併發處理),但針對同一域名的併發處理有數量限制,超過數量後會被阻塞,具體的限定數量,由瀏覽器決定,現代瀏覽器一般是6個。
在http1.1這個機制下,如果想要併發處理超過限制數量的請求,則可以通過使用不同域名的方式來繞過去,因為http1.1的併發請求限制是針對域名 的。
-
其他
另外,http1.1還增加了一些請求頭,比如host ,用於讓伺服器確定是哪個虛擬空間(網站)。這讓一臺伺服器能夠支援執行多個網站。
http1.1還增加了身份認證、狀態管理、cache相關的請求響應頭、斷點續傳 等。
http2.0
已經有一定普及率的版本
這個版本主要增加了多路複用、二進位制分幀、首部壓縮、伺服器推送等。
-
多路複用
多路複用對效能提升最為顯著, 1.1的時候,多個http請求是通過開啟多個tcp連線來實現併發的,但在2.0中,多個http請求的併發,是在一個tcp連線中實現。
多路指的是多條通路,複用指重複使用tcp連線,說白了就是一個tcp可以處理多個併發http請求
-
二進位制分幀
1.1時,資料直接以文字傳輸,是沒有順序的,伺服器和瀏覽器雙方都是按接收順序來組裝資料的,這導致一個tcp必須傳輸一份資料,如果多份資料傳輸,雙方接收的資料就混亂了。
2.0因為將資料拆分成了更小的幀和流,也就是二進位制分幀,在應用層和網路層中間又加了二進位制分幀層,幀是有順序的,這樣傳輸資料的雙方就可以根據流來分類、再按幀的順序來組裝資料
https
https實際上不適合放在http1.0、1.1、2.0中間來討論,因為完全是兩回事。
但在這裡,還是總結一下。
https實際上就是http協議和tls(ssl)協議的組合。
http負責傳輸,tls負責加解密(現在一般都用tls,ssl已經很老了)
http傳輸的時候,資料是沒有經過加密的,這不安全,所以引入了tls協議來對資料加解密,先處理成密文,再放到下層去工作,http拿到要傳輸的資料時,這個資料已經經過tls協議的加密,所以http本身也不知道這個資料原本是什麼樣子。而http從下層拿到資料時,也不知道這個資料是什麼內容,需要傳給上面的tls層來解密,才能顯示出來。
這就是https大致的意思。
從速度上,https因為多了加解密的步驟,且比http多幾次握手(用於雙方確定加密方式和證書),所以會慢一些。
另外,https採用非對稱加密技術。