在我的一台 Linux 主机上,一个 TCP 套接字似乎在一侧可见,而在另一侧不可见。我的意思是,当我在其中一台主机上时,netstat 会显示此套接字,而不是在另一台主机上(Linux 也是):
# netstat -anp|grep 37674
udp 0 0 169.254.192.2:37674 169.254.192.1:8649 ESTABLISHED 22644/xxxxx
# ssh 169.254.192.1
Last login: Mon Jan 13 15:22:54 CET 2014 from xxxxxx on ssh
# netstat -anp|grep 8649
#
如果我正确无误,netstat 会从/proc/net/tcp 读取连接。显然,本地 IP 地址和端口在第二列的/proc/net/tcp 中显示为 0123ABCD:1234。
37674(10) = 932A(16)
因此,我试图在/proc/net/tcp 中找到 932A,忽略了大小写,但一无所获。
IP 地址不会被截断,因为我的网络上没有其他 169.254.192.1xx 主机。
这个连接在三个小时后仍然可见,因此我认为它与超时无关。
netstat 的输出显示 UDP。(查看/proc/net/udp)
这意味着 169.254.192.2 已将 connect() 调用到 169.254.192.1:8649。但是,UDP 是无连接的,因此此信息仅本地记录在 169.254.192.2 计算机上的套接字上。
在 UDP 套接字上调用 connect()只是允许您在该套接字上调用 send(),而无需使用 sendto()/sendmsg() 为每个数据包指定目标地址 - 两台机器之间没有创建实际连接。
如果 169.254.192.1 计算机未在端口 8649 上侦听/接收数据包,则 169.254.192.1 计算机设置可以向那里发送数据包的套接字没有意义。