ps:前端very need to 弄 it ,本人也是大概瞭解了下,有錯誤地方請指出。tks~前端
目前爲止HTTP1.1版本應用於市場較多,在1.1以前版本還有91年的0.9版本,96年的1.0版本。相比於以前的版本,1.1版本更豐富完善,但也有遺留了些問題須要解決。面試
1.相比於1.0,每一次 HTTP 請求,就要創建一個 TCP 連接。1.1引入了持久鏈接,TCP鏈接默認不關閉,能夠被多個請求複用(你要知道新建一個TCP鏈接很耗的)算法
2.管道機制( pipelining),管道化是客戶端能夠同時發出多個HTTP請求,而在發送過程當中不須要等待服務器對前一個請求的響應,只不過,客戶端仍是要按照發送請求的順序來接收響應,也就是說,若是第一個請求耗費了服務器不少的處理時間,那麼後面的請求都要等待第一個處理完,也就出現了線頭阻塞(隊首阻塞Head-of-line blocking),不少瀏覽器默認關閉了管道機制功能。因此如今使用HTTP1.1協議的應用,都是有可能會開多個TCP鏈接(雖然多個請求能夠複用同一個TCP鏈接,可是在一個鏈接中同一時刻只能處理一個請求,在當前的請求沒有結束以前,其餘的請求只能處於阻塞狀態),現代瀏覽器會針對單個域名開啓 6 個鏈接,經過各個鏈接分別發送請求!HTTP2相對解決了這個問題瀏覽器
說到隊首阻塞,我再多拉呱幾句:安全
HTTP1.0版本:對於同一個TCP鏈接,全部請求放入隊列中,只有前一個請求的響應收到了,而後才能發送下一個請求。可見,HTTP1.0的隊首組塞發生在客戶端。性能優化
HTTP1.1版本:對於同一個TCP鏈接,容許一次發送多個請求,也就是說,沒必要等前一個響應收到,就能夠發送下一個請求,這樣就解決了HTTP1.0的客戶端的隊首阻塞。可是,HTTP1.1規定,服務器端的響應的發送要根據請求被接收的順序排隊,也就是說,先接收到的請求的響應也要先發送。這樣形成的問題是,若是最早收到的請求的處理時間長的話,響應生成也慢,就會阻塞已經生成了的響應的發送。也會形成隊首阻塞。可見,HTTP1.1的隊首阻塞發生在服務器端。服務器
1.header壓縮
session
2.多路複用
併發
先來理解幾個概念:
dom
在過去, HTTP 性能優化的關鍵並不在於高帶寬,而是低延遲。TCP 鏈接會隨着時間進行自我「調諧」,起初會限制鏈接的最大速度,若是數據成功傳輸,會隨着時間的推移提升傳輸的速度。這種調諧則被稱爲 TCP 慢啓動
幀:HTTP2 數據通訊的最小單位消息,每一個幀都有對應流的標識。相比HTTP1.x文本傳輸解析,二進制幀解析就很方便了
流:存在於鏈接中的一個虛擬通道,你能夠把每一個請求當成一個流,流由幀組成
在一個TCP鏈接上,咱們能夠向對方不斷髮送幀,每幀的流標識這一幀屬於哪一個流,而後在對方接收時,根據標識拼接每一個流的全部幀組成一整塊數據。
把每一個請求都看成一個流,那麼多個請求變成多個流,請求響應數據分紅多個幀,不一樣流中的幀交錯地發送給對方,這就是 HTTP2 中的多路複用。
流的概念實現了單鏈接上多請求 - 響應並行,解決了線頭阻塞的問題
3.服務端推送
瀏覽器發送一個請求,服務器主動向瀏覽器推送與這個請求相關的資源,這樣瀏覽器就不用發起後續請求。
通常要求用HTTP2就得上HTTPS
HTTP2 vs HTTP1.X
1.全部通訊都在單個鏈接上完成,不須要單獨開TCP鏈接,能有效解決高延遲問題
2.header壓縮體積更小,減小開銷
3.有效解除隊首阻塞問題
4.採用二進制格式,非文本格式
5.服務端主動推送響應
前端面試常常會被問到TCP協議中的三次握手四次揮手這種老生常談的問題了。我之前也是隻知其一;不知其二,並無好好去了解它。固然前端須要瞭解的也不須要太深度。畢竟咱只是切圖的。廢話很少說,上文:
SYA/ACK:標誌位,只爲1或者0
SYN:1 表示發起鏈接
ACK:1 表示確認收到
seq:一個隨機序號的數據包
ack:確認號,表示對此次數據包的確認,以及對下次收到數據包的期待
須要注意的是:
(A)不要將確認號ack與標誌位中的ACK搞混了
(B)確認方ack=發起方seq+1,兩端配對
大體過程:
客戶端SYN=1發起鏈接,併發送一個seq=x的數據包(TCP規定SYN=1時必須發送一個序號包)
服務端ACK=1確認收到,ack=x+1表示我方到x爲止的數據包已收到,期待客戶端下次發我一個seq爲x+1的數據包,SYN=1發起鏈接,併發送一個seq=y的數據包
客戶端ACK=1確認收到。ack=y+1表示我方到y爲止的數據包已收到,併發送一個seq=x+1的數據包
ok,收~
簡單來:
A:你能聽到嗎?
B:我聽獲得,你能聽到我嗎?
A:我也聽獲得。
你可能會問三次揮手,爲啥關閉須要四次?好看圖:
核心其實也就多了第二步,保證數據傳送完整。其餘步驟相似三次揮手。
常見的面試問題二:
爲啥不能直接2次握手?
仍是以客戶端A與服務端B爲例。假設A向B發送了A1數據包,但因爲傳輸鏈路問題滯後致使B沒收到,A則沒有收到B對A1數據包的確認。繼而A向B發送了A2數據包,這時候若是B收到了A1數據包,則B返回一個確認數據包B1給A,但A因爲已經丟棄了A1包,進而不能確認B1包,致使一直會保持這個‘殭屍’鏈接
HTTP vs HTTPS
引用下阮一峯的原文
第一步,愛麗絲給出協議版本號、一個客戶端生成的隨機數(Client random),以及客戶端支持的加密方法。
第二步,鮑勃確認雙方使用的加密方法,並給出數字證書、以及一個服務器生成的隨機數(Server random)。
第三步,愛麗絲確認數字證書有效,而後生成一個新的隨機數(Premaster secret),並使用數字證書中的公鑰,加密這個隨機數,發給鮑勃。
第四步,鮑勃使用本身的私鑰,獲取愛麗絲髮來的隨機數(即Premaster secret)。
第五步,愛麗絲和鮑勃根據約定的加密方法,使用前面的三個隨機數,生成"對話密鑰"(session key),用來加密接下來的整個對話過程。
數字證書通常是用來確保公鑰是屬於服務器的,防止中間人攻擊修改。
1.對稱密鑰
就是加密和解密使用的是同一個密鑰
這種對稱密鑰的弊端就是,可能被中間人攔截進行窺視和篡改
2.非對稱密鑰
看圖就知道非對稱密鑰(RSA非對稱加密算法)就是一對私鑰和公鑰,私鑰只能本身知道,用來解密,公鑰給大胖對信息數據加密。用私鑰加密的數據,只有對應的公鑰才能解密,用公鑰加密的數據, 只有對應的私鑰才能解密。
這種非對稱密鑰的弊端就是,RSA算法賊慢~。也存在中間人攔截公鑰的可能,若是攔截並修改了公鑰,那麼大胖若是想給bill發信息就尷尬了。因此就找可信的CA機構去搞一個數字證書(CA私鑰+bill公鑰(服務器公鑰)+一些基本信息一塊兒加密生成)。那麼以C端和服務器通訊爲例:
服務器發送數字證書給C端,C端在瀏覽器裏查看證書管理器,根據‘受信任的根證書頒發機構’查找解開數字證書的公鑰,若是有,則解開數字證書,得到服務器公鑰從而對數據進行加密進行通訊。