Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets TCP套接字和web套接字之间的差异,再一次_Sockets_Tcp_Websocket - Fatal编程技术网

Sockets TCP套接字和web套接字之间的差异,再一次

Sockets TCP套接字和web套接字之间的差异,再一次,sockets,tcp,websocket,Sockets,Tcp,Websocket,为了尽可能地理解TCP套接字和websocket之间的区别,我已经在以下问题中找到了很多有用的信息: 等等 在我的调查中,我对以下内容进行了陈述: Websocket与TCP的不同之处在于它支持消息流而不是字节流 我不完全确定它的确切含义。您的解释是什么?当您使用普通TCP套接字从缓冲区发送字节时,send函数返回已发送的缓冲区字节数。如果是非阻塞套接字或非阻塞发送,则发送的字节数可能小于缓冲区的大小。如果是阻塞套接字或阻塞发送,则返回的号码将与缓冲区大小匹配,但调用可能会阻塞。对于We

为了尽可能地理解TCP套接字和websocket之间的区别,我已经在以下问题中找到了很多有用的信息:

等等

在我的调查中,我对以下内容进行了陈述:

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


我不完全确定它的确切含义。您的解释是什么?

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

但在事情的接受方面还有更重要的区别。当接收器在TCP套接字上执行
recv
(或
read
)时,无法保证返回的字节数对应于发送方的一次发送(或写入)。它可能是相同的,可能更少(或零),甚至更多(在这种情况下,从多个发送/写入接收字节)。对于WebSocket,消息的接收者是事件驱动的(通常注册消息处理程序例程),事件中的数据始终是另一方发送的整个消息


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

WebSocket基本上是一种面向消息的应用程序协议(参考ISO/OSI网络堆栈),利用TCP作为传输层

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

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


简单地说,WebSocket是一种基于TCP(基于每帧的可靠传输层)构建的高级协议(与HTTP本身类似),它使使用JS客户端构建有效的实时应用程序成为可能(以前,在WebSocket实现之前,Comet和长轮询技术用于从服务器获取更新。请参阅Stackoverflow帖子:).

我认为你在维基百科上的这句话有点误导。从我刚刚从你的链接中读到的内容来看,websocket似乎只是用于非HTTP流量的HTTP TCP连接。也就是说,你与服务器协商TCP连接到它的端口80,以使用套接字进行VPN类型的流量或其他。因此websocket只是一个否定n-http,http套接字?随地吐痰…不知道“消息”是什么意思代替Wikipedia摘录中的字节。消息:给我一个json负载,给我另一个json负载。完整消息字节流:给我n个字节,我将用100继续响应,你给我下一个n个字节。重复,直到没有更多字节。这些是在服务器上重新组装的不完整消息。用于叛逆和chunking@kanaka是主题方面的专家,根据维基百科的政策,专家不应该编辑主题文章:“利益冲突”(COI)政策。我也在那里被烧死和拷问。忘了维基百科吧。那么web套接字只是普通tcp套接字和web浏览器之间的一个额外层吗?@MarcCasavant你问这个问题的方式似乎暗示WebSockets是开销,没有充分的理由存在。我会反过来说WebSockets是tcp的封装,br在不使用插件和不放弃来之不易的浏览器安全最佳实践(如CORS)的情况下,为浏览器提供类似TCP的功能和性能。握手之后,额外分层的开销非常小(小帧的标题为2字节)@oberstet这是一个相当大的错误陈述。你所说的将是荒谬的。它真正说的是“专家编辑被警告要注意,如果编辑涉及专家自己的研究、著作或发现的文章,可能会产生潜在的利益冲突。”@EJP是的,这是荒谬的。这是我的经验,政策是如何在实践中展开的。正如实际读者所承认的,“政策警察”会出现并删除有价值的信息。请参阅和