TCP套接字和networking套接字之间的区别,还有一次

尽力了解TCP套接字和websocket之间的差异,我已经在这些问题中find了很多有用的信息:

  • websockets和纯TCP之间的根本区别
  • 如何从Web浏览器(客户端)build立TCP Socket连接?

等等…

在我的调查中,我经历了维基百科的这句话:

Websocket与TCP的不同之处在于它启用了一个消息stream而不是一个字节stream

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

当您使用正常的TCP套接字从缓冲区发送字节时,send函数将返回发送缓冲区的字节数。 如果是非阻塞套接字或非阻塞发送,则发送的字节数可能小于缓冲区的大小。 如果是阻塞套接字或阻塞发送,则返回的数字将与缓冲区的大小相匹配,但呼叫可能会阻塞。 使用WebSocket,传递给send方法的数据总是作为一个整体“消息”发送,或者根本不发送。 另外,浏览器WebSocket实现不会阻塞发送呼叫。

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

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

WebSocket基本上是一个应用协议(参照ISO / OSInetworking协议栈),面向消息的,它使用TCP作为传输层。

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

在幕后,WebSocket使用一致的信封/消息重buildTCP帧。 服务器使用全双工通道以asynchronous方式向客户端推送更新:通道已打开,客户端可以调用任何期货/callback/承诺来pipe理任何asynchronousWebSocket收到的消息。

简而言之,WebSocket是一个基于TCP(可靠传输层,基于每帧)的高级协议(如HTTP本身),使得可以使用JS客户端构build有效的实时应用程序(以前的Comet和长轮询技术被用来从服务器拉动更新 )。