TCP套接字和web套接字的区别,再讲一遍



试图理解TCP套接字和websocket之间的区别,我已经在这些问题中发现了很多有用的信息:

  • websockets与纯TCP的根本区别
  • 如何从web浏览器(客户端)建立TCP套接字连接?

等等…

在我的调查中,我在维基百科上浏览了这句话:

Websocket与TCP的不同之处在于它支持消息流而不是字节流

我不完全确定它到底是什么意思。你的解释是什么?

当您使用普通TCP套接字从缓冲区发送字节时,send函数返回已发送的缓冲区的字节数。如果它是非阻塞套接字或非阻塞发送,则发送的字节数可能小于缓冲区的大小。如果它是阻塞套接字或阻塞发送,则返回的数字将与缓冲区的大小匹配,但调用可能会阻塞。使用WebSockets,传递给send方法的数据总是要么作为一个完整的"消息"发送,要么根本不发送。另外,浏览器的WebSocket实现不会阻塞send调用。

但是在接收方面有更重要的区别。当接收方在TCP套接字上执行recv(或read)操作时,不能保证返回的字节数对应于发送方的单个发送(或写)操作。它可能相同,也可能更少(或为零),甚至可能更多(在这种情况下,接收来自多个发送/写入的字节)。使用WebSockets,消息的接收者是事件驱动的(你通常注册一个消息处理程序例程),事件中的数据总是另一方发送的整个消息。

请注意,您可以使用TCP套接字进行基于消息的通信,但您需要一些额外的层/封装,将帧/消息边界数据添加到消息中,以便可以从碎片中重新组装原始消息。事实上,WebSockets是建立在普通的TCP套接字之上的,它使用帧报头,报头包含每个帧的大小,并指出哪些帧是消息的一部分。WebSocket API在每条消息调用一次消息事件处理程序之前,将TCP数据块重新组装成帧,这些帧被组装成消息。

WebSocket基本上是一个应用协议(参照ISO/OSI网络栈),面向消息,其中使用TCP作为传输层。

WebSocket协议背后的思想包括重用客户端和服务器之间建立的TCP连接。在HTTP握手之后,客户端和服务器通过交换WebSocket信封开始使用WebSocket协议。HTTP握手用于克服客户端和提供某些服务的服务器之间的任何障碍(例如防火墙)(通常端口80可以从任何地方被任何人访问)。客户端和服务器可以在任何时候切换说HTTP,利用相同的TCP连接(永远不会释放)。

在后台,WebSocket在一致的信封/消息中重建TCP帧。全双工通道用于服务器以异步方式向客户端推送更新:通道是打开的,客户端可以调用任何期货/回调/承诺来管理任何异步WebSocket接收到的消息。

简单地说,WebSocket是一个建立在TCP(可靠的传输层,以每帧为基础)上的高级协议(就像HTTP本身一样),它使得用JS客户端构建有效的实时应用程序成为可能(在WebSockets实现之前,Comet和长轮询技术被用来从服务器上获取更新)。参见Stackoverflow post: websockets和基于回合制游戏服务器的长轮询之间的差异

相关内容

  • 没有找到相关文章