网络多人游戏架构与编程

前言

  1. 互联网是如何工作的,如何将数据发送给其它计算机。
  2. 如何准备用于网络传输的游戏数据,如何更新网络中的游戏对象,如何组织参与游戏的计算机。
  3. 如何补偿不可靠性和网络延迟,如何将游戏代码设计得同时具有可扩展性和安全性。
  4. 如何集成玩家服务,使用云服务器

第1章 网络游戏概述

问题

  1. 本地多人游戏和网络游戏最大的区别?
    • 有两台或更多的计算机在一个活动的游戏中彼此连接。
  2. 本地网络连接的 3 种不同类型?
    • 串口,电话线调制解调器,以太网
  3. 将网络游戏的运行从局域网切换到互联网主要考虑是什么?
    • 延迟,数据在网络中的传输时间。延迟补偿的方法
  4. MUD 是什么?发展为什么类型的游戏?
    • 多用户网络游戏,《龙与地下城》,运行于 BBS。发展成为图形化改进的 MMO
  5. MMO 与标准在线游戏的区别是什么?
    • 在线人数,标准的 4 ~ 32,MMO 成百上千。
  6. 在《星际围攻:部落》中,哪个系统来提供可靠性?
    • 事件管理器
  7. 描述以下,当数据包丢失时,《星际围攻:部落》网络模型中 ghost 管理器如何重建最小必要的传输。
    • 首先依据状态变换据欸的那个,其次由优先级决定。
  8. 《帝国时代》的点对点模型中,轮班计时器的目的是什么?每个节点传送什么信息到其它节点。
    • 解决等待执行命令时间过长,看起来响应十分缓慢的问题。传输一个轮班时间内的命令队列。

1.1 多人游戏的简要历程

  1. 本地多人游戏,和单机游戏没啥区别,《双人网球》
  2. 早期网络多人游戏,大型机组成的小网络。
  3. 多用户网络游戏,MUD,运行于 BBS
  4. 局域网游戏,LAN,《DOOM》。串口,以太网
  5. 在线游戏,《雷神之锤》《虚幻》
  6. 大规模多人在线游戏,MMO
  7. 移动网络游戏,可靠性低采用异步通信模型游戏,随着 wifi 普及,实时网络游戏《炉石》

1.2 星际部落围攻

1998年,FPS,128 个玩家,电话线拨号上网。本书游戏案例(robo Cat Action)

  1. 平台数据包模块,最底层针对特定平台,对标准套接字的封装。不可靠
  2. 连接管理器,从上层流管理器接收数据,给底层平台数据包模块。仅保证投递状态,使用滑动窗口种接收域的位字段实现不可靠
  3. 流管理器,决定允许数据传输的最大速率,根据网络连接的质量有所不同。把请求按照优先次序排好,分派给连接管理器,高层通过流管理器的投递状态得到通知。
  4. 事件管理器,远程过程调用 RPC,玩家发起攻击事件,事件被发送到事件管理器,接着发送到服务器,服务器确认和执行攻击。
    • 可靠,事件管理器追踪所有被标记为可靠的传输记录, 如果可靠记录没有被确认,会再次将事件放入队列,重新传输一次。
  5. ghost 管理器,复制与指定客户端相关的动态对象。“必须知道”,“最好知道”,优先级不同。当一个对象成为相关对象(在范围内),ghost 管理器给该对象赋予一些信息,称为 ghost 记录。
    • 游戏模拟层决定客户端必须知道什么,最好知道什么。保证最最近的数据总是能成功地传输到所有的客户端。
  6. 移动管理器,尽快传输玩家的移动数据。
  7. 其它系统,例如数据库管理器处理静态的游戏对象的传输,炮台。

1.3 帝国时代

  1. 轮班计时器
    • 问题:
      • 不同玩家帧率,网络连接质量不同。玩家 A 发出攻击执行命令,要通知每一个游戏实例,等待时间过长,看起来响应相当迟缓。
    • 解决方法《帝国时代》,轮班长度默认 200ms
      • 200ms 之内的所有命令存储在一个缓冲区内,轮班结束时,将所有命令通过网络传输给其它玩家。
      • 两个轮班之间的执行延迟,50轮发出的命令,52轮执行,延迟高达 600 ms
    • 《星际2》也在用
    • 边界情况,滞后尖峰导致所有玩家跟不上 200 ms 计时器,停止模拟,强行退出,试图基于网络情况动态调整渲染帧的方法来弥补。
    • 方便录制比赛命令,然后重播。
  2. 同步
    • 伪随机数生成器,PRNG。每个游戏实例不仅使用的种子是一样的,而且使用次数也是一样的。
    • 减少了作弊的机会。

第2章 互联网

问题:

  1. 列出 TCP/IP 模型的 5 层并简要描述每一层。在一些模型中,那一层被认为不是单独的一层。
    • 链路层
  2. 为什么使用 ARP 协议?它是如何工作的?
    • 链路层需要一些方法来找出 IP 地址对应的 MAC 地址。
    • 要使用链路层发送数据包时,先查询 ARP 表获取目标 IP 的 MAC 地址。若表中没有,则 ARP 广播给所有主机,获取 MAC 地址。
  3. 解释一下有多个网卡的主机,时如何在不同子网路之间路由数据包的。
  4. MTU 代表什么?什么意思?以太网的 MTU 是什么
    • 最大传输单元,一次传输中最大数据量,1500 字节
  5. 介绍一下包分片是如何工作的。假设数据链路层的 MTU 是 1500.
  6. 避免 IP 包分片有什么好处。
    • 减少网络上发送的数据量。
    • 丢失分片数据包的概率为 0
  7. 不适用分片技术,发送尽可能大的数据包的好处。
    • 提高带宽的利用率,减少头部损耗占比
  8. 不可靠的数据传输和可靠的数据有什么区别?
    • 保证数据都按序抵达接收方,更大的头部数据来跟踪每台主机的重要连接状态数据,接收者确认接收到的数据,发送者重新发送没有收到确认消息的数据。
  9. 描述一下建立 TCP 握手的流程。交换了什么重要的数据?
    • 序列号,Seqence Number,32bit
    • 确认号,Acknowledgement number,32bit
    • 控制位,Control bit, 9bit
  10. 描述一下 TCP 是如何做到可靠数据传输的。
    • TCP 模块必须存储发送出去的每一个字节,直到这个字节已经被接收方确认收到,才能将这个报文段从缓冲区清除。
      • 保证按序到达
    • 最简单就是直接丢弃非期望包,等待重传。
    • 第二个方法,缓存但不确认这个报文,也不转发给应用层。放到缓冲区的合适位置,等前面的报文都到达,再确认。 * 流量控制,flow control 允许多个未被确认的报文段同时传输提高带宽,避免接收方处理太慢,导致发送方不停重传。 * 接收窗口 window,接收方提醒发送方可以接收的数据量。 * 延迟确认,防止多次确认浪费带宽。等 500 ms 或者等下一个数据包,减少一半的 ACK * 有办法保护处理速度慢的主机不被淹没,但无法阻止较慢的网络和路由器。 * 拥塞控制,congestion control * 相当于高速公路入口处的红绿灯。 * 不设置目的主机的窗口大侠,而是根据已确认和丢弃的数据报的数量计算限制本身。
  11. 公开可路由的 IP 地址和本地可路由的 IP 地址的区别是什么?
    • 公开可路由 IP,互联网上任意路由器都可以发送数据
    • 本地可路由 IP,NAT 给本地网络中的每台主机分配。
  12. NAT 是什么?使用 NAT 有哪些好处,有哪些开销?
    • 网络地址转换 Network address translation
    • 整个子网的主机通过共享的公开 IP 地址连接到互联网
    • 需要配置一个 NAT 网络,给每台主机发分配一个 本地可路由 IP
  13. 解释一下客户端时如何使用 NAT 向公开路由的服务器发送数据包并收到响应数据包的。
    • 2.8
  14. STUN 时什么?为什么需要 STUN?它是如何工作的?
    • NAT 穿越

2.1 起源:分组交换

阿帕网络,BBN Report 1822 定义了这个协议集合。演变为互联网,形成一个协议集合,TCP/IP 协议族。

2.2 TCP/IP 模型

2.3 物理层

2.4 链路层

2.5 网络层

2.5.1 IPv4

2.5.2 IPv6

邻居发现协议 NDP,代替了地址解析协议 ARP 和动态主机配置协议 DHCP 的一些功能

2.6 传输层

2.6.1 UDP

2.6.2 TCP

  1. 可靠性
  2. 三次握手
    • 通过小心地发送和确认数据来建立可靠性。
  3. 数据传输
    • RTT,往返时间。
    • 允许多个未确认的报文段同时传输,提高带宽,但要限制报文数量,避免网络拥塞。
    • 流量控制。
    • \[TCP数据流理论带宽限制 = 带宽限制 * {接收窗口 \over 往返时间}\]
    • 延迟确认,节约带宽减少 ACK。等待 500 ms 或者接收下一个报文段
    • 拥塞控制,AIMD(addtive increase, multiplicative decrease)系统
    • 纳格算法 Nagle’s algorithm。游戏玩家克星,减少带宽使用的同时,明显增加了数据发送的延时。
      • 如果一个实时游戏需要向服务器发送少量更新,在有足够更新累加起来填充最大分段大小 MSS 之前,游戏已经运行很多帧了,明显感觉到延迟。
      • 大部分 TCP 实现提供一个选项来禁用这个拥塞控制功能。
  4. 断开连接
    • 4 次挥手,待所有数据接收完毕确认。

2.7 应用层

2.7.1 DHCP

2.7.2 DNS

2.8 NAT

第3章 伯克利套接字

3.1 创建 Socket

3.2 API 操作系统差异

3.3 Socket 地址

3.4 UDP Socket

第4章 对象序列化

4.1 序列化的需求

4.2 流

第5章 对象复制

主机之间状态传输的第一步,本章研究一个通用的复制框架,支持远程进程之间游戏时间的对象状态的同步。

第6章 网络拓扑和游戏案例

第7章 延迟、抖动和可靠性

第8章 改进得延迟处理

第9章 可扩展性

第10章 安全性

第11章 真实世界得引擎

第12章 玩家服务

第13章 云托管专用服务器