该netstat -a
命令列出的信息如下:
tcp 0 0 :::30179 :::* LISTEN
tcp 0 0 :::www :::* LISTEN
tcp 0 0 :::10001 :::* LISTEN
tcp 0 0 :::telnet :::* LISTEN
这是什么意思?我试图找出答案,但找不到。
答案1
这些套接字正在监听 IPv6 未指定的地址,即::
。这是 的缩写0000:0000:0000:0000:0000:0000:0000:0000
(多个 0 块可能被压缩成::
,请参阅RFC 5952)。这类似于 IPv4 未指定地址0.0.0.0
。这意味着服务正在监听主机的所有地址。
通常,监听 IPv6 套接字意味着该套接字仅接受来自 IPv6 客户端的传入连接,并且软件需要打开第二个套接字来监听 IPv4 客户端。
但是有一种特殊情况:监听 IPv6 未指定的地址并将标志IPV6_V6ONLY
设置为 0(false)。在许多系统(包括 Linux)上,这是默认设置。在这种情况下,套接字将在单个套接字上同时接受 IPv4 和 IPv6 客户端。此功能使软件开发人员更容易支持 IPv6:他们可以编写仅使用单个套接字监听两种协议的软件。
这样做的缺点是,很难看出哪些套接字监听两种协议,哪些套接字只监听 IPv6。IPv6:
地址中使用的 也容易让人混淆,并且 也是地址和端口之间的分隔符。这样你就得到了令人困惑的:::
部分。
基于 BSD 的系统倾向于以不同的方式显示相同的信息。您的示例将显示为例如:
tcp46 0 0 *.30179 *.* LISTEN
tcp46 0 0 *.www *.* LISTEN
tcp46 0 0 *.10001 *.* LISTEN
tcp46 0 0 *.telnet *.* LISTEN
对 IPv4 和 IPv6 使用两个独立套接字的服务器显示如下:
tcp4 0 0 *.ssh *.* LISTEN
tcp6 0 0 *.ssh *.* LISTEN
和
udp4 0 0 *.ntp *.*
udp6 0 0 *.ntp *.*
我个人喜欢它明确显示正在监听哪些协议(即tcp4
// tcp6
)tcp46
并使用*
未指定地址的字符。
我刚刚注意到最近的 Ubuntu 版本使用这种符号:
tcp 0 0 *:ssh *:* LISTEN
tcp6 0 0 [::]:ssh [::]:* LISTEN
tcp6 0 0 [::]:https [::]:* LISTEN
这已经清楚多了。遗憾的是,它没有显示仅侦听 IPv6 的套接字(如套接字ssh
)与侦听 IPv4 和 IPv6 的套接字(如套接字https
)之间的区别。