websocket连接可靠吗?

Posted

技术标签:

【中文标题】websocket连接可靠吗?【英文标题】:Is websocket connection reliable? 【发布时间】:2016-03-17 08:27:02 【问题描述】:

我一直认为 web socket 可以保证数据的传递,因为它建立在可靠的 TCP 之上。我正在阅读此链接上的 Java Web 套接字 API 文档 https://docs.oracle.com/javaee/7/api/javax/websocket/RemoteEndpoint.html 它说

无法保证将 Web 套接字消息成功传递给对等方,但如果发送消息的操作导致容器已知错误,则 API 会抛出该错误。

TCP 不应该保证消息传递吗?

【问题讨论】:

Web 套接字是对 TCP 的抽象。换句话说,Web Socket 协议的底层协议是 TCP(Web 套接字消息通过 TCP 传输)。就像在 TCP 之上使用 HTTP 协议一样。 Web Socket 实现有自己的数据包或帧,这些数据包或帧可能具有额外的保证,例如基于相关 ID 的消息排序。由于客户端和服务器之间的连接随时可能中断,因此任何失败的消息都需要重新发送,而无需任何一方的干预。这可能有助于您了解这种区别 TCP 不保证消息传递。它具有检测传输错误或数据包损坏并在这些情况下尝试重新传输的内置方法,但传输仍然可能失败。它保证如果数据包没有传递,调用者将得到一个错误,以便调用者知道。由于 websocket 是建立在 TCP 之上的,它也有同样的问题。如果网络连接中断,最终可能会出现交付错误。 @Bunti 那么在使用websocket的时候丢包会不会重传呢? @jfriend00 但是TCP在丢包的时候会重传,对吧? @Tejas - 是的,如果数据包刚刚丢失,但连接正常。但是一旦连接真正断开,TCP 最终会放弃并返回错误。因此,TCP 在连接工作时保证可靠传递,但不能保证连接保持工作。想象一下,您正在与移动设备通信,而移动设备超出了覆盖范围。 【参考方案1】:

可靠!= 有保证。可靠意味着如果出现故障(或成功),您会收到通知 - 如果最终用户拔掉他们的 LAN 电缆,即使 tcp 也无法“保证交付”。

【讨论】:

但是丢包时是否重传? 对于 tcp,是的 - 这是由操作系统的 tcp 实现处理的,并且在成功/失败之前不会通知您的应用(应用层)。【参考方案2】:

“保证”有点误导。 TCP 将尽最大努力发送由一个 TCP 堆栈发送的有序数据,以便由另一个 TCP 堆栈按顺序接收。如果无法做到这一点,TCP 堆栈将出现错误情况。这与您从商店获得的退款保证没有什么不同;故障模式意味着您可以更换并重试……最终,如果故障太多并拿回您的钱(例如,连接中断)。

另外... TCP“保证”确实意味着数据“保证”在两个堆栈的应用程序级别得到正确处理。这是应用协议的职责。工作完成后,TCP 将其交给上面的应用程序层,这些应用程序层实现了 pub/sub、http、rpc、元组空间、电子邮件、ftp、事务、数据库等......

【讨论】:

以上是关于websocket连接可靠吗?的主要内容,如果未能解决你的问题,请参考以下文章

Jetty Websockets - 在处理不可靠的连接时正确发送异步消息

Jetty Websockets - 在处理不可靠的连接时正确发送异步消息

GAE 可以限制我的 websocket 连接吗?

使用 websockets 时,我应该为每个不同的任务打开一个新的 websocket 连接吗?还是我应该在一个连接中完成所有事情?

一个客户端可以开两个websocket连接吗?

nginx可以对websocket连接做透明压缩吗?