在我的应用程序中,我正在 ping 服务器并等待响应。我用它来确定服务器是否可用且响应。
这是确定可用性的可靠方法吗?我假设防火墙可能会过滤 icmp 流量...还有其他缺点吗?有没有更可靠的方法?
答案1
判断任何给定远程服务是否处于活动状态的最佳方法是要求它按照预期的方式处理请求 - 事实上,这是真正了解某些东西是否正常运行的唯一方法。
例如,我总是让我的负载均衡器从我们的 Web 服务器获得实际的“head”响应,如果您愿意,您可以对 DB 框上的小选择执行相同的操作,或者您的实际服务器提供的任何服务。作为一个提示,您可以在 Web 服务器上创建一个“online.txt”(或您想要的任何名称),让您的 LB 尝试获取该文件,如果失败,则它会从 VIP 中删除服务器,这是一种手动将单个服务器从 VIP 中移除的好方法,只需重命名一个文件即可。
Ping 仅测试响应 ping 的能力,因此这是基本操作系统、IP 堆栈的部分和物理链路 - 但仅此而已,其他一切都可能发生故障而您却不知道。
我知道下面提到了这一点,但值得一遍又一遍地重复。
ICMP 回显请求(又名“Ping”)(又名 ICMP 类型 8)是内置于 IP 堆栈规范中的,但无需实施或使用。事实上,有大量互联网提供商拒绝转发这些请求并默默丢弃这些请求,因为它们是一种网络攻击(称为 pingflood)。
如上所述,这是由操作系统处理的(特别是在网络堆栈级别),因此是否响应这些取决于操作系统配置。如果关闭此功能(安全预防措施?),您将无法接收来自另一端的 ping 回复。这就是它不可靠的原因。
答案2
大多数情况下是的,但是:
一些服务器阻止 ping 请求
只是因为服务器正在响应并不意味着该网站(或您希望使用的任何服务)工作中,您还应该检查响应是否与预期内容相符。
答案3
确实,在很多情况下 ICMP 流量会被过滤掉,因此可能不可靠......
更好的方法也许是通过您感兴趣的服务端口 telnet 到服务器。
即 telnet 127.0.0.1 8080
答案4
ping 有两个缺点:
- ping 发送 icmp,可被防火墙过滤
- 你的应用程序使用的 tcp 或 udp 端口可能正忙或未打开 - ping 不会检查这一点
更好的解决方案是直接检查您的 udp/tcp 端口,看看服务是否仍然可用...:-)