【问题标题】:In which cases should I close a TCP connection?在哪些情况下我应该关闭 TCP 连接?
【发布时间】:2009-03-24 11:14:44
【问题描述】:

我目前正在编写一个多进程网络游戏服务器(一个看门人进程告诉玩家当前正在运行哪些游戏并允许他们创建和加入游戏,以及每个游戏实例一个进程)。

在哪些情况下,网守断开与客户端的 TCP 连接会很有用,在哪些情况下它应该继续侦听?例如。在客户端成功加入游戏或检索游戏列表或发生错误时(例如他尝试加入的游戏中没有空闲插槽),网关守卫是否应该关闭连接。还是应该在超时时关闭连接?谢谢。

【问题讨论】:

    标签: networking sockets


    【解决方案1】:

    我以从事网络游戏为生。我们所有不是 Web 或 XML 请求的连接只要相关,就会保持打开状态。客户端打开与服务器的连接并保持打开状态,直到发生以下情况之一:

    1. 客户端由于正常操作而断开连接。在 TCP 中 这最终会杀死你的 大多数情况下的连接。 然而,随着某些 设备/网络连接 断开信号不会被发送 干净,所以你需要备份
    2. 该 客户端超时。你想设置 这个相当高,取决于 潜伏。对于类似的东西 网守服务器可能像 5 秒?然后,您可以将其设置为 每 2.5 秒执行一次周期性 ping 左右,如果你不确定数据 通常会经常发送 保持连接活跃。
    3. 该 服务器启动播放器。如果 玩家做了一些无效的事情,比如 尝试作弊,服务器会 强行断开播放器。它 通过首先发送一个 断开数据包(有错误 消息(如果适用),然后 一段时间后终止连接

    我建议不要将 UDP 用于大多数网络游戏应用程序。 UDP 很难通过现在使用的各种防火墙设置,如果你正在做一些模糊的重要事情,你将不得不在 UDP 之上编写一个数据包保证系统......这基本上就是 TCP 是什么.从旧版本的引擎到我们的新引擎,我们从 UDP 切换到了 TCP。

    【讨论】:

    • 谢谢,您的帮助很大。
    【解决方案2】:

    最简单的协议通常为每个单独的事务使用单独的连接。 Web 浏览器在其最简单的操作模式下,只需连接下载页面,然后断开连接。但是重复连接和断开到同一个服务器确实会带来开销,所以reuse an existing connection也是可以的。

    另一方面,如果在连接的使用之间会有很长的延迟,并且有大量的客户端,则您必须考虑服务器可以管理的同时连接数量有限。这就是不活动超时可能有用的地方。

    保持连接打开还允许您执行从服务器到客户端的异步通知,而客户端无需位于防火墙之外。客户端连接然后保持连接,不断地从中读取。服务器通过连接发送通知。

    【讨论】:

    • 所以,我看到我应该只在超时或用户加入游戏或自愿离开时关闭连接,以让他随时了解可用游戏的状态。谢谢。
    【解决方案3】:

    以可能可行的最简单方式设计协议。这可能意味着在事务结束时关闭连接。

    如果应用程序(网络游戏的看门人)不是性能关键,或者客户端不需要进行扩展对话,您可能应该在事务结束时关闭套接字。

    如果客户需要问另一个问题,可以随时再做一个。

    如果您需要扩展到非常高的负载(想想每台服务器 10k 个并发会话),请考虑使用 UDP,其中服务器可以使用单个(或少量)套接字来为大量客户端提供服务。

    【讨论】:

      猜你喜欢
      • 2018-07-02
      • 1970-01-01
      • 2016-02-19
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 2022-01-15
      相关资源
      最近更新 更多