netstat 输出中的 ::80 是否仅表示 ipv6 或 ipv6+ipv4?

Akh*_*hil 3 networking ipv6 ipv4

如果我正在监听:::80,是监听所有 ipv6 还是所有 ipv6+ipv4?

这是我的netstat -tln

tcp        0      0 :::8080                     :::*
Run Code Online (Sandbox Code Playgroud)

Joh*_*éen 8

绑定到 的侦听套接字::,即任何地址 IPv6 地址 ( INADDR6_ANY),可能也可能不侦听使用 IPv4 的连接。这取决于几个方面:

  • 一些操作系统是所谓的双栈,在这些操作系统上,这取决于是否IPV6_V6ONLY在侦听套接字上设置了套接字选项(由创建套接字的程序)。基于 Linux 的操作系统和 FreeBSD 是此类操作系统的示例。

    如果程序未明确设置该选项,则默认行为取决于操作系统。例如,在基于 Linux 的操作系统上,您可以通过将 0 或 1 写入 来更改此默认值/proc/sys/net/ipv6/bindv6only

  • 其他一些操作系统不是双栈的,在这些操作系统上,人们永远无法使用单个套接字同时侦听 IPv6 和 IPv4。OpenBSD 就是这样一种操作系统。

在某些操作系统上, 的输出netstat会告诉您套接字是否是双栈的。FreeBSD的netstat报告双栈插座作为tcp46udp46在输出中,对于实施例中的第一列。

感谢您的回答@Johan Myreen 我想用例子来改进这个答案。

我正在使用这两个值测试 ipv6_only 行为。

1.

cat /proc/sys/net/ipv6/bindv6only
0
nc -6 -l 80
#server started
# netstat
tcp6       0      0 :::80                   :::*                    LISTEN     
# nc client
nc localhost 80
test
# server response 
nc -6 -l 80
test
# from ipv6 now
 nc ::1 80
test ipv6
# server response
nc -6 -l 80
test ipv6
Run Code Online (Sandbox Code Playgroud)

2.

cat /proc/sys/net/ipv6/bindv6only
1
# server started
nc -6 -l 80
# connect to ipv4
nc localhost 80
nc: connect to localhost port 80 (tcp) failed: Connection refused
# connect to ipv6 
nc ::1 80 
test ipv6 
# server respose
nc -6 -l 80
test ipv6 
Run Code Online (Sandbox Code Playgroud)

从上面的结果可以看出,/proc/sys/net/ipv6/bindv6的值只决定ipv6的行为还是ipv6+ipv4