通过网络安全创建 "Heart Beat"(Ping?)

Safely Creating "Heart Beat" over Network (Ping?)

我创建了扩展的 TCP 服务器和 TCP 客户端 类(在 C# 中)用于我的项目使用的网络通信。

据我所知,客户端无法真正知道服务器是否已关闭,除非它请求的内容需要回复但没有得到回复

在我们的应用程序中,(服务器的)时间和可用性是关键因素,因为它涉及用于自动化的重型机器。因此,根据对设计的讨论,服务器应该定期"Heart Beat"发送它的,以防客户端在一段时间后没有从服务器收到任何东西,它将:

  1. 开始尝试自己的恢复操作,如果仍然失败,
  2. 它将向控制室的服务人员发出警报

我应该在服务器中实现 "heart beat" 部分。我有创建 "Heart Beat".

的简单实现
public void SendHeartBeatToAllClients(byte[] hbdata) {
  foreach (Socket socket in clientNoSocketList.Select(x => x.Value).ToList())
    socket.Send(hbdata);      
}

到目前为止它工作正常,但让我担心的一件事是心跳数据 (hbdata) 很短(只有几个预先安排的字节,以节省与许多机器交谈的时间)和自定义的,由于服务器除了hbdata之外还会发送一些其他数据,考虑到可能的延迟或其他意外情况,这个hbdata总是有可能混淆的。此外,在我的 "heart beat" 实现中,客户端不需要向服务器回复任何内容。

所以这是我的问题:

  1. 我的担心是不是没有根据(目前还好)?有没有瑕疵?
  2. Ping 是通过 TCP 获得这种心跳功能的更好还是更常见的方法?为什么或为什么不?
  3. 如果要实现Ping,考虑到Ping有回复,有没有办法实现无回复Ping
  4. 有什么建议可以在尽可能短的数据量下使心跳足够稳健吗?

in my "heart beat" implementation, the client does not need reply anything to the server.

应用程序级别的保持活动需要是双向的,不是吗?上面的内容使客户端可以确定服务器在接收到心跳时是活着的并且是健康的。如果客户端没有响应,服务器将不知道客户端的真实状态。如果客户端无法访问,心跳会堆积在服务器发送缓冲区中。服务器应用程序将忽略这一事实。

Is my worry not well-grounded (as it is fine so far)? Is there any flaw?

小字节应该不是问题。心跳越小越好。

Is Ping a better or a common way to have such heart beat functionality over TCP? Why or why not?

即使客户端应用程序已关闭但系统正常,Ping 也会正常。

  1. 这可能是最难回答的问题。你能提供更多细节吗?为什么您认为您的服务器无法处理超过几个字节的发送?我们在这里谈论的是数千台机器吗?一切都在本地局域网上,还是跨越多个网络或互联网?

  2. Ping 是一个 ICMP 回显请求 - ping 常被网络监控软件等用来确保客户端在线。如果您只是为了网络访问而进行 ping 操作(参见:https://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping(v=vs.110).aspx),通常您不需要自己实现。

    另请注意,ping 根本不是基于 TCP,而是基于 ICMP,这是一种稍微不同的协议,用于网络诊断等。但这让我想到了 3...

  3. Ping 没有 回复有点毫无意义。对于您的想法,我认为您想要的协议是 UDP - 您可以广播任意数据报,不需要任何类型的握手或回复(根据定义,TCP 涉及通过握手建立会话) - 它只是发送。这些将是带有 SocketType.Dgram 而不是 SocketType.StreamProtocolType.Udp 而不是 Tcp 或 ICMP 的套接字。如果您想更多地参与,可以使用广播将同一事物发送到整个 LAN,或使用多播发送到特定的客户端组。

  4. 再一次,你确定你需要担心这里的流量限制等问题吗?

    就我个人而言,我会反过来,让客户端 "Check In" 在设定的时间间隔内向服务器报告状态代码。如果服务器注意到客户端有一段时间没有签到,它应该向客户端发送消息并期待回复。

    如果你真的在扩展它时遇到问题,我会让服务器以设定的时间间隔通过 UDP 发送 "Heart beats",如果客户端认为它丢失了它们,有一个机制让它命中服务器并请求回复 - 然后如果没有得到回复,则发出警报。

编辑:刚看到 Prabhu 的回答 - 他是对的,ping 只会告诉你计算机是否启动,你肯定希望实际应用程序中的某些东西能够报告回来,而不仅仅是网络连接的状态.