2013-06-05 19 views
86

試圖儘可能最好的,我可以TCP套接字和WebSocket的之間的差異理解,我已經發現了很多有用的信息,這些問題中:,一個更多的時間

等等...

在我的調查,我通過這句話繼續wikipedia

的WebSocket從TCP不同之處在於它使信息流,而不是字節

流我不能完全肯定這意味着什麼究竟。你的解釋是什麼?

+1

我認爲你的維基百科的句子有點誤導。從我剛剛從鏈接中讀取的內容看起來好像WebSockets只是用於非HTTP流量的HTTP TCP連接。 IE,你可以通過TCP連接與服務器進行協商,通過它的端口80來使用套接字來進行VPN類型的通信等。所以websocket只會是一​​個非http http插座? Spitballing ...不知道它們是什麼意思的「消息」,而不是維基百科摘錄中的字節。 – 0xhughes

回答

132

當您使用正常的TCP套接字從緩衝區發送字節時,send函數將返回發送緩衝區的字節數。如果它是一個非阻塞套接字或非阻塞發送,那麼發送的字節數可能小於緩衝區的大小。如果它是阻塞套接字或阻塞發送,則返回的數字將與緩衝區的大小相匹配,但呼叫可能會阻塞。使用WebSocket,傳遞給send方法的數據總是作爲一個整體「消息」發送,或者根本不發送。此外,瀏覽器WebSocket實現不會阻止發送呼叫。

但是在接收方面有更重要的差異。當接收方在TCP套接字上執行recv(或讀取)時,不能保證返回的字節數對應於發送方的單個發送(或寫入)。它可能是相同的,它可能更少(或者爲零),甚至可能更多(在這種情況下,會收到來自多個發送/寫入的字節)。使用WebSockets,消息的接收是事件驅動的(通常您會註冊一個消息處理程序例程),並且事件中的數據始終是對方發送的完整消息。

請注意,您可以使用TCP套接字進行基於消息的通信,但是您需要一些額外的圖層/封裝,將消息邊界數據添加到消息中,以便可以從消息中重新組合消息。實際上,WebSockets建立在普通的TCP套接字上,並使用包含每個幀大小的幀頭,並指出哪些幀是消息的一部分。 WebSocket API將TCP數據塊重新組裝成框架,在每個消息調用一次消息事件處理程序之前,將這些框架組裝成消息。

+0

非常感謝!對我非常有幫助...你不想更新維基百科文章嗎? :) – PierrOz

+5

@ kanaka是主題方面的專家,根據維基百科政策,專家不應編輯主題文章:「利益衝突」(COI)政策。我也被燒了,在那裏燒烤。忘記維基百科。 – oberstet

+1

因此,網絡套接字只是一個正常的tcp套接字和網絡瀏覽器之間的額外層? –

80

WebSocket基本上是一個面向消息的應用協議(參考ISO/OSI網絡堆棧),其中使用TCP作爲傳輸層。

WebSocket協議背後的思想包括重用客戶端和服務器之間建立的TCP連接。在HTTP握手之後,客戶端和服務器通過交換WebSocket信封開始說出WebSocket協議。 HTTP握手用於克服提供某些服務的客戶端和服務器之間的任何障礙(例如防火牆)(通常任何人都可以從任何地方訪問端口80)。客戶端和服務器可以隨時切換說HTTP,使用相同的TCP連接(永遠不會釋放)。

幕後WebSocket重建一致的信封/消息中的TCP幀。全雙工信道用於由服務器推以異步方式對客戶端的更新:通道是開放的,客戶端可以調用任何期貨/回調/承諾來管理任何異步的WebSocket收到的消息。簡而言之,WebSocket是一個基於TCP(可靠傳輸層,基於每幀)構建的高級協議(如HTTP本身),使得可以使用JS客戶端構建有效的實時應用程序(以前的Comet和使用長輪詢技術從服務器中提取更新)。