徹底理解TCP/UDP、HTTP長鏈接、Websocket、SockJS/Socket.IO以及STOMP的區別和聯繫

TCP/UDP

經過《網絡工程》的學習,咱們知道TCP/UDP是傳輸層協議,是應用層協議的基礎。html

對於編程的語言的學習,咱們一般須要掌握Socket編程,而真正理解Socket編程TCP/UDP協議的關係,能夠說是一個開發者從初級突破到中級的一個最好證實。java

實際上Socket編程就是所謂的網絡編程也就是基於TCP/UDP協議進行編程,就拿Java和TCP來講:git

  • 對於BIO,TCP編程就是ServerSocket/Socket
  • 對於NIO,TCP編程就是ServerSocketChannel/SocketChannel
  • 對於AIO,TCP編程就是AsynchronousServerSocketChannel/AsynchronousSocketChannel

經過對ServerSocket進行封裝,咱們能夠實現本身的網絡應用框架,例如:github

名稱 IO 可解析的協議
≤tomcat7 BIO HTTP等
≥tomcat8 NIO HTTP、Websocket等
Netty NIO TCP、HTTP、FTP、SMTP、Websocket等
Dubbo 基於Netty dubbo

經過對Socket進行封裝,咱們能夠實現本身的客戶端框架,例如:web

名稱 IO 可解析協議
OkHttp BIO HTTP、HTTPS
WebSocketClient BIO/NIO Websocket
WebClient NIO HTTP、HTTPS

Websocket

  • 一般,應用層協議都是徹底基於網絡層協議TCP/UDP來實現,例如HTTP、SMTP、POP3,而Websocket是同時基於HTTP與TCP來實現:
    • 先用帶有 Upgrade:WebsocketHeader的特殊HTTP request來實現與服務端握手HandShake;
    • 握手成功後,協議升級成Websocket,進行長鏈接通信;
    • 整個過程可理解爲:小錘摳縫,大錘搞定
  • 爲何不使用HTTP長鏈接來實現即時通信?事實上,在Websocket以前就是使用HTTP長鏈接這種方式,如Comet。可是它有以下弊端:
    • HTTP 1.1 規範中規定,客戶端不該該與服務器端創建超過兩個的 HTTP 鏈接, 新的鏈接會被阻塞。
    • 對於服務端來講,每一個長鏈接都佔有一個用戶線程,在NIO或者異步編程以前,服務端開銷太大。
  • 爲何不直接使用Socket編程,基於TCP直接保持長鏈接,實現即時通信?
    • Socket編程針對C/S模式的,而瀏覽器是B/S模式,瀏覽器無法發起Socket請求,正因如此, W3C最後仍是給出了瀏覽器的Socket----Websocket。

SockJS/Socket.IO

HTML5規範中給出了原生的Websocket API,可是並非全部瀏覽器都完美支持,而當瀏覽器不支持Websocket時,應該自動切換成Ajax長輪詢,SSE等備用解決方案。因此在實際開發中咱們一般採用封裝了Websocket及其備用方案的庫----SockJSSocket.IOspring

若是你使用Java作服務端,同時又剛好使用Spring Framework做爲框架,那麼推薦使用SockJS,由於Spring Framework自己就是SockJS推薦的Java Server實現,同時也提供了Java 的client實現。編程

若是你使用Node.js作服務端,那麼毫無疑問你該選擇Socket.IO,它本省就是從Node.js開始的,固然服務端也提供了engine.io-server-java實現。甚至你可使用 netty-socketio 注意:無論你使用哪種,都必須保證客戶端與服務端同時支持瀏覽器


STOMP

STOMP(Simple (or Streaming) Text Orientated Messaging Protocol)一個簡單的面向文本/流的消息協議。STOMP提供了可以協做的報文格式,以致於STOMP客戶端能夠與任何STOMP消息代理(Brokers)進行通訊,從而爲多語言,多平臺和Brokers集羣提供簡單且廣泛的消息協做。tomcat

STOMP可用於任何可靠的雙向流網絡協議之上,如TCP和WebSocket。 雖然STOMP是面向文本的協議,但消息有效負載能夠是文本或二進制。springboot

STOMP是一種基於幀的協議,幀的結構是效仿HTTP報文格式,簡潔明瞭。以下:

COMMAND
header1:value1
header2:value2

Body^@
複製代碼

STOMP over Websocket

STOMP over Websocket 是什麼?

STOMP over Websocket 即,經過Websocket創建STOMP鏈接,也就是說在Websocket鏈接的基礎上再創建 STOMP鏈接。

爲何要使用STOMP over Websocket?

WebSocket協議定義了兩種類型的消息,文本和二進制,但它們的內容是未定義的。

若是說Socket是C/S的TCP編程,同理Websocket就是Web(B/S)的TCP編程,因此須要在客戶端與服務端之間定義一個機制去協商一個子協議——更高級別的消息協議,將它使用在Websocket之上去定義每次發送消息的類別、格式和內容,等等。

子協議的使用是可選的,但不管哪一種方式,客戶端和服務器都須要就一些定義消息內容的協議達成一致。

因而,一般選擇在Websocket協議上使用STOMP協議來定義內容格式。


實現架構

相關文章
相關標籤/搜索