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
,但*:*
会。
这种差异对于任何不执行路由的设备都没有真正意义,但是当需要选择到聚合地址空间的最佳路由时,通配符符号允许更灵活地选择目标网络。
区别只是符号上的。
Windows 中的 Netstat0.0.0.0:0
用于表示本地 IPv4 TCP 侦听器和*:*
UDP 侦听器的“任何远程地址和端口”的抽象概念。对于 IPv6,远程地址由[::]:0
TCP 和*:*
UDP 表示。
在 OS X 中,*.*
用于 TCP 和 UDP,无论是 IPv4 还是 IPv6(注意 OS X 使用点分隔地址和端口)。Linux0.0.0.0:*
用于 IPv4 和:::*
IPv6,前两个冒号代表所有 IPv6 地址的缩写,第三个冒号是地址和端口之间的分隔符。
IIRC 从我很久以前听到或读到的东西中,我认为 UDP 配对可以出现,但通常不会出现,因为它们在完成时被拆除,并且 UDP 连接通常非常短,持续毫秒或更短。不过,我自己从未见过这个,所以它可能是不正确的。
在这两种情况下,信息基本上没有意义,但或多或少地表明相同的事情。
您的第一行是 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 的“对任何东西开放”之间进行语义区分,但同样可能这两位代码是由两个不同的人编写的,没有特别关注一致性。