我正在尝试调查在 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(假)。