Socket與WebSocket之分析對比

來源:互聯網
上載者:User

標籤:article   fancybox   model   i/o   git   traffic   pen   如何   prot   

之前提到Lua 與nodejs使用socket通訊,但由於服務端的限制,最終依然選擇了 LuaSocket。

現在,面對一個全新的項目,我自然而然地選擇了 WebSocket。

因此,我需要瞭解下面這些問題:

  1. Socket 和 WebSocket 有哪些區別和聯絡?
  2. WebSocket 和 HTML5 是什麼關係?
  3. 必須在瀏覽器中才能使用 WebSocket 嗎?
  4. WebSocket 能和 Socket 一樣傳輸 raw 資料嗎?
  5. WebSocket 和 Socket 相比會多耗費流量嗎?

但是,目前網上全面介紹這兩種協議的中文文章並不多,或者說不夠全面。我無法找到一篇文章能解決上面的所有問題。因此,我寫了本文,把找到的 Socket 和 WebSocket 的相關資料做一個梳理,以方便理解。

本文並不能直接完整回答上面提出的幾個問題,但讀完本文,要理解上面的那些問題,是很容易的事。

由於能力有限,本文不可能很長。而且,技術細節並非所有人都願意仔細瞭解。本文包含了大量的外部連結,跟隨這些連結,可以找到足夠多的細節,滿足你/我的求知慾。

1. 概述

選擇了 WebSocket 技術之後,不可避免的,我要將它和其他協議以及技術做一下比較。最常見的,就是需要比較 WebSocket 與 HTTP、Socket 技術的異同。

WebSocket 是為了滿足基於 Web 的日益增長的即時通訊需求而產生的。在傳統的 Web 中,要實現即時通訊,通用的方式是採用 HTTP 協議不斷髮送請求。但這種方式即浪費頻寬(HTTP HEAD 是比較大的),又消耗伺服器 CPU 佔用(沒有資訊也要接受請求)。(來自 WebSocket.org)

而是用 WebSocket 技術,則會大幅降低上面提到的消耗:(來自 websocket.org)

關於更詳細的描述,尹立的這篇文章講得非常好:WebSocket(2)–為什麼引入WebSocket協議 。

那麼,WebSocket 到底與 HTTP 協議到底是一個什麼樣的關係呢?它和 Socket 又有什麼聯絡?這就要講到 OSI 模型和 TCP/IP 協議族。

2. OSI 模型與 TCP/IP

以下是 維基百科 中關於OSI 模型的說明:

開放式系統互聯通訊參考模型(英語:Open System Interconnection Reference Model,ISO/IEC 7498-1),簡稱為OSI模型(OSI model),一種概念性模型,由國際標準組織(ISO)提出,一個試圖使各種電腦在世界範圍內互連為網路的標準架構。

而 TCP/IP 協議可以看做是對 OSI 模型的一種簡化(以下內容來自 維基百科):

它將軟體通訊過程抽象化為四個抽象層,採取協議堆疊的方式,分別實作出不同通訊協定。協議套組下的各種協議,依其功能不同,被分別歸屬到這四個階層之中7,常被視為是簡化的七層OSI模型。

這裡有一張圖詳細介紹了 TCP/IP 協議族中的各個協議在 OSI模型 中的分布,一圖勝千言(來自 科來):

這裡是 PDF 版:

下載

TCP/IP 協議和 OSI 模型的內容,在互連網上有很多。我沒有必要再次介紹它們。在這裡,我們只需要知道,HTTP、WebSocket 等協議都是處於 OSI 模型的最高層: 應用程式層 。而 IP 協議工作在網路層(第3層),TCP 協議工作在傳輸層(第4層)。

至於 OSI 模型的各個層次都有什麼系統和它們對應,這裡有篇很好的文章可以滿足大家的求知慾:OSI七層模型詳解 。

3. WebSocket、HTTP 與 TCP

從上面的圖中可以看出,HTTP、WebSocket 等應用程式層協議,都是基於 TCP 協議來傳輸資料的。我們可以把這些進階協議理解成對 TCP 的封裝。

既然大家都使用 TCP 協議,那麼大家的串連和斷開,都要遵循 TCP 協議中的三向交握和四次握手 ,只是在串連之後發送的內容不同,或者是斷開的時間不同。

更詳細內容可閱讀:wireshark抓包圖解 TCP三向交握/四次揮手詳解

對於 WebSocket 來說,它必須依賴 HTTP 協議進行一次握手 ,握手成功後,資料就直接從 TCP 通道傳輸,與 HTTP 無關了。

4. Socket 與 WebScoket

Socket 其實並不是一個協議。它工作在 OSI 模型會話層(第5層),是為了方便大家直接使用更底層協議(一般是 TCP 或 UDP )而存在的一個抽象層。

最早的一套 Socket API 是 Berkeley sockets ,採用 C 語言實現。它是 Socket 的事實標準,POSIX sockets 是基於它構建的,多種程式設計語言都遵循這套 API,在 JAVA、Python 中都能看到這套 API 的影子。

下面摘錄一段更容易理解的文字(來自 http和socket之長串連和短串連區別):

Socket是應用程式層與TCP/IP協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket介面後面,對使用者來說,一組簡單的介面就是全部,讓Socket去組織資料,以符合指定的協議。

主機 A 的應用程式要能和主機 B 的應用程式通訊,必須通過 Socket 建立串連,而建立 Socket 串連必須需要底層 TCP/IP 協議來建立 TCP 串連。建立 TCP 串連需要底層 IP 協議來定址網路中的主機。我們知道網路層使用的 IP 協議可以協助我們根據 IP 位址來找到目標主機,但是一台主機上可能運行著多個應用程式,如何才能與指定的應用程式通訊就要通過 TCP 或 UPD 的地址也就是連接埠號碼來指定。這樣就可以通過一個 Socket 執行個體唯一代表一個主機上的一個應用程式的通訊鏈路了。

而 WebSocket 則不同,它是一個完整的 應用程式層協議,包含一套標準的 API 。

所以,從使用上來說,WebSocket 更易用,而 Socket 更靈活。

5. HTML5 與 WebSocket

WebSocket API 是 HTML5 標準的一部分, 但這並不代表 WebSocket 一定要用在 HTML 中,或者只能在基於瀏覽器的應用程式中使用。

實際上,許多語言、架構和伺服器都提供了 WebSocket 支援,例如:

  • 基於 C 的 libwebsocket.org
  • 基於 Node.js 的 Socket.io
  • 基於 Python 的 ws4py
  • 基於 C++ 的 WebSocket++
  • Apache 對 WebSocket 的支援: Apache Module mod_proxy_wstunnel
  • Nginx 對 WebSockets 的支援: NGINX as a WebSockets Proxy 、 NGINX Announces Support for WebSocket Protocol 、WebSocket proxying
  • lighttpd 對 WebSocket 的支援:mod_websocket

Socket與WebSocket之分析對比

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.