![如何知道服务器应用程序是否正在监听 ipv6](https://linux22.com/image/720299/%E5%A6%82%E4%BD%95%E7%9F%A5%E9%81%93%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%98%AF%E5%90%A6%E6%AD%A3%E5%9C%A8%E7%9B%91%E5%90%AC%20ipv6.png)
我在 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 套接字。
然后,您会看到:::14152
which 清楚地显示了 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 不同。
请参阅以下文章:
根据该输出,无法保证 IPv4 也能如此。最终,您需要测试所有用例。