Skip to content

在 IPv6 网络环境下运行服务器时,客户端可以通过 TCP 连接到服务器(显示为可连接状态),但实际的 UDP 游戏数据传输失败,导致客户端无法正常加入游戏或游戏状态无法同步。 #80

@yandujun363

Description

@yandujun363

Platform: Windows

Build: 2025.12.X25

Issue: 在 IPv6 网络环境下运行服务器时,客户端可以通过 TCP 连接到服务器(显示为可连接状态),但实际的 UDP 游戏数据传输失败,导致客户端无法正常加入游戏或游戏状态无法同步。

根本原因分析
Windows 系统默认启用了 IPv6 临时地址(Privacy Extensions)。当服务器启动时:

  1. TCP Socket 监听在服务器的永久 IPv6 地址上(如:240e:355:7f0d:8a00:9a8f:e0ff:fe69:867d
  2. 但当服务器回复客户端的 UDP 数据包时,系统自动选择了临时 IPv6 地址作为源地址(如:240e:355:7f0d:8a00:3c33:11b3:6a2d:711a
  3. 客户端收到来自"陌生"地址的 UDP 回复,认为这不是合法的游戏服务器,拒绝通信并返回 ICMPv6 Port Unreachable

技术细节

  • TCP 连接正常:三次握手成功,连接状态固定了双方地址
  • UDP 通信失败:无状态协议 + IPv6 临时地址选择策略 = 源地址不一致
  • 影响:所有使用 IPv6 连接的客户端都无法正常游戏

Steps to reproduce:

  1. 在支持 IPv6 的网络环境中启动 Mindustry 服务器(Windows/Linux)
  2. 客户端(任意平台)尝试通过 IPv6 地址连接服务器
  3. 观察结果:
    • 服务器列表中能看到服务器(TCP 连接成功)
    • 但尝试加入游戏时会卡住或失败(UDP 通信失败)
    • 或者能看到服务器但状态不同步

验证方法
使用 Wireshark 抓包可观察到:

  • 客户端 UDP 请求发往服务器永久地址
  • 服务器 UDP 回复来自临时地址
  • 客户端回复 ICMPv6 Port Unreachable

抓包数据
抓包数据(备链)

确认

  • I have updated to the latest release (https://github.com/Anuken/Mindustry/releases) to make sure my issue has not been fixed.
  • I have searched the closed and open issues to make sure that this problem has not already been reported.

附加信息
这个问题会影响所有启用了 IPv6 临时地址的系统(Windows 默认启用,Linux 通常也启用)。随着 IPv6 普及率的提高,这个问题会越来越常见。建议优先修复,因为这是核心网络功能问题。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingwontfixThis will not be worked on

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions