有關WebSocket必須瞭解的知識

1、前言

最近以前時間正好在學習java知識,因此自個想找個小項目練練手,因爲以前的ssm系統已經跑了也有大半年了,雖然稀爛,可是功能仍是勉強作到了,因此此次準備重構ssm系統,更名爲postCode系統(至於爲何前者叫ssm,多是由於後端java用的是ssm框架吧),此次後端將不會開發兩套,而是主要實現以前沒有實現的單聊功能,因爲搭建了多個服務,通訊使用的是RabbitMQ,而後把着對消息通訊的原理研究寫下了這篇水文,後面會單獨淺談一些RabbitMQ。html


2、TCP/IP模型

tcp/ip模型算是大學計算機學科中必學的一段知識,但長時間不接觸,又都還給老師了。vue

tcp/ip模型是互聯網的基礎,它是一些列協議的總稱,tcp/ip模型又能夠劃分爲osi七層模型java

OSI七層模型 TCP/IP機率模型 功能 TCP/IP協議族
應用層 應用層 文件傳輸、郵件傳輸 ftp、smtp
表示層 數據格式化,代碼轉換,數據加密 沒有協議
會話層 接觸或者創建於別的接口聯繫 沒有協議
傳輸層 傳輸層 提供端對端的接口 TCP、UDP
網絡層 網絡層 爲數據包選擇路由 IP、ICMP、RIP、OSPF
數據鏈路層 鏈路層 傳輸有地址的幀以及錯誤檢查功能 SLIP、CSLIP、PPP、ARP
物理層 以二進制數據形式在物理媒介上傳輸數據 IS02110

2.一、UDP的特色

無鏈接node

  • UDP無需創建三次握手,而是想要發送數據的時候就能夠直接送
  • 發送端:將收到應用層的數據增長一個UDP的標識就發送出去了
  • 接受端:將UDP協議的標識去掉就傳輸給應用層了

能夠單播,多播,廣播web

UDP支持一對1、一對多、多對多、多對一的傳輸方式。spring

不可靠性編程

通訊不須要創建鏈接,也不須要管對方有沒有收到,而是想發就發,這樣的鏈接是不安全的後端

2.二、TCP的特色

  • 面向鏈接
  • 僅支持單播傳輸
  • 可靠性

TCP提供全雙工通訊(重點重點)跨域

TCP容許通訊雙方的應用程序在任什麼時候候都能發送數據,由於TCP鏈接的兩端都設有緩存,用來臨時存放雙向通訊的數據。固然,TCP能夠當即發送一個數據段,也能夠緩存一段時間以便一次發送更多的數據段(最大的數據段大小取決於MSS)瀏覽器


3、Socket編程

在瞭解WebSocket編程以前要先了解了解Socket

什麼是Socket

起初應用層的數據到達傳輸層後須要依賴tcp/ip協議族創建tcp鏈接,而後tcp又須要依賴網絡層的ip協議等,從而產生了不一樣數據格式依賴不一樣協議模型的尷尬局面,致使一些列安全和網絡阻塞問題,從而誕生了socket的接口。

  • socket的誕生是爲了應用程序可以更方便的將數據經由傳輸層來傳輸
  • socket本質上就是對TCP/IP 的運用進行了一層封裝
  • socket並非協議,而是介於應用層和傳輸層之間抽象出來的一層,是一組接口
  • socket創建鏈接和斷開鏈接和普通的tcp鏈接同樣須要進行三次握手和四次揮手
  • socket能夠創建長鏈接和短鏈接
  • socket主要是應用在C/S(Client/Server)模式裏
  • 全部的鏈接都須要通過socket接口

最後能夠簡單的理解爲socket對tcp/ip封裝後向應用層提供一些更加方便傳輸數據的接口。


4、WebSocket

由於socket只能是在C/S架構出現,瀏覽器端操做都處於應用層,因此Html5中提出了WebSocket通訊協議,爲了解決真正意義上的全雙工通訊的難題。

  • 創建WebSocket鏈接前會先發送一個Header裏面有Upgrade:Websocket的http請求
  • ws和wss都屬於WebSocket的通訊協議,wss和https同樣都只是多了TLS協議

不一樣網絡通訊協議的對應關係

WebSocket XMLHttpRequest
通訊協議 ws http
通訊協議+TLS協議 wss https

4.一、ScokJS/Socket.IO

ScokJS

  • ScokJS是一套基於WebSocket Api封裝的js庫,它在瀏覽器和web服務器之間建立了一個低延遲、全雙工、跨域通訊通道。
  • Spring框架提供了基於SockJS協議的透明的回退選項;Spring Framework也是SockJS推薦Java Server的實現,同時也提供了Java 的client實現
  • SockJS的一大好處在於提供了瀏覽器兼容性。優先使用原生WebSocket,若是在不支持websocket的瀏覽器中,會自動降爲輪詢的方式。
  • 所以服務器若是是spring環境,應該優先使用ScokJS

Socket.IO

  • Socket.io和ScokJS同樣都是基於WebSocket Api封裝的js庫,一樣也是爲了解決部分瀏覽器不支持WebSocket而誕生的js庫。
  • Socket.io自己設計就是提供了一套node環境的全雙工鏈接,全部在node環境做爲服務器使用Socket.io的時候還須要綁定http.Server服務,由於WebSocket協議是構建在HTTP協議之上的
  • 所以服務器若是是node環境,應該優先使用Socket.io

4.二、STOMP/vue-socket

雖然ScokJS和Socket.IO都解決了瀏覽器兼容性問題,可是在進行雙向通訊的過程當中是不遵循任何消息協議的,也就是當消息到達應用層後就只剩消息文本自己了,因此不利於跨平臺和多端通訊,因而對應約束消息格式的消息協議的就誕生了。

STOMP

  • STOMP是一種基於幀的協議,幀的結構是效仿HTTP報文格式
  • STOMP能夠直接使用WebSocket進行鏈接,也可使用SockJS進行鏈接
    • Stomp.client(url) 經過WebSocket直接鏈接
    • Stomp.over(ws) 經過sockJS進行鏈接
  • STOMP更加適合於作於消息組件,其中的方法設計都是能夠配合rabbitMQ使用的,只須要在rabbitMQ中安裝rabbitmq_web_stomprabbitmq_web_stomp_examples就能夠了

vue-socket

  • vue-socket和STOMP同樣都是消息協議,vue-socket底層是基於socket.io封裝的js庫,對vue支持會更好。

相關文章
相關標籤/搜索