Warum zeigt lsof an, dass mein IPv4-Socket IPv6 ist?

Warum zeigt lsof an, dass mein IPv4-Socket IPv6 ist?

Ich sehe mir die Ausgabe von lsof -i an und bin verwirrt! Beispielsweise wird die folgende Verbindung zwischen meinem Java-Prozess und der Datenbank als IPv6 angezeigt:

[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)

Der Ausgabetyp ist also IPv6, aber in der Spalte NAME wird eindeutig eine IPv4-Adresse angezeigt. Darüber hinaus wurde die Verbindung mit einer IPv4-Adresse konfiguriert! (In diesem Beispiel 192.168.0.2)

Vielen Dank für alle Einblicke!

Antwort1

Unter Linux können IPv6-Sockets gleichzeitig IPv4 und IPv6 sein. Ein IPv6-Socket kann auch Pakete von einemIPv4-zugeordnete IPv6-Adresse.

Diese Funktion wird durch die Socket-Option gesteuert , deren Standardwert durch sysctl ( ) IPV6_V6ONLYgesteuert wird . Bei den meisten Linux-Distributionen ist der Standardwert 0 (d. h. deaktiviert).net.ipv6.bindv6only/proc/sys/net/ipv6/bindv6only

Dies kann leicht reproduziert werden mit:

[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

Der Client-Socket ist IPv4 und der Server-Socket ist IPv6, und sie sind verbunden.

verwandte Informationen