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


23

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

在此处输入图片说明

我注意到在“ 外部地址”列中,UDP显示*:*而不是0.0.0.0:0,这两个值代表同一件事吗?如果是这样,那么为什么UDP显示*:*而不是0.0.0.0:0


我相信*:*是IPv6,而0.0.0.0:0IPv4是。
LPChip '16

我还注意到以下几点:UDP 0.0.0.0:5355 *:*,这是否意味着可以在IPv4和IPv6之间发送数据?
user612473 '16


4
相当于0.0.0.0的IPv6为[::]
marsh-wiggle's

2
@LPChip您弄错了。*:*什么也没说IP版本。但是,由于该套接字的本地地址仅是IPv4,因此远程地址也必须是IPv4。
kasperd '16

Answers:


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,但*:*将匹配。

对于没有执行路由的任何设备来说,这种差异并没有真正意义,但是当需要选择到聚合地址空间的最佳路由时,通配符表示法可以更灵活地选择目标网络。


5
但是您在回答中写道,*:* refers to ANY IPv6 address 这里所说的any..address大概是IPv4或IPv6。那是什么呢?是*:*将自身限制为IPv6,还是也允许IPv4?
barlop '16

2
问题中提到的两个套接字都是仅IPv4的。您可以从分配给每个套接字的本地地址中看到。因此,提及IPv6与该问题无关。
kasperd '16

7
IPv6与这个问题根本无关。
hobbs's

8
对于提出的问题,这个答案是完全错误的。
布拉德

3
正如 kasperd的注释(以及hobbs的注释)所指出的那样,IPv6与该问题无关。问题是关于我们在“外部地址”列中看到的内容,它对应于“本地地址”列中相同行的内容,即IPv4。(尽管在某些操作系统中,侦听一个地址族/ IP版本通常可能会自动侦听另一个地址族。)
TOOGAM

15

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

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

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

UDP,因为它是无连接的,所以显示外部地址没有任何意义。

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

IPV4 "*:*"IPV6 "[::]:*"


我只是对一些朋友说。您可以显示正在监听的PORTS,但是在没有端口的情况下显示实际的远程会话,这很可能是因为它显示为*:*不存在的远程UDP会话的原因。我在这里同意你的看法。
NotAdmin Dave

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


+1为第四段的开头。0.0.0.0有一些文档:全零的地址是“未指定”地址(根据IPv6寻址RFC 4291 sec 2.5.2的规定),通常应用于未知地址。 RFC 1700第4页提到“只能用作源地址”,而RFC 1122#page-29节“ a”进一步描述用法。(我对:::的回答为提及0.0.0.0)
TOOGAM

外部地址”列中的0.0.0.0:0值是否表示任何IP地址和端口号都可以将数据发送到此套接字?如果该值是例如,那么这意味着只有具有端口号的IP地址才能将数据发送到此套接字,而没有其他人可以发送?127.0.0.0:12345127.0.0.012345
汤姆

6

区别仅仅是符号上的。

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

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

从我很久以前听说过的IIRC中,我认为可以显示UDP配对,但是通常不会,因为它们在完成时会被拆除,并且UDP连接通常很短,持续毫秒或更短。不过,我本人从未见过,所以可能不正确。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.