【问题标题】:Game server TCP networking sockets - fairness游戏服务器 TCP 网络套接字 - 公平性
【发布时间】:2014-04-12 03:19:28
【问题描述】:

我正在为回合制游戏编写游戏服务器。一个标准是游戏需要对所有玩家尽可能公平。

到目前为止,它是这样工作的:

  • 每个客户端都有一个 TCP 连接。 (如果相关,则通过 WebSockets 打开连接)
  • 在运行时,通过 epoll 不断检查传入的套接字消息。
  • 使用准备好读取的套接字遍历客户端:
    • 从客户端读取所有消息。
    • 更新每条消息的内部游戏状态。
    • 将传出消息排队到受影响的客户端。
  • 在每个“窗口”(转弯)的末尾:
    • 遍历客户端并将所有排队的传出消息写入其套接字

我对公平的关注提出了以下问题:

向客户发送消息的顺序是否重要?

  • 对我的程序调用所有套接字上的 write() 只需要几分之一秒,但是如果我对客户端列表进行排序,在底层操作系统或网络中的某个地方会有所不同吗?
    • 也许我应该先发送到延迟最高的客户端?

我如何将传出消息写入套接字是否重要?

  • 目前我将它们写成一大块。大小可以超过单个数据包。
    • 如果我以小于 1 个数据包的小块发送消息,客户端开始处理会更快吗?
    • 一次向每个客户端写入 1 个数据包并多次迭代客户端会更好吗?

是否有任何 linux/网络配置会在这里产生影响?

 

提前感谢您的反馈和提示。

【问题讨论】:

    标签: sockets networking tcp


    【解决方案1】:

    向客户发送消息的顺序是否重要?

    是的,以毫秒为单位。如果网络接口可用于发送,操作系统将立即开始发送。为什么要等?

    也许我应该先发送到延迟最高的客户端?

    我认为您应该按随机顺序发送。在发送之前随机播放列表。这使它公平。我认为您的问题是有效的,应该得到解决。

    目前我将它们写成一大块。 [...]

    首先,要认识到 TCP 是基于流的,并且在协议级别没有数据包/消息。在物理层面上,数据确实是打包的。

    没有必要手动拆分数据包,因为客户端会在数据到达时读取数据。如果客户端发出读取,则该读取将在第一个数据包到达后立即完成。操作系统中没有人为等待。

    是否有任何 linux/网络配置会在这里产生影响?

    我不知道。请务必禁用 nagling。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 2013-11-12
      • 2011-03-11
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      相关资源
      最近更新 更多