我是一名学生,我使用暗语。实际上,我在树莓派上有一个 Python 脚本,其中装有 selenium 和 phantomjs,可以在运行时自动连接。
我想在不造成网络洪流的情况下检查互联网连接。
Icinga 监控,netstat 建立连接,ping,nmap......最好的方法?
答案1
假设连接要么处于死状态要么处于活动状态,并且您可以可靠地分辨出两者的区别,这是不正确的。这种假设会导致系统不可靠,因为您最终可能会依赖一种启发式方法,而这种方法实际上并没有检查您期望的活动属性。
更好的方法是监控您需要连接为您做的事情是否实际有效。例如,如果您需要特定客户端连接到特定服务器,那么这就是您应该监控的内容。只要两者保持通信,您就不必关心其他启发式方法是否会认为连接已断开。
如果监控确实检测到问题,那么您可能希望监控对此发出警报。您可能希望监控不仅检测到连接中断并发出警报,还尝试纠正问题。然而,这会带来更多问题。
例如,假设您有硬件可以在发生中断时关闭网络组件的电源。那么您可能不想关闭它,因为客户端和服务器无法相互通信。可能是连接的另一端已关闭,不需要关闭电源。甚至可能关闭电源会导致中断或妨碍手动干预。
有办法解决此类问题。例如,如果与服务器的连接似乎已断开,那么您可以向服务器发送 DNS 查询。如果您收到了回复,则说明不是因为连接完全断开。但您甚至不必将请求一直发送到 DNS 服务器。您可以发送具有较低跳数限制的 DNS 查询。例如,如果您发送了跳数限制为 3 的 DNS 查询并从第三跳数获得了 ICMP 回复,那么关闭第一跳的电源循环不太可能解决问题。
这当然不是灵丹妙药。即使是最好的启发式方法有时也会出错。如果你要构建某种东西来尝试自动重启断开的连接,你肯定需要确保它具有指数退避策略来阻止它反复重启。
显然,如果不交换任何数据包,就无法监控连接性。但您确实希望限制处理这些数据包的成本。例如,尽管您可以将数据包发送出去几跳,并从特定路由器收到错误消息,但对于大多数路由器来说,这并不是最便宜的操作。如果您能找到一种方法来发送和返回数据包,而无需涉及路由器的硬件转发部分以外的任何操作,那么即使这样做需要更多跳数,也会更便宜。
如果您有多个站点,您可以通过让它们定期成对通信来提高连接监控的可靠性。如果一个站点同时与所有其他站点失去连接,那么很可能这个站点存在连接问题。
答案2
如果您想知道是否可以访问互联网,通过 8.8.8.8 和 8.8.4.4 的服务器对 www.google.com 进行 DNS 查找是最可靠的方法。
如果您得不到答案,那么您的互联网连接肯定存在问题。请注意,“存在问题”并不意味着完全无法访问。
你无法证明互联网连接是完美的。