Nat Traversal,同事无法沟通

我目前正在做一个需要穿越NAT的项目,但我似乎遇到了困难。 我有以下设置运行testing:

  • R1,Verizon Fios路由器连接到互联网。
  • R2,Belkin路由器通过以太网连接到它的WAN口到R1的交换机。
  • 我介绍服务器,通过以太网连接到R1。 R1转发端口6666到我。
  • A和B,运行客户端软件的计算机通过Wifi连接到R2。

介绍服务器和客户端说明:

当A和B启动客户端时,客户端在端口6666上向外部地址R1(72.82.59.10)发送一个“HelloPacket”。

接收到一个HelloPacket后,服务器首先检查是否已经看到源地址和源端口标识符。

  • 如果不是,则首先将它的对端标识符表(source ip / port)中的每个条目发送给它从其接收到HelloPacket的对等端,然后将其作为新条目存储在其对等表中。
  • 如果有,则重置对等端超时,以便它知道继续将这个对等标识符发送给将来连接的对等端。

在客户端最初将HelloPacket发送到Intro服务器后,如果有已经将自己引入到服务器的对等端,则可以期望从服务器接收名为IntroPackets的数据包。 这些IntroPackets包含对等体的外部和内部IP /端口。

既然对等方知道现有的对等体,那么新连接的对等体就有责任将HelloPacket发送给现有的对等体,让他们知道它的存在。 这是我有麻烦的地方。

我没有足够的声望发布图像,但这里是我在设置的颜色的图表: http : //i.stack.imgur.com/7E5I8.png

这里是事件的顺序和我遇到的问题:

  1. 介绍服务器启动并侦听types为“HelloPacket”的UDP数据包
  2. Peer A启动它的客户端,然后将HelloPacket发送到地址/端口上的Intro服务器: 72.82.59.10,6666
  3. 介绍服务器接收到HelloPacket,并向其表中添加一个条目,并且不会将任何IntroPackets发送给对等体A,因为表中没有其他对等体。 表A中的条目类似于以下对于A: IP:72.82.59.10,端口:1024
  4. Peer B启动它的客户端,然后将HelloPacket发送到介绍服务器。
  5. 介绍服务器接收HelloPacket并向其表中添加条目。 介绍服务器然后发送一个IntroPacket到包含对等体A的地址和端口的新连接的对等体。 介绍服务器的表在这一点上看起来如下所示:

同侪A:72.82.59.10,1024

对等B:72.82.59.10,1025

  1. 对等体B接收到IntroPacket,然后尝试向对等体A发送一个hello分组。

第6步是我的devise失败的地方。 Peer A永远不会收到来自Peer B的HelloPacket。据我了解,当路由器收到一个目标端口为1024的数据包时,它将使用它的NAT映射到内部地址和端口。 它是否正确?

我试过运行一个外部程序,只是发送数据报到外部地址和端口映射到客户端A,但这些似乎并没有通过,所以我不认为这是一个超时问题。

我也知道我应该尝试连接到内部地址和端口,看看客户端是否在同一个NAT后面,并计划在未来实现这一点。

而且,在客户端和服务器代码中都使用Go-Back-N可靠地完成所有通信。

问题:

  1. 我可以忽略在我的devise中至关重要的东西,或者仅仅是不能简单地理解UDP穿越NAT?
  2. 对等体A能够从服务器接收一个数据包而不是对等体B的原因是什么? (由于对等方能够从服务器接收数据包)
  3. NAT是否考虑到源地址?

任何input是非常感谢! 谢谢!