皮膚 顏色
板式
寬屏 窄屏

Socket 與 WebSocket,區別與聯(lián)系

發(fā)表日期:2018-07-31    文章編輯:zrong   來(lái)源:網(wǎng)絡(luò )    瀏覽次數:
  1. Socket 和 WebSocket 有哪些區別和聯(lián)系?
  2. WebSocket 和 HTML5 是什么關(guān)系?
  3. 必須在瀏覽器中才能使用 WebSocket 嗎?
  4. WebSocket 能和 Socket 一樣傳輸 raw 數據么?
  5. WebSocket 和 Socket 相比會(huì )多耗費流量么?

        目前網(wǎng)上全面介紹這兩種協(xié)議的中文文章并不多,或者說(shuō)不夠全面。我無(wú)法找到一篇文章能解決上面的所有問(wèn)題。因此,我寫(xiě)了本文,把找到的 Socket 和 WebSocket 的相關(guān)資料做一個(gè)梳理,以方便理解。

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

由于能力有限,本文不可能很長(cháng)。而且,技術(shù)細節并非所有人都愿意仔細了解。本文包含了大量的外部鏈接,跟隨這些鏈接,可以找到足夠多的細節,滿(mǎn)足你/我的求知欲。


1. 概述

選擇了 WebSocket 技術(shù)之后,不可避免的,我要將它和其他協(xié)議以及技術(shù)做一下比較。最常見(jiàn)的,就是需要比較 WebSocket 與 HTTP、Socket 技術(shù)的異同。

WebSocket 是為了滿(mǎn)足基于 Web 的日益增長(cháng)的實(shí)時(shí)通信需求而產(chǎn)生的。在傳統的 Web 中,要實(shí)現實(shí)時(shí)通信,通用的方式是采用 HTTP 協(xié)議不斷發(fā)送請求。但這種方式即浪費帶寬(HTTP HEAD 是比較大的),又消耗服務(wù)器 CPU 占用(沒(méi)有信息也要接受請求)。(下圖來(lái)自 WebSocket.org

而是用 WebSocket 技術(shù),則會(huì )大幅降低上面提到的消耗:(下圖來(lái)自 websocket.org

關(guān)于更詳細的描述,尹立的這篇文章講得非常好:WebSocket(2)–為什么引入WebSocket協(xié)議 。

那么,WebSocket 到底與 HTTP 協(xié)議到底是一個(gè)什么樣的關(guān)系呢?它和 Socket 又有什么聯(lián)系?這就要講到 OSI 模型和 TCP/IP 協(xié)議族。

2. OSI 模型與 TCP/IP

以下是 維基百科 中關(guān)于OSI 模型的說(shuō)明:

開(kāi)放式系統互聯(lián)通信參考模型(英語(yǔ):Open System Interconnection Reference Model,ISO/IEC 7498-1),簡(jiǎn)稱(chēng)為OSI模型(OSI model),一種概念模型,由國際標準化組織(ISO)提出,一個(gè)試圖使各種計算機在世界范圍內互連為網(wǎng)絡(luò )的標準框架。

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

它將軟件通信過(guò)程抽象化為四個(gè)抽象層,采取協(xié)議堆疊的方式,分別實(shí)作出不同通信協(xié)議。協(xié)議套組下的各種協(xié)議,依其功能不同,被分別歸屬到這四個(gè)階層之中7,常被視為是簡(jiǎn)化的七層OSI模型。

這里有一張圖詳細介紹了 TCP/IP 協(xié)議族中的各個(gè)協(xié)議在 OSI模型 中的分布,一圖勝千言:


TCP/IP 協(xié)議和 OSI 模型的內容,在互聯(lián)網(wǎng)上有很多。我沒(méi)有必要再次介紹它們。在這里,我們只需要知道,HTTP、WebSocket 等協(xié)議都是處于 OSI 模型的最高層: 應用層 。而 IP 協(xié)議工作在網(wǎng)絡(luò )層(第3層),TCP 協(xié)議工作在傳輸層(第4層)。

至于 OSI 模型的各個(gè)層次都有什么系統和它們對應,這里有篇很好的文章可以滿(mǎn)足大家的求知欲:OSI七層模型詳解 。

3. WebSocket、HTTP 與 TCP

從上面的圖中可以看出,HTTP、WebSocket 等應用層協(xié)議,都是基于 TCP 協(xié)議來(lái)傳輸數據的。我們可以把這些高級協(xié)議理解成對 TCP 的封裝。

既然大家都使用 TCP 協(xié)議,那么大家的連接和斷開(kāi),都要遵循 TCP 協(xié)議中的三次握手和四次握手 ,只是在連接之后發(fā)送的內容不同,或者是斷開(kāi)的時(shí)間不同。

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

對于 WebSocket 來(lái)說(shuō),它必須依賴(lài) HTTP 協(xié)議進(jìn)行一次握手 ,握手成功后,數據就直接從 TCP 通道傳輸,與 HTTP 無(wú)關(guān)了。

4. Socket 與 WebScoket

Socket 其實(shí)并不是一個(gè)協(xié)議。它工作在 OSI 模型會(huì )話(huà)層(第5層),是為了方便大家直接使用更底層協(xié)議(一般是 TCPUDP )而存在的一個(gè)抽象層。

最早的一套 Socket API 是 Berkeley sockets ,采用 C 語(yǔ)言實(shí)現。它是 Socket 的事實(shí)標準,POSIX sockets 是基于它構建的,多種編程語(yǔ)言都遵循這套 API,在 JAVA、Python 中都能看到這套 API 的影子。

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

Socket是應用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實(shí)就是一個(gè)門(mén)面模式,它把復雜的TCP/IP協(xié)議族隱藏在Socket接口后面,對用戶(hù)來(lái)說(shuō),一組簡(jiǎn)單的接口就是全部,讓Socket去組織數據,以符合指定的協(xié)議。

主機 A 的應用程序要能和主機 B 的應用程序通信,必須通過(guò) Socket 建立連接,而建立 Socket 連接必須需要底層 TCP/IP 協(xié)議來(lái)建立 TCP 連接。建立 TCP 連接需要底層 IP 協(xié)議來(lái)尋址網(wǎng)絡(luò )中的主機。我們知道網(wǎng)絡(luò )層使用的 IP 協(xié)議可以幫助我們根據 IP 地址來(lái)找到目標主機,但是一臺主機上可能運行著(zhù)多個(gè)應用程序,如何才能與指定的應用程序通信就要通過(guò) TCP 或 UPD 的地址也就是端口號來(lái)指定。這樣就可以通過(guò)一個(gè) Socket 實(shí)例唯一代表一個(gè)主機上的一個(gè)應用程序的通信鏈路了。

WebSocket 則不同,它是一個(gè)完整的 應用層協(xié)議,包含一套標準的 API 。

所以,從使用上來(lái)說(shuō),WebSocket 更易用,而 Socket 更靈活。

5. HTML5 與 WebSocket

WebSocket APIHTML5 標準的一部分, 但這并不代表 WebSocket 一定要用在 HTML 中,或者只能在基于瀏覽器的應用程序中使用。

實(shí)際上,許多語(yǔ)言、框架和服務(wù)器都提供了 WebSocket 支持,例如:


相關(guān)文章推薦

  
Socket 和 WebSocket 有哪些區別和聯(lián)系? WebSocket 和 HTML5 是什么關(guān)系? 必須在瀏覽器中才能使用...
  
其實(shí)對于我們一般理解的計算機內存,它算是CPU與計算機打交道最頻繁的區域,所有數據都是...
  
簡(jiǎn)介 響應式Web設計 是一種創(chuàng )建Web應用程序的新方法。一旦采用 響應式Web設計 創(chuàng )建出應用程序...
  
用div做成表格的形式,把標簽中間的空格都去掉就可以了...
  
看下面的代碼,其中連接池采用的c3p0,配置文件省略 import java.sql.Connection; import org.springframe...
  
主要幾個(gè)框架或者插件是如何實(shí)現異步加載事件響應的。 一.LABjs 這個(gè)項目位于github上面,其本...
  
html5shiv讓IE6-IE8支持HTML5標簽 越來(lái)越多的站點(diǎn)開(kāi)始使用 HTML5 標簽。但是目前的情況是還有很多人...
  
緩存 是實(shí)際工作中非常常用的一種提高性能的方法, 我們會(huì )在許多場(chǎng)景下來(lái)使用緩存。 本文通...
  
為了防止惡意用戶(hù)發(fā)布惡意內容,我們的安全分析瀏覽器都在虛擬機上運行。這使我們能夠確...
?