Socket和WebSocket的來源
Socket
網絡中的Socket

從上圖中可以看到,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,看工作的公司就知道這個人的背景了。

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就是什么關系。