尽可能地了解TCP套接字和websocket之间的差异,我已经在这些问题中找到了很多有用的信息:
依旧......
在我的调查中,我在wikipedia上完成了这句话:
Websocket与TCP的不同之处在于它启用了消息流而不是字节流
我不完全确定它究竟意味着什么。你有什么解释?
答案 0 :(得分:176)
当您从具有正常TCP套接字的缓冲区发送字节时,send函数返回已发送的缓冲区的字节数。如果它是非阻塞套接字或非阻塞发送,则发送的字节数可能小于缓冲区的大小。如果是阻塞套接字或阻塞发送,则返回的数字将与缓冲区的大小匹配,但调用可能会阻塞。使用WebSockets,传递给send方法的数据总是作为整个“消息”发送或根本不发送。此外,浏览器WebSocket实现不会阻止发送调用。
但在接收方面存在更重要的差异。当接收器在TCP套接字上执行recv(或读取)时,无法保证返回的字节数对应于发送方的单个发送(或写入)。它可能是相同的,它可能更少(或为零)甚至可能更多(在这种情况下,来自多个发送/写入的字节被接收)。使用WebSockets,消息的接收是事件驱动的(通常是注册消息处理程序例程),事件中的数据始终是另一方发送的整个消息。
请注意,您可以使用TCP套接字进行基于消息的通信,但是您需要一些额外的层/封装,即将消息/消息边界数据添加到消息中,以便可以从消息中重新组合原始消息。事实上,WebSockets构建在普通的TCP套接字上,并使用包含每个帧大小的帧头,并指出哪些帧是消息的一部分。 WebSocket API将TCP数据块重新组装成帧,这些帧在每个消息调用一次消息事件处理程序之前被组合成消息。
答案 1 :(得分:112)
WebSocket基本上是一个应用程序协议(参考ISO / OSI网络堆栈),面向消息,利用TCP 作为传输层。
WebSocket协议背后的想法包括重用客户端和服务器之间建立的TCP连接。在HTTP握手之后,客户端和服务器通过交换WebSocket信封开始说WebSocket协议。 HTTP握手用于克服客户端和提供某些服务的服务器之间的任何障碍(例如防火墙)(通常,任何人都可以从任何地方访问端口80)。客户端和服务器可以随时切换语音HTTP,使用相同的TCP连接(永不释放)。
幕后操作WebSocket在一致的信封/消息中重建TCP帧。 服务器使用全双工通道以异步方式向客户端推送更新:通道已打开,客户端可以调用任何期货/回调/承诺来管理任何异步WebSocket接收的消息
简而言之,WebSocket是一个基于TCP(可靠的传输层,基于每帧)构建的高级协议(如HTTP本身),可以使用JS客户端构建有效的实时应用程序(之前是Comet和long在实现WebSockets之前,使用从服务器中提取的技术。请参阅Stackoverflow帖子:Differences between websockets and long polling for turn based game server)。