ValveSoftware/GameNetworkingSockets

GitHub: ValveSoftware/GameNetworkingSockets

基于 UDP 的高性能游戏传输库,提供可靠/不可靠消息、加密与 P2P 穿透能力。

Stars: 9379 | Forks: 699

# GameNetworkingSockets [![Windows, Ubuntu](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/ad1f0d6f69110346.svg)](https://github.com/ValveSoftware/GameNetworkingSockets/actions) [![MacOS](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/5942ece950110348.svg)](https://github.com/ValveSoftware/GameNetworkingSockets/actions) [![Linux flavors](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/60a4c03f43110349.svg)](https://github.com/ValveSoftware/GameNetworkingSockets/actions) GameNetworkingSockets 是一个用于游戏的基础传输层。特性包括: * 面向连接的 API(类似 TCP) * … 但它是面向消息的(类似 UDP),而非面向流的。 * 支持可靠和不可靠的消息类型 * 消息可以大于底层 MTU。协议会执行 分片、重组和可靠消息的重新传输。 * 一个 [可靠性层](src/steamnetworkingsockets/clientlib/SNP_WIRE_FORMAT.md) 比基本的 TCP 风格滑动窗口更复杂。 它基于 DCCP(RFC 4340,第 11.4 节)中的“确认向量”模型, 并参考 Google QUIC 以及 [Glenn Fiedler](https://gafferongames.com/post/reliable_ordered_messages/) 在游戏背景下的讨论。 基本思想是让接收者高效地向发送者 传达每个数据包编号的状态(是否收到该编号的数据包)。 通过记住每个数据包中发送的段, 发送者可以推断出哪些段需要重传。 * 加密。每个数据包使用 AES-GCM-256,[Curve25519](https://cr.yp.to/ecdh.html) 用于 密钥交换和证书签名。共享密钥派生和每包 IV 的细节基于 [设计](https://docs.google.com/document/d/1g5nIXAIkN_Y-7XJW5K45IblHd_L2f5LTaDUDwvZ5L6g/edit?usp=sharing) 采用 Google QUIC 协议的方式。 * 用于模拟数据包延迟/丢包的工具,以及详细的统计测量 * 标头阻塞控制和对同一连接上多个消息流(“通道”)的带宽共享。 你可以使用严格的优先级 值、更柔和的 [权重值](https://en.wikipedia.org/wiki/Weighted_fair_queueing) 来控制带宽分配方式,或两者的组合。 参见 [``ISteamNetworkingSockets::ConfigureConnectionLanes``](include/steam/isteamnetworkingsockets.h)。 * IPv6 支持 * 对等网络: * 通过 Google WebRTC 的 ICE 实现进行 NAT 穿透。 * 插入你自己的信令服务。 * 独特的“对称连接”模式。 * [``ISteamNetworkingMessages``](include/steam/isteamnetworkingmessages.h) 是一个 接口,旨在让基于 UDP 的代码轻松移植到 P2P 用例。( 基于 UDP 的意思是非面向连接的代码,每次发送数据包时 都需要指定接收方地址。) * 参见 [README_P2P.md](README_P2P.md) 获取更多信息 * 跨平台。该库已在主机、移动平台和非 Steam 商店上使用,并已用于跨平台连接。联系以获取 访问权限。(我们无法在此分发。) 不提供以下功能: * 实体的高级序列化、更改状态变量的增量编码等 * 压缩 ## 快速 API 概述 要了解 API 的样子,可以查看以下内容: * [include/steam](include/steam) 文件夹包含公共 API 头文件。 * [``ISteamNetworkingSockets``](include/steam/isteamnetworkingsockets.h) 是 最重要的接口。 * [``steamnetworkingtypes.h``](include/steam/steamnetworkingtypes.h) 包含各种 类型和声明。 * [Steamworks SDK 文档](https://partner.steamgames.com/doc/api/ISteamNetworkingSockets) 提供这些 API 的基于网页的文档。需要注意的是, 某些功能仅在 Steam 上可用,例如 Steam 的认证服务、 信令服务和 SDR 中继服务。 * 查看以下示例: * [example_chat.cpp](examples/example_chat.cpp)。一个非常简单的客户端/服务器 程序,仅使用 IPv4 上的可靠消息。 * [test_p2p.cpp](tests/test_p2p.cpp)。展示如何让两个主机通过 P2P 连接 相互连接。也是一个编写信令服务插件的示例。 ## 构建 请参阅 [BUILDING](BUILDING.md) 获取更多信息。 ## 语言绑定 该库使用 C++ 编写,但也提供了纯 C 接口 以便于绑定到其他语言。 第三方语言绑定: * C#: * * * Go: * * Rust: * ## 为什么到处看到 “Steam”? 主接口类名为 SteamNetworkingSockets,许多文件名也包含 “steam”。但 *Steam 并非必需*。如果你不制作游戏或 不在 Steam 上,可以随意使用此代码。 名称中带有 “Steam” 的原因是这样提供了与 [API](https://partner.steamgames.com/doc/api/ISteamNetworkingSockets) 在 Steamworks SDK 中同名的功能子集。 我们发布此代码的主要原因是让开发者在编写 Steamworks SDK 的 API 时不会有所顾虑。 在 Steam 上,你将链接 Steamworks 版本,并可以访问 [Steam 数据报中继](https://partner.steamgames.com/doc/features/multiplayer/steamdatagramrelay) 网络提供的其他服务。在其他平台和商店上,只要你的游戏在 Steam 上发布, 也许也能利用这些服务。更多详细信息请参考 Steamworks 文档。 因为这是一个实时服务,并且我们需要控制安全性和向后兼容性负担, 目前我们无法向所有合作伙伴开放 SDR 访问权限。 如果你不是 Steam 合作伙伴,或者你的游戏没有在 Steam 上发布, 那么请使用这个开源版本的 API,并利用宽松的许可证 随心所欲地使用。我们希望你能充分利用其中的功能。 如果此 API 是一个隐藏的 “wart”,或者使用 `#ifdef STEAM`, 就不会实现这一点,因此我们提供了这个开源版本。 希望与 Steamworks SDK 匹配的需求也解释了一种 有些过时且奇怪的编码风格以及奇怪的目录结构。 该项目与 Valve 的 Steam 代码保持同步。 当我们从更大的代码库中提取代码时, 不得不进行一些相对粗糙的修改。 `tier0`、`tier1`、`vstdlib`、`common` 等文件夹中的文件 尤其遭受了创伤。 此外,如果你看到似乎存在不必要的抽象层, 那可能是因为这些层是支持中继连接类型或 Steamworks SDK 某部分所必需的。 ## 安全性 如果你发现了安全漏洞,请负责任地通知我们; 你可能有资格获得漏洞赏金。 请参阅 [security policy](SECURITY.md) 获取更多信息。
标签:ack vector, AES-GCM-256, Curve25519, DCCP, GameNetworkingSockets, Google QUIC, NAT穿透, P2P, QUIC, UDP, 不可靠传输, 不可靠消息, 丢包模拟, 内核驱动, 加密, 可靠传输, 可靠消息, 大包传输, 密钥交换, 延迟模拟, 性能优化, 检测绕过, 流式传输, 消息传输, 消息分片, 消息重组, 游戏服务器, 游戏网络, 滑动窗口, 漏洞扫描器, 点对点, 网络仿真, 网络协议, 网络穿透, 网络统计, 连接导向API, 重传, 重传机制