如何找到TCP连接错误的原因

Bar*_*lom 5 java testing monitoring tcp

我们正在开发一种在线游戏,玩家使用持久的TCP连接与服务器进行通信.持续存在,其生命周期是玩家的会话,如果连接关闭,玩家将被抛出游戏(尽管客户端将尝试自动重新连接).

问题

现在,当然一切都在我们的办公室工作正常(连接到测试和现场服务器),但我们的客户报告说一些玩家断断续续(每隔几秒钟),并且他们自己也经历过(尽管他们的办公室在同一栋楼).

我怎样才能找出这些断开的原因?是因为:

  • 玩家网络连接不良,无法提供帮助.
  • 玩家和服务器之间的距离(土耳其< - >荷兰)太长.
  • 服务器(CentOS机器)或数据中心出了问题.
  • 服务器过载(尽管它也在低负载下发生).
  • 我们的软件出错.
  • 还是其他一些原因?

该软件是用Java编写的.它会在玩家断开连接时记录,如果它主动踢它们(例如,为了不发送保持活动消息),它也会记录.

已知数据

  • 每当报告虚假断开连接并检查日志时,大多数时候我都没有看到该播放器被服务器软件主动踢出,只看到连接已关闭.
  • 有一个内部监控服务,它与游戏服务器有一堆本地主机连接,与玩家的方式相同,并且不会断开连接.

其他

还有许多像我们这样的在线游戏.他们如何处理这个问题?(除非问题出在服务器/数据中心,否则解决方案很明显)

  • 他们使用UDP吗?我知道动作游戏的速度,但我认为TCP是正常的,例如在线扑克和其他慢速游戏?(这不会对我们有帮助,我们的客户端软件是用Flash制作的,不支持UDP)
  • 是否有一些TCP调整可以使它更宽松?
  • 或者他们也会得到这些断开连接,只是更透明地重新连接?
  • 网上有关于此的信息吗?

jef*_*unt 1

我会要求玩家允许您启用“匿名使用数据”,就像许多应用程序一样,定期将会话中的调试信息上传回给您。这就是你如何判断这些情况的方法。

从那里开始,当发生断开连接时,您将需要一个非常详细的日志。当发生断开连接时,捕获抛出的任何异常(并且不要忘记通过调用来记录原因.getCause()- 根据需要进行尽可能多的调用.getCause(),直到您一路记录回根本原因)作为任何相关数据,您需要将客户端日志与服务器端日志进行匹配。您可能需要的信息包括会话 ID、游戏 ID、时间戳等。想一想,“假设我对连接的双方都有深入了解,我认为需要哪些信息才能解决此问题?” 这就是要求用户上传使用情况和调试数据最终得到的结果。

从那里您应该能够弄清楚至少几种您可以控制它的情况 - 也就是说,您可以更改客户端/服务器代码以减轻一些问题。在某些情况下,如果问题是客户端的配置或有故障的设备(或者可能是您无法控制的设备之间的某个设备),您将不得不依赖强大的重新连接。

您永远不会将断开连接减少到零,但是在您看到足够多的案例之后,这些信息应该可以帮助您将断开连接的发生率减少到超出您单独控制的情况,此时您塑造网络的能力将最终结束,您将尽可能接近网络可靠性的“最佳情况”。