在将套接字绑定到 IPv6 地址时,[::] 和 * 之间有什么区别?

在将套接字绑定到 IPv6 地址时,[::] 和 * 之间有什么区别?

我正在尝试调查在 Ubuntu 服务器上监听 IPv6 套接字的情况。我不明白 [::] 和 * 之间的区别。

我想到两个问题:

  1. 有啥区别吗?
  2. 如果不是,为什么它们会出现在多个表现形式中?
$ 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(假)。

相关内容