lsof が IPv4 ソケットが IPv6 であると示すのはなぜですか?

lsof が IPv4 ソケットが IPv6 であると示すのはなぜですか?

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 アドレス

この機能はソケット オプションによって制御され、そのデフォルトはsysctl ( )IPV6_V6ONLYによって制御されます。ほとんどの Linux ディストリビューションでは、デフォルトは 0 (つまりオフ) です。net.ipv6.bindv6only/proc/sys/net/ipv6/bindv6only

これは次のように簡単に再現できます:

[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 であり、それらは接続されています。

関連情報