在第一台主机上,
root@xxx:~# netstat -natup | grep xxx
tcp 0 0 10.2.5.3:40740 xxx:10051 ESTABLISHED 1482/zabbix_proxy:
我们可以看到已经与远程主机建立了连接。
root@xxx:~# ps -eo uid,pid,etime | grep 1482
106 1482 18-17:10:17
连接已建立大约 18 天。当我通过 SSH 连接到远程主机并运行时:
root@xxx:~# netstat -natup | grep 10.2.5.3
绝对没有任何条目!
这怎么可能?
答案1
如果第一台主机没有发起流量,则连接将永远保持在“ESTABLISHED”状态,直到本地进程关闭连接或远程主机关闭连接。
现在想象一下主机之间的网络中断;来自远程主机的数据包无法到达第一台主机。在此中断期间,远程主机尝试向第一台主机发送某些内容;由于没有从第一台主机收到 ACK 数据包,因此超时。一段时间后,连接超时,远程主机关闭连接。然而,第一台主机完全不知道另一台主机上发生了什么,因此连接仍处于“ESTABLISHED”状态。
如果远程主机遇到电源故障并重新启动,也会发生同样的情况;没有机会首先终止现有的网络连接。
为了防止这种情况,需要在套接字级别打开 tcp keepalive。这会导致主机之间定期交换保活数据包,以便即使没有正常流量也可以检测到网络中断。
答案2
首先,该etime
字段指示进程何时启动。这并不一定意味着当时已将连接绑定到它。
接下来,也许正在使用某种网络地址转换?如果是这样,请grep
输入远程主机上的端口号:netstat -natup|grep 40740
以查看返回的内容。