在分布式系统中经常需要使用到心跳机制作为探活的手段。在java 中InetAdress有个isReachable功能,可以判断网络是否通,与ping类似。
在非root 用户下使用isReachable时,其实是通过tcp 协议,向对端的7号端口发送了一个报文。这种情况下有一定隐患,并不是所有机器的7号端口都是开启的(有些环境为了安全考虑会关闭一些著名的端口)
在root 用户下执行时,是通过ICMP 发送一个探活报文(ping 的实现就是ICMP)。这种协议是一种可靠的协议,并且不依赖端口。
非root 用户如果用cap_net_raw 权限,可以发送ICMP协议。