Nat Traversal,对等体无法通信

Nat Traversal,对等体无法通信

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

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

介绍服务器和客户端描述:

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

当收到 HelloPacket 时,服务器首先检查之前是否见过源地址和源端口标识符。

  • 如果没有,它首先将其对等标识符(源 IP/端口)表中的每个条目发送到它从其接收 HelloPacket 的对等体,然后将其作为新条目存储在其对等表中。
  • 如果已经连接,那么它会重置对等点的超时时间,以便它知道继续将此对等点标识符发送给将来连接的对等点。

客户端最初将 HelloPacket 发送到 Intro 服务器后,如果已有对等方向服务器自我介绍,则客户端可以预期会从服务器接收名为 IntroPackets 的数据包。这些 IntroPackets 包含对等方的外部和内部 IP/端口。

现在对等体知道了现有的对等体,新连接的对等体有责任向现有对等体发送 HelloPacket,让它们知道它的存在。这就是我遇到麻烦的地方。

我没有足够的声誉来发布图片,但这是我在设置绘画中制作的图表:https://i.stack.imgur.com/7E5I8.png

以下是事件的顺序和我遇到的问题:

  1. 介绍服务器已启动并监听“HelloPacket”类型的 UDP 数据包
  2. 对等体 A 启动其客户端,客户端随后向地址/端口处的 Intro 服务器发送 HelloPacket:72.82.59.10, 6666
  3. 介绍服务器接收 HelloPacket 并在其表中添加一个条目,并且不会向对等点 A 发送任何 IntroPackets,因为其表中没有其他对等点。表中的条目类似于对等点 A 的以下内容:IP:72.82.59.10,端口:1024
  4. 对等体 B 启动其客户端,然后客户端向介绍服务器发送 HelloPacket。
  5. 介绍服务器接收 HelloPacket 并在其表中添加一个条目。然后介绍服务器向新连接的对等方发送一个包含对等方 A 的地址和端口的 IntroPacket。此时介绍服务器的表如下所示:

对等体 A:72.82.59.10, 1024

对等体 B:72.82.59.10, 1025

  1. 对等方 B 接收 IntroPacket,然后尝试向对等方 A 发送 hello 数据包。

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

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

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

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

问题:

  1. 我是否忽略了设计中的某些关键内容,或者只是不简单地理解使用 UDP 的 NAT 遍历?
  2. 出于什么原因,对等点 A 能够接收来自服务器的数据包,而对等点 B 却不能?(因为对等点能够接收来自服务器的数据包)
  3. NAT 是否考虑源地址?

非常感谢您的意见!谢谢!

相关内容