![在将套接字绑定到 IPv6 地址时,[::] 和 * 之间有什么区别?](https://linux22.com/image/1602412/%E5%9C%A8%E5%B0%86%E5%A5%97%E6%8E%A5%E5%AD%97%E7%BB%91%E5%AE%9A%E5%88%B0%20IPv6%20%E5%9C%B0%E5%9D%80%E6%97%B6%EF%BC%8C%5B%3A%3A%5D%20%E5%92%8C%20*%20%E4%B9%8B%E9%97%B4%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F.png)
我正在尝试调查在 Ubuntu 服务器上监听 IPv6 套接字的情况。我不明白 [::] 和 * 之间的区别。
我想到两个问题:
- 有啥区别吗?
- 如果不是,为什么它们会出现在多个表现形式中?
$ ss --listening --tcp --ipv6
State Recv-Q Send-Q Local Addr:Port Peer Addr:Port
LISTEN 0 128 *:http *:*
LISTEN 0 128 *:8083 *:*
LISTEN 0 128 [::]:ssh [::]:*
LISTEN 0 128 *:19998 *:*
LISTEN 0 128 *:19999 *:*
答案1
*
并分别[::]
指示在套接字创建期间IPV6_V6ONLY
标志是否设置为false
或。true
例子:
$ socat UDP6-LISTEN:1234,ipv6only=0 - &
$ socat UDP6-LISTEN:4321,ipv6only=1 - &
$ ss -l -6 -e
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 *:1234 *:* uid:1000 ino:3003972 sk:1 v6only:0 <->
udp UNCONN 0 0 [::]:4321 [::]:* uid:1000 ino:3004007 sk:2 v6only:1 <->
但是,这种表示是ss
特定行为。netstat
和 的旧版本ss
将这两种情况表示为[::]
。 的来源相关段落ss
可以找到这里。
该标志的用途在手册页中描述ipv6
:
IPV6_V6ONLY(自 Linux 2.4.21 和 2.6 起)
如果此标志设置为 true(非零),则套接字将仅限于发送和接收 IPv6 数据包。在这种情况下,IPv4 和 IPv6 应用程序可以同时绑定到单个端口。
如果此标志设置为 false(零),则套接字可用于向 IPv6 地址或 IPv4 映射的 IPv6 地址发送数据包和从 IPv6 地址接收数据包。
该参数是指向整数布尔值的指针。
此标志的默认值由文件的内容定义/proc/sys/net/ipv6/bindv6only。该文件的默认值为 0(假)。