socket 和 webscoket 的區別


Socket和WebSocket的來源

 

Socket

 

Socket大致是指 在端到端的一個連接中,這兩個端叫做Socket。對於IT從業者來說,它往往指的是TCP/IP網絡環境中的兩個連接端,大多數的API提供者(如操作系統,JDK)往往會提供基於這種概念的接口,所以對於開發者來說也往往是在說一種編程概念。同時,操作系統中進程間通信也有Socket的概念,但這個Socket就不是基於網絡傳輸層的協議了。
 
Unix系統中的socket
操作系統中也有使用到Socket這個概念用來進行進程間通信,它和通常說的基於TCP/IP的Socket概念十分相似,代表了在操作系統中傳輸數據的兩方,只是它不再基於網絡協議,而是操作系統本身的文件系統。

網絡中的Socket

通常所說的Socket API,是指操作系統中(也可能不是操作系統)提供的對於傳輸層(TCP/UDP)抽象的接口。現行的Socket API大致都是遵循了BSD Socket規范(包括Windows)。這里稱規范其實不太准確,規范其實是POSIX,但BSD Unix中對於Socket的實現被廣為使用,所以成為了實際的規范。如果你要使用HTTP來構建服務,那么就不需要關心Socket,如果你想基於TCP/IP來構建服務,那么Socket可能就是你會接觸到的API

 

從上圖中可以看到,HTTP是基於傳輸層的TCP協議的,而Socket API也是,所以只是從使用上說,可以認為Socket和HTTP類似(但一個是成文的互聯網協議,一個是一直沿用的一種編程概念),是對於傳輸層協議的另一種直接使用,因為按照設計,網絡對用戶的接口都應該在應用層。

Socket名稱的由來

和很多其他Internet上的事物一樣,Socket這個名稱來自於大名鼎鼎的ARPANET(Advanced Research Projects Agency),早期ARPANET中的Socket指的是一個源或者目的地址——大致就是今天我們所說的IP地址和端口號。最早的時候一個Socket指的是一個40位的數字(RFC33中說明了此用法,但在RFC36中並沒有明確地說使用40位數字來標識一個地址),其中前32為指向的地址(socket number,大致相當於IP),后8位為發送數據的源(link,大致相當於端口號)。對他們的叫法有很多的版本,這里列舉的並不嚴謹。

端口號的野史

隨着ARPANET的發展,后來(RFC433,Socket Number List)socket number被明確地定義為一個40位的數字,其中后8位被用來制定某個特定的應用使用(比如1是Telnet)。這8位數有很多名字:link、socket name、AEN(another eight number,看到這個名字我也是醉了),工程師逗逼起來也是挺拼的。

后來在Internet的規范制定中,才真正的用起了port number這個詞。至於為什么端口號是16位的,我想可能有兩個原因,一是對於當時的工程師來說,如果每個端口號來標識一個程序,65535個端口號也差不多夠用了。二可能是為了對齊吧,_!!。

Socket原本的意思

在上邊提到的歷史中使用到的Socket,包括TCP文檔中使用到的Socket,其實指的是網絡傳輸中的一端,是一個虛擬化的概念。

WebSocket

上邊簡單敘述了Socket的意義,由於年代久遠,很多事情也搞不了那么清楚。但WebSocket是一個很晚進的東西,可以讓我們看到它是如何成為現在我們看到的這個樣子的。WebSocket protocol 是HTML5一種新的協議。目前除了完犢子的IE瀏覽器,其他瀏覽器都基本支持。它實現了瀏覽器與服務器全雙工通信(full-duplex)。一開始的握手需要借助HTTP請求完成。

他的目的是,即時通訊,替代輪詢。網站上的即時通訊是很常見的,比如網頁的QQ,聊天系統等。按照以往的技術能力通常是采用輪詢、Comet技術解決。

長輪詢的缺點:HTTP協議是非持久化的,單向的網絡協議,在建立連接后只允許瀏覽器向服務器發出請求后,服務器才能返回相應的數據。當需要即時通訊時,通過輪詢在特定的時間間隔(如1秒),由瀏覽器向服務器發送Request請求,然后將最新的數據返回給瀏覽器。這樣的方法最明顯的缺點就是需要不斷的發送請求,而且通常HTTP request的Header是非常長的,為了傳輸一個很小的數據 需要付出巨大的代價,是很不合算的,占用了很多的寬帶。

然而WebSocket的出現可以彌補這一缺點。在WebSocket中,只需要服務器和瀏覽器通過HTTP協議進行一個握手的動作,然后單獨建立一條TCP的通信通道進行數據的傳送。

WebSocket原理

WebSocket同HTTP一樣也是應用層的協議,但是它是一種雙向通信協議,是建立在TCP之上的。

握手過程:

  • 1. 瀏覽器、服務器建立TCP連接,三次握手。這是通信的基礎,傳輸控制層,若失敗后續都不執行。
  • 2. TCP連接成功后,瀏覽器通過HTTP協議向服務器傳送WebSocket支持的版本號等信息。(開始前的HTTP握手)
  • 3. 服務器收到客戶端的握手請求后,同樣采用HTTP協議回饋數據。
  • 4. 當收到了連接成功的消息后,通過TCP通道進行傳輸通信。

    webbSocket與HTTP的關系

相同點:

  • 1. 都是一樣基於TCP的,都是可靠性傳輸協議。
  • 2. 都是應用層協議。

不同點:

  • 1. WebSocket是雙向通信協議,模擬Socket協議,可以雙向發送或接受信息。HTTP是單向的。
  • WebSocket是需要握手進行建立連接的。

聯系:WebSocket在建立握手時,數據是通過HTTP傳輸的。但是建立之后,在真正傳輸時候是不需要HTTP協議的。

WHATWG(Web Hypertext Application Technology Working Group)

關於HTML5的故事很多人都是知道的,w3c放棄了HTML,然后有一群人(也有說是這些人供職的公司,不過官方的文檔上是說的個人)創立了WHATWG組織來推動HTML語言的繼續發展,同時,他們還發展了很多關於Web的技術標准,這些標准不斷地被官方所接受。WebSocket就屬於WHATWG發布的Web Application的一部分(即HTML5)的產物。

為什么會有WebSocket

大約在08年的時候,WG的工程師在討論網絡環境中需要一種全雙工的連接形式,剛開始一直叫做「TCPConnection」,並討論了這種協議需要支持的功能,大致已經和我們今天看到的WebSocket差不多了。他們認為基於現有的HTTP之上的一些技術(如長輪詢、Comet)並滿足不了這種需求,有必要定義一個全新的協議。

名稱的由來

在很多的關於HTML5或者WebSocket的文檔中,都能看到一個名字,Hixie(Ian Hickson),他是WHATWG組織的發言人,曾供職於Netscape、Opera、Google,看工作的公司就知道這個人的背景了。


hixie

08年6月18日,一群WHATWG的工程師在討論一些技術問題,一個工程師提到說「我們之前討論的那個東西,不要叫TCPConnection 了,還是起個別的名字吧 」,接着幾個名字被提及,DuplexConnection,TCPSocket,SocketConnection ,一個叫mcarter(Michael Carter )的工程師說他馬上要寫一篇關於Comet的文章,如果可以確定這個名稱,想在文章中引用這個名字。

Socket一直以來都被人用來表示網絡中一個連接的兩端,考慮到怎么讓工程師更容易接受,后來Hixie說了一句「我看WebSocket這個名字就很適合嘛(Hixie briefly pops back online to record that "WebSocket" would probably be a good new name for the TCPConnection object)」,大家都沒有異議,緊接着mcarter在Comet Daily中發表了文章Independence Day: HTML5 WebSocket Liberates Comet From Hacks,后來隨着各大瀏覽器對WebSocket的支持,它變成了實際的標准,IETF也沿用了這個名字。

下邊是在WHATWG文檔中對WebSocket接口的定義

enum BinaryType { "blob", "arraybuffer" }; [Constructor(USVString url, optional (DOMString or sequence<DOMString>) protocols = []), Exposed=(Window,Worker)] interface WebSocket : EventTarget { readonly attribute USVString url; // ready state const unsigned short CONNECTING = 0; const unsigned short OPEN = 1; const unsigned short CLOSING = 2; const unsigned short CLOSED = 3; readonly attribute unsigned short readyState; readonly attribute unsigned long long bufferedAmount; // networking attribute EventHandler onopen; attribute EventHandler onerror; attribute EventHandler onclose; readonly attribute DOMString extensions; readonly attribute DOMString protocol; void close([Clamp] optional unsigned short code, optional USVString reason); // messaging attribute EventHandler onmessage; attribute BinaryType binaryType; void send(USVString data); void send(Blob data); void send(ArrayBuffer data); void send(ArrayBufferView data); }; 

內容的確定

大多數新技術的出現都是建立在已有技術的鋪墊之上的,WebSocket內容的確定也是如此,其中就有Comet看不到的貢獻,Comet是一個很有趣的技術,有興趣可以看看這里

WebSocket與Socket的關系

Socket其實並不是一個協議,而是為了方便使用TCP或UDP而抽象出來的一層,是位於應用層和傳輸控制層之間的一組接口。tcp是可靠的連接,且連接后才可以發送數據;udp是不可靠的連接,不連接就可以發送數。

Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把復雜的TCP/IP協議族隱藏在Socket接口后面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數據,以符合指定的協議。

當兩台主機通信時,必須通過Socket連接,Socket則利用TCP/IP協議建立TCP連接。TCP連接則更依靠於底層的IP協議,IP協議的連接則依賴於鏈路層等更低層次。


結論

可以把WebSocket想象成HTTP,HTTP和Socket什么關系,WebSocket和Socket就是什么關系。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM