如何知道服务器应用程序是否正在监听 ipv6

如何知道服务器应用程序是否正在监听 ipv6

我在 VPS(webfaction)中打开了端口 14152,并且正在运行一个正在监听该端口上的连接的应用程序,以下是输出netstat -putan | grep 14152

udp6       0      0 :::14152         :::*        79238/./server.x86_

那么这个 server.86 (.net 代码) 是否正在监听 0.0.0.0:14152?在 ipv6 端口类型 udp 上?我不确定如何确认。

如果我有一个客户端应用程序尝试连接到此端口,它可以与 ipv4 一起使用吗?还是必须是 ipv6?

我找不到任何可以配置 webfaction 来通过 ipv4 进行监听的东西,这很奇怪。

答案1

那么这个 server.86 (.net 代码) 是否正在监听 0.0.0.0:14152 ?

如果您提供了该命令的完整输出,则不需要。如果过于技术化,则需要两次。

首先,从技术角度来说,UDP 没有“监听”系统调用,因此 UDP 永远不会监听,它只会接收。但是您可能是从更一般的意义上问的,因此...

其次,您提供的输出中有两条信息表明这是一个 IPv6 套接字。udp6行首的 表示这是 IPv6 UDP 套接字,而不是 IPv4 UDP 套接字。

IPv4 和 IPv6 之间的 UDP 是否不同?没有。那么为什么会有差异呢?套接字与 L3 和 L4 寻址相关联;这只是帮助用户在查看输出(或使用 sort、grep 等)时更容易区分 IPv4 和 IPv6 套接字。

然后,您会看到:::14152which 清楚地显示了 IPv6 地址。为什么会这样?好吧,对于 IPv4 和 IPv6,尾部都:<port>表示套接字的端口部分,删除套接字的此部分将保留 IP 地址。在这种情况下,您得到的::是全零的“未定义”IPv6 地址。

如果您不熟悉 IPv6 寻址,可以使用几条规则使其尽可能更易于阅读。这里使用的规则称为“零压缩”,允许使用“::”来表示“一组或多组 16 位零”(RFC 5952- 尽管第 4.2.2 节进一步规定它只应适用于多个组)。因此,正如::输出中所示,地址是全零的地址。

在 ipv6 端口类型为 udp?

确切地。

如果我有一个客户端应用程序尝试连接到此端口,它可以与 ipv4 一起使用吗?还是必须是 ipv6?

同样,如果您提供的输出完整,则没有 0.0.0.0:14152 的套接字。因此没有设置任何内容来在端口 14152 上接收 IPv4 UDP。所以不,IPv4 不应该工作。唯一可能工作的方式是,如果在某处进行某种 6 到 4 转换(即 NAT-PT/NAT64),将 IPv4 流量转换为 IPv6 流量。

答案2

使用 udp 正确编写的 IPv6 客户端将能够与您的服务器交互(如果没有数据包丢失),该服务器正在“监听”该端口。但这不是 listen() 调用。它与 tcp 不同。

请参阅以下文章:

https://stackoverflow.com/questions/8194323/why-the-listen-function-call-is-not-needed-when-use-udp-socket

https://unix.stackexchange.com/questions/228506/how-to-verify-a-service-is-listening-on-both-ipv4-and-ipv6

根据该输出,无法保证 IPv4 也能如此。最终,您需要测试所有用例。

相关内容