為什麼 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 位址

此功能由套接字選項控制IPV6_V6ONLY,預設由net.ipv6.bindv6onlysysctl ( /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,它們已連線。

相關內容