這是我參與8月更文挑戰的第10天,活動詳情查看:8月更文挑戰git
三次握手(Three-way Handshake)其實就是指創建一個TCP鏈接時,須要客戶端和服務器總共發送3個包github
主要做用就是爲了確認雙方的接收能力和發送能力是否正常、指定本身的初始化序列號爲後面的可靠性傳送作準備web
過程以下:服務器
上述每一次握手的做用以下:websocket
經過三次握手,就能肯定雙方的接收和發送能力是正常的。以後就能夠正常通訊了markdown
若是是兩次握手,發送端能夠肯定本身發送的信息能對方能收到,也能肯定對方發的包本身能收到,但接收端只能肯定對方發的包本身能收到 沒法肯定本身發的包對方能收到網絡
而且兩次握手的話, 客戶端有可能由於網絡阻塞等緣由會發送多個請求報文,延時到達的請求又會與服務器創建鏈接,浪費掉許多服務器的資源socket
tcp
終止一個鏈接,須要通過四次揮手tcp
過程以下:oop
LAST_ACK
的狀態服務端在收到客戶端斷開鏈接Fin
報文後,並不會當即關閉鏈接,而是先發送一個ACK
包先告訴客戶端收到關閉鏈接的請求,只有當服務器的全部報文發送完畢以後,才發送FIN
報文斷開鏈接,所以須要四次揮手
一個完整的三次握手四次揮手以下圖所示:
WebSocket,是一種網絡傳輸協議,位於OSI
模型的應用層。可在單個TCP
鏈接上進行全雙工通訊,能更好的節省服務器資源和帶寬並達到實時通迅
客戶端和服務器只須要完成一次握手,二者之間就能夠建立持久性的鏈接,並進行雙向數據傳輸
從上圖可見,websocket
服務器與客戶端經過握手鍊接,鏈接成功後,二者都能主動的向對方發送或接受數據
而在websocket
出現以前,開發實時web
應用的方式爲輪詢
不停地向服務器發送 HTTP 請求,問有沒有數據,有數據的話服務器就用響應報文迴應。若是輪詢的頻率比較高,那麼就能夠近似地實現「實時通訊」的效果
輪詢的缺點也很明顯,反覆發送無效查詢請求耗費了大量的帶寬和 CPU
資源
通訊容許數據在兩個方向上同時傳輸,它在能力上至關於兩個單工通訊方式的結合
例如指 A→B 的同時 B→A ,是瞬時同步的
採用了二進制幀結構,語法、語義與 HTTP 徹底不兼容,相比http/2
,WebSocket
更側重於「實時通訊」,而HTTP/2
更側重於提升傳輸效率,因此二者的幀結構也有很大的區別
不像 HTTP/2
那樣定義流,也就不存在多路複用、優先級等特性
自身就是全雙工,也不須要服務器推送
引入ws
和wss
分別表明明文和密文的websocket
協議,且默認端口使用80或443,幾乎與http
一致
ws://www.chrono.com
ws://www.chrono.com:8080/srv
wss://www.chrono.com:445/im?user_id=xxx
複製代碼
WebSocket
也要有一個握手過程,而後才能正式收發數據
客戶端發送數據格式以下:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
複製代碼
服務端返回的數據格式:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=Sec-WebSocket-Protocol: chat
複製代碼
基於websocket
的事實通訊的特色,其存在的應用場景大概有: