我对跟随netstat输出感到困惑。有两种本地端口。
第一种是:

[::] 8100

第二种是:

[ :: 1] 8100

我知道[:: 1]是IPv6的环回地址。我的问题是:

[::]是什么意思?

谢谢您的帮助。

评论

请注意:端口号之前缺少一个冒号,即[::]:8100,而不是[::] 8100。我不能更改它,因为它只能插入两个字符。

有什么答案对您有帮助吗?如果是这样,您应该接受答案,这样问题就不会永远弹出来寻找答案。或者,您可以发布并接受自己的答案。

#1 楼

::是未指定的地址(0:0:0:0:0:0:0:0),仅在数据包中用作主机的源地址,该主机尚无地址,并且正在尝试获取分配的地址。在输出中看到的内容表示该进程已绑定主机中所有目标地址的端口8100。主人。您所看到的意味着进程绑定到回送地址上的端口::1,这意味着发送到该端口上的回送地址的任何内容都将进入该进程。

这两个地址都不能被视为目的地该地址位于主机外部网络上,并且未指定的地址只能用作尚未分配地址但正在寻找地址的主机的源地址。环回地址绝对不能用作主机外部网络上的源地址。

RFC 4219,IP版本6寻址体系结构在2.2节中说明了如何压缩这两个地址。地址的文本表示形式:





由于某些分配某些样式的IPv6地址的方法,
通常,地址包含长零
位的字符串。为了使写入包含零位的地址更容易
,可以使用一种特殊的语法来压缩零。 “ ::”的use
表示一个或多个16位零的组。 “ ::”
在一个地址中只能出现一次。 “ ::”还可以用于
压缩地址中的前导或尾随零。

例如,以下地址

     2001:DB8:0:0:8:800:200C:417A   a unicast address
     FF01:0:0:0:0:0:0:101           a multicast address
     0:0:0:0:0:0:0:1                the loopback address
     0:0:0:0:0:0:0:0                the unspecified address


可以表示为

     2001:DB8::8:800:200C:417A      a unicast address
     FF01::101                      a multicast address
     ::1                            the loopback address
     ::                             the unspecified address





它进一步解释了未指定的地址和环回地址:


2.5.2。未指定地址

地址0:0:0:0:0:0:0:0称为未指定地址。它必须
绝不能分配给任何节点。它表示没有
地址。其用法的一个示例是在初始化主机了解其自己的地址之前,它在初始化主机发送的任何IPv6数据包的“源地址”字段中。

用作
IPv6数据包的目标地址或在IPv6路由标头中。源地址未指定的IPv6数据包绝不能由IPv6路由器转发。

2.5.3。回送地址

单播地址0:0:0:0:0:0:0:0:1称为回送地址。节点可以使用它
向自己发送IPv6数据包。不能
分配给任何物理接口。它被视为具有
Link-Local范围,并且可以被视为虚构的虚拟接口(通常称为“ loopback
接口”)的Link-Local单播地址。链接不通。

不能将环回地址用作在单个节点外部发送的IPv6
数据包中的源地址。具有回送目标地址的IPv6数据包绝不能在单个
节点之外发送,并且绝不能由IPv6路由器转发。必须丢弃在具有环回目标地址的接口上收到的数据包



评论


如果我正确理解“未指定地址”的用法,则主要用于DHCP和端口绑定。大多数服务器进程都允许绑定到给定的端口,例如在IPv4 0.0.0.0:80中,在这种情况下,全零IP意味着“绑定到所有接口”,这意味着该端口对于连接到系统的多个接口都是可见的。

– Mikko Rantalainen
20年8月11日在14:10

#2 楼

“ ::”是ipv6“未指定的地址”(等效的IPv4地址为“ 0.0.0.0”)。绑定套接字*时,用于指示套接字将侦听所有本地IPv6地址。根据操作系统和套接字选项的不同,套接字还可以侦听本地IPv4地址。
“ :: 1”是ipv6“回送地址”(等效的IPv4地址为“ 127.0.0.1”)。
因此,当您在netstat输出的“本地地址”列中看到“ ::”时,表示套接字*正在侦听系统具有的所有IPv6接口,也可能正在侦听系统具有的所有本地IPv4接口。当您看到“ :: 1”时,表示它仅侦听本地环回,因此只能从本地系统进行访问。
这些地址都不应该作为正常通信的源地址或目标地址出现。特别禁止将“ :: 1”显示为源或目标。禁止将“ ::”显示为目的地。它可以作为源出现在地址分配协议中。具体来说,它在“重复地址检测”过程中使用。
*在Berkeley套接字这个术语的意义上。

评论


+1用于与IPv4比较。但是,我会提一下,IPv4中的环回是一个完整的/ 8网络,即127.0.0.0/8,其中包括众所周知的地址127.0.0.1,而在IPv6中它只是单个地址:: 1。

–杜布
20-2-5在9:59

#3 楼

使用IPv6,::可扩展到所需的:0:字数(:0000:的缩写)来填充128位地址。 ::在一个地址中只能使用一次,并且必须明确。

使用netstat时,尾随的:abcd指的是传输层端口号,因此tcp6 ::1:80表示::1回送上的TCP端口80。 tcp6 :::80是到所有本地IP地址的通用绑定(未指定地址)。

评论


但是,全零地址([::])是什么?

–ilkkachu
20-2-4在22:30



@ilkkachu表示“任何地址”。

–克莱里斯-谨慎乐观-
20年5月5日,0:07

#4 楼

[::]是未指定的地址。如果程序不想绑定到特定地址而是任何地址,则可以绑定到该地址。

netinet / in.h中的声明是

extern const struct in6_addr in6addr_any;        /* :: */ 


如果您有兴趣,可以使用C套接字API创建小型测试程序。绑定到in6addr_any和[:: 1]或任何其他指定地址之间交替。您将能够复制观察到的结果。