【问题标题】:How expensive is maintaining a TCP socket in java在 Java 中维护 TCP 套接字有多贵
【发布时间】:2016-08-26 14:35:03
【问题描述】:

我目前已经为我的项目实现了心跳机制,并且我使用 TCP 作为我的底层连接。我想知道维护一个 tcp 连接有多贵。每个从站每 5 秒向主站发送一次心跳(是的,我经常知道它的方式,但我有充分的理由这样做)。所以我想知道我应该不断地创建一个新的连接还是应该保持连接打开。因为如果我保持打开的连接,那么在这种情况下我可以处理异常。但是由于我需要每 5 秒知道一次从属设备是否关闭,我应该重新建立连接还是保持打开状态。提前致谢。

【问题讨论】:

  • 保持打开状态更可取

标签: java tcp


【解决方案1】:

定期重新打开连接的成本更高;有一个three-way handshake 打开。一旦套接字打开,该成本就可以摊销(但前提是您将其保持打开状态)。

【讨论】:

  • 如果我有 100 多个奴隶,这会是真的吗?因为那时我为他们每个人打开了一个专用线程。而且三路握手只是SYN-ACK包,有那么贵吗?就是想?谢谢!!!
  • 如果你有 100 个从站,那么你应该查看 multicast。打开套接字是使用 TCP 最昂贵的部分。其他选项包括 UDP。但是您特别询问了 TCP。
【解决方案2】:

如果你正在做心跳,为什么不使用UDP,TCP需要确认接收,UDP不需要,那么你可以有一个监听器,只接收广播给它的任何数据包并处理。意味着在主系统上打开一个端口,无论有多少孩子发送到它。

TCP 你需要每个孩子一个连接。

【讨论】:

  • 我的心跳管理器检查从站是否已经超过 8 秒。而且由于 UDP 是不可靠的,如果我错过了心跳,我的心跳管理器会将工人标记为关闭,即使它不是!!!
  • 所以在标记之前允许 2-3 个联系人。在我工作的系统上,我们有一条保持活动消息,如果我们错过了 1 个联系人(15 秒),我们将进入该设备的恢复模式,直到我们错过第二个联系人,然后我们将其标记为关闭 - 这些是异步消息
  • 顺便说一句,这是我使用的系统image.slidesharecdn.com/…
【解决方案3】:

如前所述,重新打开连接的成本更高,除非涉及其他因素,例如移动性。您不仅有一个three-way 握手,而且还有一个终止连接的four-way 握手。除此之外,您的 TCP 服务器应用程序可能会为每个新连接打开新线程,这也需要分配、解除分配等。 您的连接很可能还会通过通常经过 NAT 的防火墙,从而打开端口和状态。这也是我个人很少使用 UDP 的原因,因为 UDP 在通过防火墙和 ISP 过滤器时可能会出现问题。

最后,从协议的角度来看,TCP 连接本身的维护是最少的。 TCP 确实有 keep-alive 选项,但这些选项很少像每 5 秒那样频繁发送。在您的操作系统进程中,上下文切换会产生少量开销,但无论您打开和关闭连接,都会发生这种情况。

保持打开状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-23
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多