答案1
有人指出我的回答有误。由于我无法删除它,因此我将提供正确的答案。
该表达式的*:*
意思是“任何地址,任何端口”。所有 UDP 侦听器都将显示此签名。这是由于 UDP 的无连接特性。
原始(错误)答案。是和否。*:*
指的是任何 IPv6 地址。在 IPv4 中,未知/未指定地址之间的区别很模糊,因此我们使用 0.0.0.0/0 来表示网络上的任何主机,但在 IPv6 中存在细微的差别。
然而大多数情况下,人们用::
它来表示连续的 0 字符串。
在 IPv6 地址中,任何连续的零序列都可以替换为::
:
0.0.0.0/0
=> 0000:0000:0000:0000:0000:0000:0000:0000 =>::
=>*:*
fe80:0000:0000:0000:2000:0aff:fea7:0f7c
=>fe80::2000:0aff:fea7:0f7c
但是,使用通配符的表示允许更精细地控制地址模式。例如,::
不会匹配fe80::2000:0aff:fea7:0f7c
,但*:*
会。
对于任何未执行路由的设备来说,这种差异实际上并没有意义,但在选择聚合地址空间的最佳路由时,通配符表示法允许更灵活地选择目标网络。
答案2
指/
的是子网掩码,它是 IP 层的一部分。
指:
的是属于传输层的端口。
对于 TCP 来说,连接有一个远程端是有意义的。
UDP,因为它是无连接的,所以显示外部地址没有任何意义。
我的直觉是,它总是会显示 UDP 的通配符,并且它可能会使解析输出更加友好,或者显示您是否正在使用 IPv4/6:
IPV4 "*:*"
对比IPV6 "[::]:*"
答案3
这两种情况下的信息基本上毫无意义,但或多或少表明的是同一件事。
第一行是 TCP 侦听套接字。本地地址列表示它接受连接的地址和端口,而远程地址列没有任何意义,因为侦听套接字还没有连接的远程端。连接的TCP 套接字会在该列中显示连接另一端的地址,但对于监听套接字,它决定显示全零的地址和端口。
第二行是 UDP 套接字。UDP 是一种无连接协议,这意味着它在发送和接收数据包时,不知道谁连接到谁,数据包是否是现有对话的一部分,或者数据是否突然到达。本地地址列的含义与 TCP 相同,而远程地址列毫无意义,因为 UDP 套接字可能随时有一个对等点、多个对等点或没有对等点。(实际上,POSIX 有“连接的 UDP 套接字”的概念,但这有点离题了)。
现在的问题是:为什么它们的显示不同?这似乎只是 Windows netstat 代码的一个怪癖。Linux(net-tools)netstat 显示0.0.0.0:*
TCP 侦听套接字和 UDP 套接字(对于 IPv4;它显示 IPv6)的远程端:::*
,这与 Windows 上的两个示例不同,但至少在同一个程序中是一致的。也许 Windows 想要在 TCP 的情况下“稍后填写”和 UDP 的情况下“对任何内容开放”之间进行语义区分,但同样可能的是,这两段代码是由两个不同的人编写的,他们并不特别关心一致性。
答案4
差异仅仅是符号上的。
Windows 中的 Netstat 用于0.0.0.0:0
表示本地 IPv4 TCP 侦听器和 UDP 侦听器“任何远程地址和端口”的抽象概念。对于 IPv6, TCP 和UDP 的*:*
远程地址分别用 和 表示。[::]:0
*:*
在 OS X 中,*.*
用于 TCP 和 UDP,无论是 IPv4 还是 IPv6(请注意,OS X 使用点来分隔地址和端口)。Linux 使用用于0.0.0.0:*
IPv4 和:::*
IPv6,前两个冒号代表所有 IPv6 地址的缩写,第三个冒号代表地址和端口之间的分隔符。
据我很久以前听到或读到的一些东西,我认为 UDP 配对能出现,但通常不会出现,因为它们在完成时就会被拆除,而且 UDP 连接通常很短,持续时间只有几毫秒甚至更短。不过,我自己从未见过这种情况,所以这可能是不正确的。