我们正在开发一个 P2P 应用程序,并且停留在位于同一本地 LAN 但两个不同子网的两个对等体之间进行通信的部分。
我们知道,由于某些路由器的设置,同一局域网中的两台特定 PC 确实“无法连接”的情况很多。我们试图弄清楚这种情况并找出我们能做的最好的事情。(凭借我们有限的网络知识和您的帮助)
考虑一个结构如下图所示的 LAN。假设该 LAN 是由我们的客户设计的,我们对此一无所知。我们只是从安装了我们程序的 PC 的角度观察 LAN。因此,我们所知道的只是我们的本地 IP/子网掩码和整个 LAN 的公共 IP。(其余部分未知,显示为云)
我们有几个问题,非常希望得到答案:
假设当 PC1 多播一个数据包并且该数据包以某种方式到达 PC2 时。PC2 将看到数据包发送者的哪个 IP 地址:PC1 的本地 IP(如图 192.168.1.111 所示)还是 Router_A_1 或 Router_A 的外部 IP?
在 #1 之后,如果 PC2 使用另一个数据包(单播)回复到 PC2 在 #1 中看到的 IP,那么该数据包会到达 PC1 吗?
在 #2 的全局情况下,PC1 和 PC2 用来向对方发送数据包的合适 IP 地址是什么?(或者它与我们在 Internet 上在 NAT 路由器后面使用 2 台 PC 所做的相同:upnp、打洞或中间超级节点?)
PC1 和 PC2 是否分配了相同的 IP 地址?如果是,则:
- a. 这是一个“合法”案件吗?
- b. PC2 在 #1 中看到并对 #2 做出回答的发送方 IP 又如何呢?
更新附加问题:
- 如果 1 个对等端进行多播并且数据包可以到达另一个对等端,那么 2 台 PC 就是“可单播的” - 如果多播数据包无法到达另一个对等端,那么 2 台 PC 就注定要失败?对于“可单播 --> 可多播”来说,这是真的吗?
答案1
我写过一些点对点应用程序,我可以告诉你,点对点的可达性是这类应用程序的主要问题。以下是几点提示:
如果您使用 TCP,您唯一的希望就是 UPnP。但是,您不能假设它始终可用。事实上,UPnP (a) 主要由家庭网络路由器支持 (b) 它经常被禁用,因为人们认为它没有什么价值,所以对它的支持相当零散。如果您的客户端位于两层路由器后面,每层路由器都执行自己的 NAT,那么您的机会就更小了。但是,如果您可以告诉您的客户启用 UPnP 或将 UPnP 指定为您的应用程序的先决条件,那么这是一种可行的方法。
另一种选择是使用 UDP 并在路由器上打一个针孔,但您需要外部代理来跟踪对等地址并将主机身份与全局可访问的 IP 地址相匹配(在您的情况下,它可能会部署在“未知”中)。请注意,UDP 针孔的 TTL 通常很短(据我估计,它在 20 秒到 5 分钟之间),因此您需要经常 ping 您的代理。UDP 的另一个问题是,如果您的应用程序交换的数据位大于 1 个数据包,您可能需要实现自己的流控制协议。
希望这可以帮助。
答案2
您的网络拓扑在最好的情况下是不可靠且难以维护的。
考虑一下(假设 /24 子网):PC1(192.168.1.111)尝试向 PC2(192.168.1.22)发送数据包。为什么 Router_A_1(甚至 Router_A)应该通过“未知”云将该数据包转发到另一个子网?就“A”路由器而言,数据包已经位于其所属的子网中。破解路由器中的某些路由表以转发特定地址并非不可能 - 但您会发现这就是“不可靠和困难”部分的来源(甚至可能不切实际,具体取决于“未知”云中的内容)。
有什么原因导致您不能简单地为“B”路由器子网分配不同的 /24?例如 192.168.2.0/24?
答案3
您没有说但是……
如果您使用的是传统的 24 位子网掩码(即两个网络都是 192.168.1.0/24),那么这些机器将永远无法通信,因为根据定义,它们将尝试通过广播来解析 MAC 地址,而不是转到网关进行路由,因为它会假定机器在本地网络上。
您可以通过为 PC1 分配不同网络中的地址来解决这个问题。SO
PC1=192.168.2.111
在这种情况下,只要中间路由器具有正确的路由表条目并允许多播并允许您尝试的任何端口/协议,它就可以工作。