我希望能够像检测正在运行的机器上没有服务一样快速地检测出关闭的机器。例如:
$ time telnet 192.168.1.140 80 # An existing machine, no service
Trying 192.168.1.140...
telnet: connect to address 192.168.1.140: Connection refused
telnet: Unable to connect to remote host: Connection refused
real 0m0.003s
user 0m0.001s
sys 0m0.001s
因此需要 3 毫秒才能确定这台现有机器上没有服务。但是当我执行:
$ time telnet 192.168.1.222 80 # This machine is shutdown
Trying 192.168.1.222...
telnet: connect to address 192.168.1.222: No route to host
telnet: Unable to connect to remote host: No route to host
real 0m3.017s
user 0m0.001s
sys 0m0.001s
需要3秒钟才能确定这台机器已关机。这是服务测试时间的1000倍。
有没有什么办法可以缩短这个延迟?
答案1
您可以使用 ping 命令并设置一秒超时时间 (-W),但这只有在所有相关主机都正常响应 ping 命令时才有效。否则,您可以在本地网络上发送 arp 请求,这些请求通常会得到极快的响应,但我不知道有哪个程序可以配置超时时间(arping 不提供超时时间)。不过,为此目的创建一个小脚本应该不会太难。
编辑:关于此问题的一些补充说明:首先,我不认为存在一个可以解决您问题的通用解决方案。Telnet 之所以能如此快速地通知您有关被拒绝的连接,是因为目标主机告诉它端口 80 上没有任何内容。如果您将目标上的防火墙配置为默默丢弃所有带有 dport 80 的数据包,telnet 在超时前需要的时间将与离线主机所需的时间一样长。其次:您可以使用上述方法或多或少地解决这个问题,但这并不可靠,因为在负载很重的主机上,ping 和 arp 的响应时间可能相当长。
为什么需要这种快速离线检测?
答案2
如果通过主机名而不是 IP 进行 telnet,问题不是会解决得更快吗?路由器应该会识别出主机不存在并立即断开连接。