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)
非常感謝您的任何見解!
在 Linux 中,IPv6 套接字可能同時是 IPv4 和 IPv6。IPv6 套接字也可以接受來自IPv4 映射的 IPv6 地址的數據包。
此功能由
IPV6_V6ONLY
socket 選項控制,其預設值由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,它們已連接。