【问题标题】:Differences between TCP sockets and web sockets, one more time [duplicate]TCP套接字和Web套接字之间的区别,再来一次[重复]
【发布时间】:2013-06-01 11:21:07
【问题描述】:

尽我所能理解 TCP socket 和 websocket 之间的区别,我已经在这些问题中找到了很多有用的信息:

等等……

在我的调查中,我在wikipedia上经历了这句话:

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

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

【问题讨论】:

  • 我认为你在维基百科上的这句话有点误导。从我刚刚从您的链接中读到的内容看来,WebSockets 似乎只是用于非 http 流量的 HTTP TCP 连接。 IE,您在 TCP 连接上与服务器协商到它的端口 80,以使用套接字进行 VPN 类型的流量或其他事情。所以 websocket 只是一个非 http 的 http 套接字?吐口水......不确定他们所说的“消息”而不是维基百科摘录中的字节是什么意思。
  • 消息:给我一个 json 有效负载,给我另一个 json 有效负载。完整的消息字节流:给我 n 个字节,我会回复 100 Continue,你给我接下来的 n 个字节。重复直到没有更多字节。这些是在服务器上重新组装的不完整消息。用于流式传输和分块

标签: sockets tcp websocket


【解决方案1】:

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

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

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

【讨论】:

  • @kanaka 是该主题的专家,根据 Wikipedia 政策,专家不应编辑主题文章:“利益冲突”(COI) 政策。我也在那里被烧过和烤过。忘记维基百科。
  • 那么 web socket 只是普通的 tcp socket 和 web 浏览器之间的一个额外的层?
  • @MarcCasavant 您提出问题的方式似乎暗示 WebSockets 是开销,没有充分的理由存在。我会反过来说,WebSockets 是 TCP 的封装,它为浏览器带来类似 TCP 的功能和性能,而无需使用插件,也不会放弃来之不易的浏览器安全最佳实践(如 CORS)。握手之后,额外分层的开销非常轻(小帧为2字节头)。
  • @oberstet 这是对actual policy 的一个相当大的错误陈述。你所声称的将是荒谬的。它真正说的是“提醒专家编辑注意在编辑涉及专家自己的研究、著作或发现的文章时可能出现的潜在利益冲突。”
  • @EJP 是的,这很荒谬。这是我在实践中如何展开政策的经验。正如实际读者所承认的那样,“政策警察”会出现并删除有价值的信息。请参阅en.wikipedia.org/wiki/…en.wikipedia.org/wiki/…
【解决方案2】:

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

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

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

简单地说,WebSocket 是一个建立在 TCP(可靠传输层,基于每帧)之上的高级协议(就像 HTTP 本身),它可以使用 JS 客户端(以前的 Comet 和 long在实施 WebSocket 之前,使用轮询技术从服务器中提取更新。请参阅 Stackoverflow 帖子:Differences between websockets and long polling for turn based game server)。

【讨论】:

    猜你喜欢
    • 2016-08-15
    • 2013-05-21
    • 1970-01-01
    • 2020-10-18
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多