我正在查看 lsof -i 的输出,我很困惑!例如,我的 java 进程和数据库之间的以下连接显示为 IPv6:
[me ~] % lsof -P -n -i :2315 -a -p xxxx
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java xxxx me 93u IPv6 2499087197 0t0 TCP 192.168.0.1:16712->192.168.0.2:2315 (ESTABLISHED)
因此输出类型是 IPv6,但它在 NAME 列中清楚地显示了 IPv4 地址。此外,该连接配置了 IPv4 地址! (在此示例中为 192.168.0.2)
非常感谢您的任何见解!
答案1
在 Linux 中,IPv6 套接字可能同时是 IPv4 和 IPv6。 IPv6 套接字还可以接受来自IPv4 映射的 IPv6 地址。
此功能由套接字选项控制IPV6_V6ONLY
,默认由net.ipv6.bindv6only
sysctl ( /proc/sys/net/ipv6/bindv6only
) 控制。在大多数 Linux 发行版上,其默认值为 0(即关闭)。
这可以很容易地重现:
[prompt] nc -6 -l 9999 & nc -4 localhost 9999 &
[4] 10892
[5] 10893
[prompt] lsof -P -n -i :9999
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nc 10892 x 3u IPv6 297229 0t0 TCP *:9999 (LISTEN)
nc 10892 x 4u IPv6 297230 0t0 TCP 127.0.0.1:9999->127.0.0.1:41472 (ESTABLISHED)
nc 10893 x 3u IPv4 296209 0t0 TCP 127.0.0.1:41472->127.0.0.1:9999 (ESTABLISHED)
[prompt] kill %4 %5
客户端套接字是 IPv4,服务器套接字是 IPv6,并且它们已连接。