【问题标题】:How to find the cause of bad TCP connections如何找到坏 TCP 连接的原因
【发布时间】:2012-03-01 20:19:03
【问题描述】:

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

问题

现在,当然,我们办公室的一切正常(连接到测试服务器和实时服务器),但我们的客户报告说,一些玩家经常断开连接(每隔几秒),而且他们自己也经历过这种情况(尽管他们的办公室在同一栋楼内)。

问题

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

  • 玩家的互联网连接不好,无法解决。
  • 玩家与服务器(土耳其 荷兰)之间的距离太长。
  • 服务器(CentOS 机器)或数据中心出现问题。
  • 服务器过载(尽管在低负载下也会发生)。
  • 我们的软件有错误。
  • 还是其他原因?

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

已知数据

  • 每当报告虚假断开连接并且我检查日志时,大多数时候我没有看到该玩家被服务器软件主动踢出,只看到连接已关闭。
  • 有一个内部监控服务有一堆 localhost 连接到游戏服务器,就像玩家一样,它不会断开连接。

其他

像我们这样的网络游戏还有很多。他们如何处理这个问题? (除非问题出在服务器/数据中心,那么解决方案是显而易见的)

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

【问题讨论】:

  • +1 祝你好运;我讨厌调试网络。您是否知道有时客户端每隔几分钟就会更改一次 IP 地址?是的,事情变得如此可怕。寻求弹性重新连接。
  • 我认为仅使用服务器端日志无法确定原因。可能会在客户端断开连接时记录客户端日志并要求您的客户端向您发送日志文件(通过报告问题按钮或其他方式)。
  • 没错,没有通用的方法可以从服务器端找出导致客户断开连接的原因。您的 Java 应用程序在什么操作系统上运行,您通常同时拥有多少个连接?
  • @JohnD OS 是 CentOS Linux 5.5,我们有大约 400 个连接
  • 可能是防火墙问题。看看stackoverflow.com/a/4541177/727201

标签: java testing tcp monitoring


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-14
    • 2022-11-04
    • 1970-01-01
    • 2020-12-03
    • 2019-02-03
    • 1970-01-01
    • 2012-04-29
    • 2017-12-20
    相关资源
    最近更新 更多