有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java PHP应用程序计算或从IPv4获取IPv6(如果可用)

我提出了一个用java创建“类似p2p”网络的解决方案。 我使用Web服务器作为连接的桥梁。每个客户端都有一个java服务器和一个java客户端,它们能够通过php服务器上的ip数据库进行通信。我的问题是,它只适用于IPv6,我知道并非所有用户都有IPv6地址。是否可以从v4计算IPv6地址,并将其存储在我的数据库中,以便其他客户端在其上连接,即使它们从NAT路由器后面连接

经过长时间的研究,我现在也可以处理ipv6地址了,但我发现每次我连接到路由器时,我的ipv6地址都会改变?!前4个块始终相同,但我的ipv6的最后4个块正在变化。我想我在寻找正确的方法,还是不可能?如果这是不可能的(我不这么认为),怎么办


共 (1) 个答案

  1. # 1 楼答案

    你的问题缺乏背景知识。所以不清楚你到底想要什么。不过,根据我对你问题的理解,我有三点建议

    您有一个可以通过IPv4和IPv6访问的服务器,客户端连接到该服务器。您想告诉客户端彼此的IPv6地址。但对于通过IPv4连接的客户端,很可能客户端没有IPv6地址。同时具有IPv4和IPv6的用户应使用IPv6连接到您的服务器

    在这种情况下,如果协议只允许通信IPv6地址,但您必须给出的关于对等方的唯一IP地址是IPv4地址,那么您可以简单地使用::ffff:0:0/96前缀。如果一个客户端的IPv4地址是192.0.2.3,那么您可以告诉另一个客户端该地址是::ffff:192.0.2.3。当另一个客户端尝试连接到::ffff:192.0.2.3时,它实际上会与该IP地址建立IPv4连接

    当然,这仍然不能解决NAT引入的问题

    可能是使用IPv4连接到服务器的客户端这样做是因为它没有本机IPv6地址,但它可能仍然有一个自动隧道。例如,如果某些系统具有公共IPv4地址但没有IPv6地址,则会自动分配6to4地址。如果IPv4地址为192.0.2.3,则生成6to4地址的常用方法几乎类似于2002:192.0.2.3::192.0.2.3(这不是完全有效的表示法,因为只允许在最后32位将IPv4地址嵌入IPv6地址表示法。有效的表示法为2002:c000:203::192.0.2.3

    但这种从IPv4地址派生主机IPv6地址的方法只适用于具有公共IPv4地址的主机。并不是所有的主机都会自动配置6to4,所以它在大多数情况下都不起作用

    如果您有一个只支持IPv6的应用程序,并且希望通过在应用程序中直接嵌入隧道来添加对没有本机IPv6地址的客户端的支持,那么我认为Teredo是最合适的协议。Teredo的优点是,它通过UDP上的IPv6隧道工作,因此它可以嵌入到应用程序中,而无需特殊权限。大多数操作系统允许任何应用程序打开UDP端口

    如果您的应用程序通常会在客户端之间通过IPv6发送UDP数据包,那么通过将UDPv6数据包嵌入Teredo数据包来构造Teredo数据包是非常简单的。您只需要在两个固定大小的标题前面加上前缀,然后计算校验和。如果您的客户端通常使用TCP over IPv6进行通信,那么这种方法就变得更加困难。通过绑定到UDP端口并在此端口上使用您自己的Teredo实现,您就不会在操作系统中使用TCP实现,因此您的应用程序必须包含自己的TCP实现。我建议你设计一个不需要这样做的设计

    假设您的应用程序绑定到UDP端口,并且只要发送方和接收方都具有本机IPv6,您只需在它们之间发送UDP数据包,那么这种方法对于其他情况意味着什么

    您的应用程序必须在三种不同模式之一下运行:

    • 仅限IPv6。由具有本机IPv6地址但没有公共IPv4地址的实例使用。它将假设整个世界都是IPv6,并依赖第三方Teredo中继与没有IPv6地址的客户端进行通信
    • 特雷多中继模式。由具有本机IPv6地址和公共IPv4地址的实例使用。因为这些实例具有公共IPv4地址,所以没有本机IPv6的客户端可以访问它们的UDP端口。这避免了对第三方Teredo继电器的依赖
    • Teredo客户端模式。由没有本机IPv6地址的实例使用

    在单独的NAT网关后面的两个仅IPv4主机之间的任何直接通信都必须依赖某种形式的NAT穿孔。特莱多允许很多人要使用不同种类的NAT打孔,因此,如果您的应用程序中需要NAT打孔,您最好使用Teredo协议,因为它同时提供了一些IPv6转换机制

    我希望我能简单地指向一个做上述所有工作的库,但不幸的是,我不知道有一个