失業期間閒來無事,看了本《網絡是怎樣鏈接的》與兩本HTTP
相關的專欄。html
一方面補充專業知識,另外一方面也是爲了跳槽面試作準備。前端
避免看了即忘,就畫了一張XMind
圖:git
值得深刻的問題太多了,今兒就先來說講: Web
中的幾種「握手」github
在早期的網絡傳輸中,也就存在TCP
協議須要「握手」的過程,但早期的協議有一個缺陷:通訊只能由客戶端發起,作不到服務器主動向客戶端推送信息。web
因而WebSocket
協議在2008年誕生,2011年成爲國際標準。全部瀏覽器都已經支持了。 面試
而隨着SSL/TLS
的完善,存在已久的安全版網絡協議:HTTPS
也是迸發式發展。設計模式
最後前端領域的協議握手便成了三分天下:瀏覽器
TCP
三次握手,歸HTTP
。TLS
握手,歸HTTPS
WebSocket
握手,基於TCP
協議,都能用。TCP
三次握手的終極意義在我以前的文章:[《「真香警告」重學 TCP/IP 協議 與三次握手
》](https://juejin.im/post/5ca95e...安全
也詳細的講述過TCP
三次握手,但那時我未明確意識到其深入含義。服務器
就和你們同樣,只在面試前會記得,事後即忘。
直到我看到《網絡是怎樣鏈接的》中的一段話:
**在實際的通訊中,序號並非從 1 開始的,而是須要用隨機數計算出一個初始值,這是由於
若是序號都從 1 開始,通訊過程就會很是容易預測,有人會利用這一點來發動攻擊。 <br/><br/>可是若是初始值是隨機的,那麼對方就搞不清楚序號究竟是從
多少開始計算的,所以須要在開始收發數據以前將初始值告知通訊對象。**
你品,你細品。三次握手不就是相互試探暗號,來肯定是否是對的人嗎?
計算每一個網絡包能容納的數據長度,協議棧會根據一個叫做 MTU
的參數來進行判斷。
MTU
表示一個網絡包的最大長度,在以太網中通常是1500
字節
MTU
是包含頭部的總長度,所以須要從MTU
減去頭部的長度,而後獲得的長度就是一個網絡包中所能容納的最大數據長度,這一長度叫做MSS
。
由上兩圖可知,MSS
值是1460(1500-40)
字節,其中:
TCP
固定頭部20
字節。IP
固定頭部20
字節。TCP
頭部最長能夠達到60
字節。TLS
握手:HTTPS
的核心
HTTPS
實際上是一個「很是簡單」的協議,RFC
文檔很小,只有短短的 7 頁,裏面規定了新的協議名「https
」,默認端口號 443,至於其餘的什麼請求 - 應答模式、報文結構、請求方法、URI
、頭字段、鏈接管理等等都徹底沿用HTTP
,沒有任何新的東西。---- 《透視HTTP
協議》
感興趣的能夠到這裏看看:連接:https://tools.ietf.org/html/r...
TLS/SSL
到底是啥?
不少人看到TLS/SSL
這對詞就開始蒙圈了。實際上,這兩個東西是一個玩意兒:
1999
年更名:SSL 3 === TLS 1.0
目前運用最普遍的是TLS 1.2
:
TLS
由記錄協議、握手協議、警告協議、變動密碼規範協議、擴展協議等幾個子協議組成,綜合使用了對稱加密、非對稱加密、身份認證等許多密碼學前沿技術。
因爲TLS/SSL
協議位於應用層和傳輸層 TCP 協議之間。TLS
粗略的劃分又能夠分爲 2 層:
TLS Handshaking Protocols
TLS Record Protocol
這個篇幅展開來寫就太多了,咱們先關心下TLS
握手吧。
TLS握手
詳解TLS握手什麼時候發生?:
HTTPS
導航到網站而且瀏覽器首先開始查詢網站的原始服務器時,就會進行TLS
握手。HTTPS
(包括API
調用和HTTPS
查詢上的DNS)時,也會發生TLS
握手。TLS
握手。TLS握手期間會發生什麼?
在TLS
握手過程當中,客戶端和服務器將共同執行如下操做:
加密套件決定握手方式::
摘自:《HTTPS篇之SSL握手過程詳解》
在TLS
中有兩種主要的握手類型:一種基於RSA
,一種基於Diffie-Hellman
。 這兩種握手類型的主要區別在於主祕鑰交換和認證上。
祕鑰交換 | 身份驗證 | |
---|---|---|
RSA握手 | RSA | RSA |
DH握手 | DH | RSA/DSA |
主流的握手類型,基本都是基於RSA
,因此如下講解都基於 RSA
版握手。
整個流程以下圖所示:
具體流程描述:
hello
:客戶端經過向服務器發送「問候」消息來發起握手。該消息將包括客戶端支持的TLS版本,支持的加密套件以及稱爲「客戶端隨機」的隨機字節字符串。hello
:爲回覆客戶端hello
消息,服務器發送一條消息,其中包含服務器的SSL
證書,服務器選擇的加密套件和「服務器隨機數」,即服務器生成的另外一個隨機字節串。服務器用本身的私鑰解密加密的預主密鑰。
finished
:客戶端發送「完成」消息,該消息已用會話密鑰加密。finished
:服務器發送一條用會話密鑰加密的「完成」消息。只有加密套件,講解的話須要有抓包基礎。改天,改天我必定講。。。
WebSocket
握手
WebSocket
協議實現起來相對簡單。它使用HTTP
協議進行初始握手。成功握手以後,就創建了鏈接,WebSocket
基本上使用原始TCP讀取/寫入數據。
《圖解HTTP
》一書中的圖講的比較清楚:
具體步驟表現是:
GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 Origin: http://example.com
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= Sec-WebSocket-Protocol: chat
Websocket
全雙工通訊Websocket
協議解決了服務器與客戶端全雙工通訊的問題。
那什麼是單工、半雙工、全雙工通訊?
類型 | 能力 |
---|---|
單工 | 信息單向傳送 |
半雙工 | 信息能雙向傳送,但不能同時雙向傳送 |
全雙工 | 信息可以同時雙向傳送 |
Websocket
和Socket
區別能夠把WebSocket
想象成HTTP
應用層),HTTP
和Socket
什麼關係,WebSocket
和Socket
就是什麼關係。
WebSocket
與HTTP
的關係相同點
TCP
的,都是可靠性傳輸協議。不一樣點
WebSocket
是雙向通訊協議,模擬Socket
協議,能夠雙向發送或接受信息。HTTP
是單向的。WebSocket
是須要握手進行創建鏈接的。Socket
是什麼?Socket
是應用層與TCP/IP
協議族通訊的中間軟件抽象層,它是一組接口。
在設計模式中,Socket
其實就是一個門面模式,它把複雜的TCP/IP
協議族隱藏在Socket
接口後面,對用戶來講,一組簡單的接口就是所有,讓Socket
去組織數據,以符合指定的協議。
Socket.IO
的七層降級在Golang
、Java Spring
等框架中,websocket
都有一套實現API
。
Socket.IO
由兩部分組成:
Node.JS HTTP
服務器: socket.io
socket.io-client
不少人覺得Socket.IO
只是WebSocket
和XHR
長輪詢。
實際上,Socket.io
有不少傳輸機制:
1. WebSockets 2. FlashSocket 3. XHR長輪詢 4. XHR部分流:multipart/form-data 5. XHR輪詢 6. JSONP輪詢 7. iframe
得益於這麼多種傳輸機制,Socket.io
兼容性徹底不用擔憂。
HTTPS
與HTTP
核心區別上面講到 Socket
是什麼?,有一點我忘了講:
HTTPS
與HTTP
核心區別在於兩點:
HTTP
下層的傳輸協議由 TCP/IP
換成了 SSL/TLS
Socket API
,而是調用專門的安全接口。具體區別:
HTTPS
協議須要到CA
申請證書,通常免費證書不多,須要交費。HTTP
是超文本傳輸協議,信息是明文傳輸,HTTPS
則是具備安全性的ssl加密傳輸協議。HTTP
和https
使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是80
,後者是443
。HTTP
的鏈接很簡單,是無狀態的。HTTPS
協議是由SSL+HTTP
協議構建的可進行加密傳輸、身份認證的網絡協議,比HTTP
協議安全。本篇引用了大量資料和專欄:
1.《HTTPS篇之SSL握手過程詳解》
<br/>
2.[《網絡是怎樣鏈接的》--戶根勤]()
<br/>
3.[《圖解HTTP》--上野宣 ]()
<br/>
4.[《透視HTTP協議》--羅劍峯]()
<br/>
5.《What Happens in a TLS Handshake?》
<br/>
在個人腦圖中,總結歸納了8種HTTP
核心問題。
做爲一個轉行的前端,理解這些HTTP
的過程既痛苦又有趣。想要腦圖的能夠掃碼加我,或公衆號回覆:HTTP
若是你以爲這篇內容對你挺有啓發,我想邀請你幫我三個小忙:
勸退師我的微信:huab119
也能夠來個人GitHub
博客裏拿全部文章的源文件:
前端勸退指南:https://github.com/roger-hiro...一塊兒玩耍呀。~