客户端套接字连接仅在被服务器 ping 后才开始工作?

客户端套接字连接仅在被服务器 ping 后才开始工作?

我有一款在局域网上测试的网络游戏。我使用 RakNet 作为我的网络库。

总体来说一切都运行正常,但有时候客户端(iPhone)在启动与服务器(同一 LAN 上的 Macbook - 均通过无线连接)的连接时似乎会“感到困惑”。

一旦客户端连接成功,一切都会正常运作。它将无限期地保持连接。但有时,调用connect()只是停留在那里,似乎永远也没有任何进展,即使过了大约 30 秒也是如此。我将开始在客户端收到“无路由到主机”和“主机已关闭”消息。

我发现,在等待期间,如果我从服务器(Macbook)向客户端(iPhone)发起 ping,客户端会立即连接。可能需要等待 28 秒,但当我尝试 ping 时,一切都会解决。

在连接出现故障期间,我还发现尝试从 iPhone ping 通 Macbook 不起作用。

这听起来像是某种路由器问题吗?它确实时断时续——几分钟内一切都会正常工作,然后我就会反复重现无法连接的情况。然后我 ping 客户端,一切又恢复正常了。

这真是令人沮丧,我希望得到一些关于可能导致问题的原因的指导!

更新 1

@PedroPerez 评论说这可能与 ARP 问题有关。为了尝试获取一些数据,我在混杂模式下运行了以下测试,并尝试查找要查看的 ARP 数据包:

  1. 在 Macbook(服务器)上运行的 WireShark
  2. 在 iPhone 上运行的 WireShark(客户端)

在服务器上捕获数据时,我发现每隔 20-50 秒,我就会看到一对 ARP 调用,路由器会请求服务器 IP 的 MAC 地址,然后立即做出响应。每隔 70 秒,我的 Macbook(服务器)就会请求我的 Apple TV 的 MAC 地址。这就是服务器上“稳定状态”的 ARP 流量。它会像时钟一样重复。以下是屏幕截图:

稳定状态服务器 ARP 流量

当通过客户端上的虚拟接口(我通过终端中的调用创建rvictl)捕获数据时,图像有点模糊。首先,由于某种原因,ARP 数据包没有以 ARP 数据包的形式通过 WireShark,即使内容看起来相同(42 字节)。它们只是显示为“原始数据包数据”。通过检查原始数据包的内容,我可以看到每五秒钟(似乎过多?!)iPhone(客户端)就会从路由器收到一个 ARP 回复数据包(似乎是未经请求的?),说明其正确的 IP 地址。我不确定为什么频率这么高,或者为什么路由器似乎在没有请求的情况下发送回复。以下是该过程的屏幕截图。

客户端 ARP 数据包原始

我还设法在这个非常长的超时期间捕获了 ARP 数据包,并注意到就在连接成功之前(等待了大约 20-30 秒后),其中一个(可能是“稳定状态”)广播数据包从 Macbook 发出,请求 Apple TV 的(完全不相关的!)MAC 地址。但是,来自 Macbook 的广播请求包括其 IP 和 MAC 地址,因此也许由于 iPhone 客户端能够“听到”该广播请求,因此它会在看到该请求后立即更新其 ARP 表?但为什么它又忘记了呢?

相关内容