0.0.0.0:0 和 *:* 代表同一个东西吗?

use*_*473 23 networking windows netstat

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

在此处输入图片说明

我注意到在“外部地址”列中,UDP 显示*:*而不是0.0.0.0:0,这两个值是否表示相同的内容?如果是这样,那么为什么 UDP 显示*:*而不是0.0.0.0:0

Luk*_*ton 15

/指子网网络掩码,这是IP层的一部分。

:指端口是传输层的一部分。

对于 TCP,连接的远程端是有意义的。

UDP,由于它是无连接的,因此显示外部地址没有任何意义。

我的直觉是它总是会显示 UDP 的通配符,并且它可能使解析输出更加友好,或者显示您是否使用 IPv4/6:

IPV4 "*:*" 对比 IPV6 "[::]:*"


Fra*_*mas 12

有人指出我的回答是错误的。由于我无法删除它,我将改为提供正确的。

该表达式的*:*意思是“任何地址,任何端口”。所有 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,但*:*会。

这种差异对于任何不执行路由的设备都没有真正意义,但是当需要选择到聚合地址空间的最佳路由时,通配符符号允许更灵活地选择目标网络。

  • 对于提出的问题,这个答案是完全错误的。 (8认同)
  • IPv6 与这个问题根本无关。 (7认同)
  • 但是你在你的回答中写道,`*:* 指的是任何 IPv6 地址`这里你说的是 `any..address`,大概是 IPv4 或 IPv6。那么它是哪个?`*:*` 是将自身限制为 IPv6,还是也允许 IPv4? (5认同)
  • 正如 [kasperd 的评论](http://superuser.com/questions/1095793/does-0-0-0-00-and-represent-the-same-thing#comment-1554219) 注释(和 [hobbs 的评论]( http://superuser.com/questions/1095793/does-0-0-0-00-and-represent-the-same-thing#comment-1554377) 也是),IPv6 与问题无关。问题是关于我们在外部地址列中看到的内容,它对应于本地地址列中相同行中的内容,即 IPv4。(尽管对于某些操作系统,侦听一个地址系列/IP 版本通常可能会自动侦听另一个地址系列。) (3认同)
  • 问题中提到的两个套接字都是 IPv4-only。您可以从分配给每个套接字的本地地址中看到这一点。因此,提及 IPv6 与该问题无关。 (2认同)

Net*_*ama 6

区别只是符号上的。

Windows 中的 Netstat0.0.0.0:0用于表示本地 IPv4 TCP 侦听器和*:*UDP 侦听器的“任何远程地址和端口”的抽象概念。对于 IPv6,远程地址由[::]:0TCP 和*:*UDP 表示。

在 OS X 中,*.*用于 TCP 和 UDP,无论是 IPv4 还是 IPv6(注意 OS X 使用点分隔地址和端口)。Linux0.0.0.0:*用于 IPv4 和:::*IPv6,前两个冒号代表所有 IPv6 地址的缩写,第三个冒号是地址和端口之间的分隔符。

IIRC 从我很久以前听到或读到的东西中,我认为 UDP 配对可以出现,但通常不会出现,因为它们在完成时被拆除,并且 UDP 连接通常非常短,持续毫秒或更短。不过,我自己从未见过这个,所以它可能是不正确的。


hob*_*bbs 6

在这两种情况下,信息基本上没有意义,但或多或​​少地表明相同的事情。

您的第一行是 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 的“对任何东西开放”之间进行语义区分,但同样可能这两位代码是由两个不同的人编写的,没有特别关注一致性。