0.0.0.0:0 和 *:* 代表同一件事吗?

0.0.0.0:0 和 *:* 代表同一件事吗?

我使用 netstat(在 Windows 中)查看 TCP 和 UDP 的监听端口:

在此处输入图片描述

我注意到国外地址列中,UDP 显示*:*而不是0.0.0.0:0,这两个值代表同一个东西吗?如果是,那么为什么 UDP 显示*:*而不是0.0.0.0:0

答案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 连接通常很短,持续时间只有几毫秒甚至更短。不过,我自己从未见过这种情况,所以这可能是不正确的。

相关内容