0

更新

事实证明,该问题与 NAT 和 UDP 打孔无关。所以我创造了一个新的Q。

我使用以下方法实现了 UDP 打孔:

位于已知端口的已知服务器(无 NAT)正在处理传入的 UDP。

NAT 后面的客户端向服务器发送数据报,之后服务器通过向该客户端发送对等点的地址来响应。

客户端现在开始通过同一个套接字使用 UDP 与对等方通信(但当然是不同的地址。)

如果一段时间后,客户端停止与对等方的通信,并再次向服务器发送另一个数据报,则该数据报不会到达(除非我通过从服务器向客户端发送 keepalive 数据报来保持通道打开。)

我的问题:为什么可以从服务器<->客户端之间的数据报切换到对等<->客户端之间的数据报,但是一旦我切换回来并且客户端再次发送到服务器,它们就没有到达?

4

1 回答 1

3

我怀疑这种行为特定于您的 NAT。听起来端口映射逻辑有问题。您可能会在网络上放置一个不同的 NAT 框并看到不同的行为。

我的建议是始终为每个对等会话使用不同的本地端口和套接字。因此,假设您在第一个会话中使用端口 2000 与服务器和对等方通信,那么下一个会话应该使用完全不同的本地端口。然后,无论 NAT 与前一个端口发生的任何问题都不会影响这个新套接字。

一般来说,如果你想在一对主机之间保持一个 UDP 通道打开,你应该每 45 秒至少有一个数据包流动。

于 2014-01-02T08:44:38.050 回答