首页 文章

TCP套接字和Web套接字之间的差异,再一次[重复]

提问于
浏览
105

这个问题在这里已有答案:

为了尽可能地了解TCP套接字和websocket之间的差异,我已经在这些问题中找到了很多有用的信息:

等等...

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

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

我不完全确定它究竟意味着什么 . 你有什么解释?

2 回答

  • 158

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

    但是接收方面存在更重要的差异 . 当接收器在TCP套接字上执行recv(或读取)时,无法保证返回的字节数对应于发送方的单个发送(或写入) . 它可能是相同的,它可能更少(或为零)甚至可能更多(在这种情况下,来自多个发送/写入的字节被接收) . 使用WebSockets,消息的接收是事件驱动的(通常是注册消息处理程序例程),事件中的数据始终是另一方发送的整个消息 .

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

  • 97

    WebSocket基本上是一个应用程序协议(参考ISO / OSI网络堆栈),面向消息,其中 makes use of TCP 作为传输层 .

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

    在幕后,WebSocket在一致的信封/消息中重建TCP帧 . 全双工通道以异步方式由 Server to push 更新用于客户端:通道已打开,客户端可以调用任何期货/回调/承诺来管理任何异步WebSocket接收消息 .

    简而言之,WebSocket是一种基于TCP(可靠传输层,基于每帧)构建的高级协议(如HTTP本身),可以使用JS客户端构建有效的实时应用程序(以前的Comet和长轮询技术)用于在实现WebSocket之前从服务器提取更新 . 请参阅Stackoverflow post:Differences between websockets and long polling for turn based game server) .

相关问题