我想出了一个不寻常的套接字状态,想知道是否有人可以解释它。
我有一个正在运行的java进程,它使用TCP协议侦听端口N. java进程在启动时成功绑定到该端口,并在其上等待accept()方法。 在某些未知的点上,java进程已经丢失了正在侦听该端口的文件描述符,但它仍在wait()方法上等待,并且在其上调用了no close()方法。
查看'lsof'的输出(以root为单位),没有进程持有该端口。
/root ! # lsof | grep N
查看'fuser'的输出(作为root),没有进程持有该端口。
/root ! # fuser –n tcp N
查看'ss'的输出(作为root),没有进程持有该端口。
/root ! # ss -ltp | grep N
129 128 *:31526 *:*
查看'netstat'(作为root)套接字是Listening但没有任何与之相关的进程(但它确实有一个inode编号)
root ! # netstat -putane | grep N
tcp 129 0 0.0.0.0:N 0.0.0.0:* LISTEN 0 1488959042 -
tcp 661 0 X0.X1.X2.X3:N Y0.Y1.Y2.Y3:N1 CLOSE_WAIT 0 0 -
tcp 1982 0 X0.X1.X2.X3:N Y0.Y1.Y2.Y3:N2 CLOSE_WAIT 0 0 -
…
在/ proc / / fd / 中搜索该inode的引用时显示为空。
/root ! # find /proc/*/fd/* -exec stat {} \; | grep 1488959042
在/ proc / net / etc中查找inode会产生以下结果:
/root ! # cat /proc/net/tcp | grep 1488959042
5: 00000000:7B26 00000000:0000 0A 00000000:00000081 00:00000000 00000000 0 0 1488959042 1 ffff88179d96af40 300 0 0 2 -1
使用telnet连接到该端口正在运行,数据可以发送给它。
/root ! # telnet localhost N
尝试从新进程获取端口失败,错误指示地址正在使用中。
内核中没有列出孤儿,也没有达到孤儿的限制。
/root ! # cat /proc/sys/net/ipv4/tcp_max_orphans
262144
/root ! # cat /proc/net/sockstat
sockets: used 179
TCP: inuse 111 orphan 0 tw 33 alloc 164 mem 346
UDP: inuse 17 mem 11
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
tcp内存也没有被破坏。
/root ! # cat /proc/sys/net/ipv4/tcp_mem
2326728 3102307 4653456
所以这是我的问题:
在线查看是空的,关于孤立套接字的唯一信息是指基于内核的端口(例如NFS服务端口)和处于TIME_WAIT状态的套接字,应该在一定的超时后由内核清除。
非常感谢您的帮助!