前端—梳理 http 知識體系 2
為什麼要有HTTPS
HTTP 天生具有明文的特點,整個傳輸過程完全透明,任何人都能夠在鏈路中截獲、修改或者偽造請求 / 響應報文,數據不具有安全性。僅憑HTTP 自身是無法解決的,需要引入新的HTTPS協議,簡單的說就是不安全。
什麼是HTTPS
HTTPS是一種通過電腦網路進行安全通訊的傳輸協議,經由HTTP進行通訊,利用SSL/TLS建立安全信道,加密數據包。
HTTPS 是一個「非常簡單」的協議,RFC 文檔很小,只有短短的 7 頁,裡面規定了新的協議名「https」,默認埠號 443,至於其他的什麼請求 – 應答模式、報文結構、請求方法、URI、頭欄位、連接管理等等都完全沿用 HTTP,沒有任何新的東西。
也就是說,除了協議名http和埠號 80 這兩點不同,HTTPS 協議在語法、語義上和 HTTP 完全一樣,優缺點也照單全收(當然要除去明文和不安全)
HTTPS 是怎麼做到安全性?
秘密就在於 HTTPS 名字里的「S」,它把 HTTP 下層的傳輸協議由 TCP/IP 換成了 SSL/TLS,由HTTP over TCP/IP變成了HTTP over SSL/TLS,讓 HTTP 運行在了安全的 SSL/TLS 協議上,收發報文不再使用 Socket API,而是調用專門的安全介面。
SSL/TLS
SSL 即安全套接層(Secure Sockets Layer),在 OSI 模型中處於第 5 層(會話層),由網景公司於 1994 年發明,有 v2 和 v3 兩個版本,而 v1 因為有嚴重的缺陷從未公開過。
SSL 發展到 v3 時已經證明了它自身是一個非常好的安全通訊協議,於是互聯網工程組 IETF 在 1999 年把它改名為 TLS(傳輸層安全,Transport Layer Security),正式標準化,版本號從 1.0 重新算起,所以 TLS1.0 實際上就是 SSLv3.1。
簡單的理解就是安全傳輸層協議(TLS)用於在兩個通訊應用程式之間提供保密性和數據完整性的作用。
TLS 協議包括兩個協議組―― TLS 記錄協議和 TLS 握手協議
TLS 由記錄協議、握手協議、警告協議、變更密碼規範協議、擴展協議等幾個子協議組成,綜合使用了對稱加密、非對稱加密、身份認證等許多密碼學前沿技術,具體可以查閱相關資料進一步了解。
HTTP/2 的理解
你一定很想知道,為什麼 HTTP/2 不像之前的1.0、1.1、那樣叫2.0呢?
這個也是很多初次接觸 HTTP/2 的人問的最多的一個問題,對此 HTTP/2 工作組特別給出了解釋。
他們認為以前的1.0、1.1造成了很多的混亂和誤解,讓人在實際的使用中難以區分差異,所以就決定 HTTP 協議不再使用小版本號,只使用大版本號,從今往後 HTTP 協議不會出現 HTTP/2.0、2.1,只會有HTTP/2,HTTP/3……
中國哪些網站用了HTTP2
目前還是很多公司都升級到了HTTP/2 比如 蘋果官網、騰訊網、csdn、掘金 等
兼容http/1
由於 HTTPS 已經在安全方面做的非常好了,所以 HTTP/2 的唯一目標就是改進性能,且兼容HTTP1.x 版本的。
HTTP/2特點
頭部壓縮
HPACK
演算法進行頭部壓縮。二進位分幀
二進位分幀指的是傳輸的都是二進位,而幀只是一個傳輸單位。把原來的Header+Body的消息報文格式,拆分為一個一個的二進位「幀」(Frame),
用HEADERS幀存放頭數據、DATA幀存放實體數據。
這樣子的話,就是一堆亂序的二進位幀,它們不存在先後關係,因此不需要排隊等待,解決了HTTP隊頭阻塞問題。
虛擬的流–多路復用
二進位分幀把數據都拆分為一個一個的二進位數據包,那麼傳輸過去之後數據怎麼組裝起來呢?
HTTP/2 為此定義了一個流(Stream)的概念,它是二進位幀的雙向傳輸序列,同一個消息往返的幀會分配一個唯一的流 ID。你可以把它想像成是一個虛擬的「數據流」,在裡面流動的是一串有先後順序的數據幀,這些數據幀按照次序組裝起來就是 HTTP/1 里的請求報文和響應報文。
因為流是虛擬的,實際上並不存在,所以 HTTP/2 就可以在一個 TCP 連接上用流同時發送多個拆分之後的二進位幀數據包,這就是常說的多路復用( Multiplexing)——多個往返通訊都復用一個連接來處理。
如何理解h2 中的流
客戶端將多個請求分成不同的流,然後每個流裡面在切成一個個二進位幀,發送的時候是按二進位幀發送。每個幀存著一個流ID來表示它屬於的流,服務端收到請求的時候將幀按流ID進行拼接。
強化安全
https 是大勢所趨,通常所能見到的 HTTP/2 都是使用「https」協議名,跑在 TLS 上面。
為了區分「加密」和「明文」這兩個不同的版本,HTTP/2 協議定義了兩個字元串標識符:
1、h2表示加密的 HTTP/2
2、h2c表示明文的 HTTP/2,多出的那個字母c的意思是clear text
協議棧對比
HTTP/2 小結
- HTTP 協議取消了小版本號,所以 HTTP/2 的正式名字不是 2.0;
- HTTP/2 在「語義」上兼容 HTTP/1,保留了請求方法、URI 等傳統概念;
- HTTP/2 使用HPACK演算法壓縮頭部資訊,消除冗餘數據節約頻寬;
- HTTP/2 的消息不再是「Header+Body」的形式,而是分散為多個二進位幀;
- HTTP/2 使用虛擬的「流」傳輸消息,解決了困擾多年的「隊頭阻塞」問題,同時實現了「多路復用」,提高連接的利用率;
- HTTP/2 也增強了安全性,要求至少是 TLS1.2,而且禁用了很多不安全的密碼套件。
HTTP2 的核心就是二進位分幀、流概念、多路復用(永遠都只在一個TCP 連接裡面,因為一個TCP 中虛擬了很多流,一個請求-響應就對應一個流)
隊頭阻塞
從HTTP/1.0誕生,一直到HTTP/2,在這24年里,HTTP協議已經做過了三次升級,但是有一個關鍵的技術點是不變的,那就是這所有的HTTP協議,都是基於TCP協議實現的。流水的HTTP,鐵打的TCP,這是因為相對於UDP協議,TCP協議更加可靠。
HTTP/2廢棄了管道化的方式,而是創新性的引入了幀、消息和數據流等概念。客戶端和伺服器可以把 HTTP 消息分解為互不依賴的幀,然後亂序發送,最後再在另一端把它們重新組合起來。因為沒有順序了,所以就不阻塞了,就有效的解決了HTTP對頭阻塞的問題。
但是,HTTP/2仍然會存在對頭阻塞的問題,那是因為HTTP/2其實還是依賴TCP協議實現的。
TCP傳輸過程
TCP傳輸過程中會把數據拆分為一個個按照順序排列的數據包,這些數據包通過網路傳輸到了接收端,接收端再按照順序將這些數據包組合成原始數據,這樣就完成了數據傳輸。
但是如果其中的某一個數據包沒有按照順序到達,接收端會一直保持連接等待數據包返回(丟包重傳機制),這時候就會阻塞後續請求。這就發生了TCP隊頭阻塞。
http/2 只是解決http 的對頭阻塞,並沒有解決tcp 的對頭阻塞,隊頭阻塞分為兩個層面,一個是HTTP 隊頭阻塞,一個是TCP 隊頭阻塞。
HTTP 對頭阻塞
HTTP 是一個請求-應答的模式,類似一個隊列,先進先出的模式,後面的一個請求只能等前面的請求好了,才發出請求。
如果隊首的請求因為處理的太慢耽誤了時間,那麼隊列里後面的所有請求也不得不跟著一起等待,結果就是其他的請求承擔了不應有的時間成本,造成了阻塞。
在HTTP1.1 中針對HTTP對頭阻塞,增加了並發連接的規則,這也算是空間換時間的思路,瀏覽器與伺服器建立多個TCP連接,現在比較常用的並發連接數已經增加到 6 – 8個,不同的瀏覽器應該不同的實現。
在HTTP2 中增加了流、以及二進位分幀、多路復用,讓數據包之間可以是亂序的發送,數據包之間沒有順序的依賴關係,解決HTTP 對頭阻塞的問題,但是底層還是基於TCP 協議,所以還存在TCP 對頭阻塞問題,所以HTTP3 來了。
HTTP3的基本思路,應該跟處理這個HTTP 對頭阻塞差不多,讓各個數據包之間沒有依賴關係,其中一個有問題,不會影響其他連接。
TCP 對頭阻塞
在HTTP/2 中應用層向下傳輸的數據是做到了亂序,二進位,但是TCP層的數據包還是有序傳輸,中間一個數據包丟失,會等待該數據包重傳,造成後面的數據包的阻塞,這也就是丟包重傳機制,因為TCP在丟包的情況下必須等待重傳確認,此時其他包就算到達緩衝區,上層應用也是無法拿出來的。
總結
做興趣使然的Hero,發現問題,解決問題。