跳到主要内容

HTTPDNS 域名解析服务

HTTPDNS 使用 HTTP(S) 请求向专用 DNS 服务查询域名解析结果,而不是依赖运营商 LocalDNS。以此减少 DNS 劫持、跨网解析和缓存不一致等问题。

Combo SDK 基于腾讯云 HTTPDNS 提供了跨平台的 HTTPDNS 解析接口。游戏可在自身网络库中接入该接口,将关键业务域名解析为 IP 后进行直连,以降低 DNS 异常对请求链路的影响。

提示
  • SDK 在进程启动时(早于 Unity 运行时)自动完成初始化,游戏侧无需手动调用。
  • HTTPDNS 只负责 域名 → IP 的解析;获取 IP 后如何实现由游戏侧网络库决定(见 注意事项)。

支持平台

Android iOS HarmonyOS

接入前提

  • 提供待解析域名清单:所有需要解析的域名,由世游运维团队提前在腾讯云 HTTPDNS 控制台登记;未登记的域名解析不出结果(接口返回 null,按兜底策略走 LocalDNS)。
  • 集成 Combo SDK v2.22.0 or later;HTTPDNS SDK 随 Combo SDK 配置文件自动初始化。

API

解析接口位于 Combo 命名空间下的静态类 HttpDns,提供异步、同步两个入口。

判断可用性

bool available = ComboSDK.IsFeatureAvailable(Feature.HTTPDNS);

建议在游戏客户端初始化环节先调用本接口判断 HTTPDNS 是否可用:

  • 返回 true 时,在网络层使用 HttpDns 提供的域名解析能力;
  • 返回 false 时,使用域名直连(默认 LocalDNS)的网络策略。

Combo SDK 当前仅在 Android、iOS 和 HarmonyOS 平台支持 HTTPDNS Feature,其他平台暂未支持,调用时将始终返回 false

异步解析 Resolve

非阻塞,可以在 Unity 主线程用协程调用。解析实际跑在后台线程,主线程每帧轮询结果,不会卡帧。

public static HttpDnsResolveOperation HttpDns.Resolve(string domain);
Show Code
IEnumerator ResolveDomain()
{
var op = HttpDns.Resolve("api.example.com");
yield return op; // 不阻塞主线程,等待解析完成

HttpDnsResult result = op.Result;
if (result == null)
{
// 解析失败 / HTTPDNS 不可用 —— 回退系统 DNS(直接用原域名访问)
yield break;
}

// IPv4、IPv6 可能有一个为 null(该协议栈不可用或无结果),使用前先判空
string[] ipv4 = result.IPv4;
string[] ipv6 = result.IPv6;
}

同步解析 ResolveSync

同步阻塞,调用线程会一直等到解析完成或超时。只能在工作线程里使用,请勿在 Unity 主线程调用,否则会卡住主线程。

public static HttpDnsResult HttpDns.ResolveSync(string domain);
Show Code
// 运行在工作线程
HttpDnsResult result = HttpDns.ResolveSync("api.example.com");
if (result == null)
{
// 回退系统 DNS
return;
}

// IPv4、IPv6 可能有一个为 null(该协议栈不可用或无结果),使用前先判空
string[] ipv4 = result.IPv4;
string[] ipv6 = result.IPv6;

HttpDnsResult

PropertiesTypeDescription
Domainstring本结果对应的域名
IPv4string[]解析到的 IPv4 地址列表;当 IPv4 协议栈不可用或无结果时为 null
IPv6string[]解析到的 IPv6 地址列表(裸地址,拼 URL 时需自行加 []);当 IPv6 协议栈不可用或无结果时为 null

注意事项

  • 功能可用性检查:建议在游戏客户端初始化环节,先通过 ComboSDK.IsFeatureAvailable(Feature.HTTPDNS) 判断 HTTPDNS 功能是否可用。返回 true 时,可在网络层使用 HttpDns 提供的域名解析能力;返回 false 时,应使用域名直连(使用默认的 LocalDNS)的网络策略。Combo SDK 在 Android、iOS 和 HarmonyOS 平台均支持 HTTPDNS Feature,其他平台暂不支持。
  • 线程模型ResolveSync 不允许在 Unity 主线程调用,预期仅在线程池中的工作线程同步阻塞调用。异步协程版的 Resolve 适用于 Unity 协程风格的网络库。
  • 空值兜底策略:HTTPDNS API 返回的 HttpDnsResultnull 不是错误,含义是"用原域名走系统默认的 LocalDNS"。游戏客户端拿到 null 后不要重试解析、不要报错中断请求,而是使用原域名直连(使用默认的 LocalDNS):这是 HTTPDNS 解析超时、HTTPDNS 服务故障、HTTPDNS SDK 不可用时的容灾兜底策略,不可省。
  • IPv4/IPv6 双栈支持:HTTPDNS API 会自动检测 IPv4/IPv6 双协议栈,仅返回用户侧设备当前网络环境支持的网络协议栈对应的 IP 地址。游戏侧的网络层逻辑也需要支持双栈,不能仅使用 IPv4 地址,这会导致网络环境为 IPv6 Only 的用户发送 HTTP 请求失败。IPv4/IPv6 的优先级由游戏侧决定。建议优先使用 IPv6 地址,无可用 IPv6 地址时再使用 IPv4 地址(反过来优先用 IPv4 地址也是可以的)。
  • IPv6 拼 URL 时要加[]:示例 https://[2600:9000:20af:3400:16:635e:7e80:93a1]/path
  • IP 选择策略归游戏侧:解析出多个 IP 时,由游戏侧决定 IP 地址的选择策略。建议遍历 IP 地址列表来进行连接,如果遇到 TCP 连接失败,则切换到下一个 IP 地址重试。
  • 主域名必须在腾讯云做预登记:所有要解析的域名需提前在腾讯云 HTTPDNS 服务的控制台上登记,未登记的域名解析不出结果。

HTTPS 直连的 SNI / 证书校验

游戏拿到 IP 后如果走 HTTPS 直连(把 URL 里的域名换成 IP),要保证 TLS 握手的 SNI 和请求头的 Host 仍然是原始域名,否则:

  • 对按 SNI 路由的 CDN,SNI 对不上会拿到别家的证书,TLS 校验失败;
  • 服务端也可能没法按域名路由到正确的站点。
提示

Unity 的 UnityWebRequest 在请求 URL 为 IP 时,无法将 TLS SNI 显式指定为原始域名,因此不适用于 HTTPDNS + HTTPS 直连场景

实现 HTTPDNS 解析后的 HTTPS 直连,需要使用能将「连接目标 IP」与「TLS host」解耦的 HTTP 客户端。实际连接目标为解析得到的 IP,而 TLS 握手中的 SNI、证书校验以及 HTTP 请求头中的 Host 仍使用原始域名,从而保证 HTTPS 请求正常完成。常见可行方案:

  • HttpWebRequest:将 Host 属性设置为原始域名,请求 URL 使用 IP。
  • HttpClient:保持请求 URL 为原始域名,通过 SocketsHttpHandler.ConnectCallback 将实际 TCP 连接定向到解析得到的 IP。