HTTP VS WebSocket VS RSocket

在比對 HTTP、WebSocket、RSocket 之前,我們先透過下面這張 OSI 七層模型的圖快速梳理一下網路通訊的面貌, 以便後續更好地理解它們。

HTTP VS WebSocket VS RSocket

一。 HTTP 的特性

超文字傳輸協議

(英語:

H

yper

T

ext

T

ransfer

P

rotocol,縮寫:

HTTP

)是一種用於分散式、協作式和超媒體資訊系統的應用層協議。

HTTP 已經演化出了很多版本,它們中的大部分都是向下相容的。在 RFC 2145 中描述了 HTTP 版本號的用法。客戶端在請求的開始告訴伺服器它採用的協議版本號,而後者則在響應中採用相同或者更早的協議版本。

1.1 HTTP/0.9

已過時。只接受 GET 一種請求方法,沒有在通訊中指定版本號,且不支援請求頭。

1.2 HTTP/1.0

這是第一個在通訊中指定版本號的 HTTP 協議版本。

協議版本資訊現在會隨著每個請求傳送(HTTP/1。0被追加到了GET行)。

狀態碼會在響應開始時傳送,使瀏覽器能瞭解請求執行成功或失敗,並相應調整行為(如更新或使用本地快取)。

引入了 HTTP 頭的概念,無論是對於請求還是響應,允許傳輸元資料,使協議變得非常靈活,更具擴充套件性。

在新 HTTP 頭的幫助下,具備了傳輸除純文字 HTML 檔案以外其他型別文件的能力。

1.3 HTTP/1.1

在1997年初,HTTP1。1 標準釋出,就在HTTP/1。0 釋出的幾個月後。

HTTP/1。1 預設採用持續連線(Connection: keep-alive),能很好地配合代理伺服器工作。還支援以管道方式在同時傳送多個請求,以便降低線路負載,提高傳輸速度。

HTTP/1。1 相較於 HTTP/1。0 協議的區別主要體現在:

快取處理

頻寬最佳化及網路連線的使用

錯誤通知的管理

訊息在網路中的傳送

網際網路地址的維護

安全性及完整性

1.4 HTTP/2

HTTP/2 在 HTTP/1。1 有幾處基本的不同:

HTTP/2 是二進位制協議而不是文字協議。不再可讀,也不可無障礙的手動建立,改善的最佳化技術現在可被實施。

這是一個複用協議。並行的請求能在同一個連結中處理,移除了 HTTP/1。x 中順序和阻塞的約束。

壓縮了headers。因為headers在一系列請求中常常是相似的,其移除了重複和傳輸重複資料的成本。

其允許伺服器在客戶端快取中填充資料,透過一個叫伺服器推送(Server Push)的機制來提前請求。

1.5 HTTP/3

與其前任 HTTP/1。1 和 HTTP/2 不同,在 HTTP/3 中,將棄用 TCP 協議,改為使用基於 UDP 協議的 QUIC 協議實現。

HTTP/3 的優點包括:

基於 UDP 協議,所以連線時間更短。

解決 HTTP/2 中存在的隊頭阻塞問題。HTTP/2 在單個 TCP 連線上使用了多路複用,受到 TCP 擁塞控制的影響,少量的丟包就可能導致整個 TCP 連線上的所有流被阻塞。在這種情況下,傳遞資料包的延遲會導致整個連線被延遲。

能夠更好地檢測和修復資料包丟失。

傳輸速度更快,載入時間更短並且連線更穩定

二。 WebSocket 的特性

WebSocket 是一種網路傳輸協議,可在單個TCP連線上進行全雙工通訊,位於 OSI 模型的應用層。WebSocket 允許服務端主動向客戶端推送資料。在 WebSocket API 中,瀏覽器和伺服器只需要完成一次握手,兩者之間就可以建立永續性的連線,並進行雙向資料傳輸。

WebSocket 與 HTTP 的不同之處:

WebSocket 提供全雙工通訊,可以透過重用已建立的連線通道將資料從客戶端傳送到伺服器,或從伺服器傳送到客戶端。連線保持活動狀態,直到被客戶端或伺服器終止。而 HTTP 提供半雙工通訊。

WebSocket 的訊息模式是雙向的,HTTP 的訊息模式是 Request-Response 模式。

WebSocket 支援訊息的 Push,HTTP 中不能直接使用 Push。

如果使用加密的 WebSocket 連線,則在 WebSocket 安全連線中使用傳輸層安全性(TLS)可確保在將瀏覽器配置為使用顯式代理伺服器時發出 HTTP CONNECT 命令。這將在 WebSocket安全客戶端和 WebSocket 伺服器之間建立一個隧道,該隧道透過 HTTP 代理提供低級別的端到端TCP通訊。

三。 RSocket 與這些協議的對比

3.1 與 HTTP/1.1 & HTTP/2 對比

HTTP 為構建應用程式,需要在其之上定義應用程式語義。儘管 REST 普遍存在,但 REST 不足以定義應用程式語義。

HTTP 不支援應用層的流控制。HTTP/2 中加入了針對 HTTP Stream 的基於位元組流視窗大小的 Flow Control。HTTP/2 的 Flow Control 只定義了 WINDOW_UPDATE 幀的格式和語義,並沒有規定接收方如何決定何時傳送幀、傳送什麼樣的值,也沒有規定傳送方如何選擇傳送包。RSocket 支援應用層 Flow Control,採取的並不是基於位元組的網路層流控,而是基於應用層幀數的流量控制。

HTTP 不支援雙向傳輸(HTTP/2 的 Server Push 並不是真正意義上的 Push),HTTP 需要服務端的推送必須要依賴 WebSocket。而 RSocket 建立長連線之後,任何一方都可以是 Requester 或 Responder。

3.2 與 TCP & QUIC 對比

它們並沒有框架或應用程式語義。

必須提供一個應用協議(例如 Netty 雖然簡化了 TCP 層的程式設計,但是需要自定義協議)

3.3 與 WebSocket 對比

WebSocket 沒有應用程式語義,只有框架。

必須提供一個應用協議。

作者:Tony沈哲

連結:https://juejin。cn/post/6964602858033545229