本文档介绍火山引擎移动解析(HTTPDNS)的工作原理。
移动解析 HTTPDNS 如何解析域名
在默认情况下,SDK 选择 HTTPDNS 服务端作为优先的解析结果来源。以 HTTPDNS 服务端的解析结果优先的解析过程如下:
- App 调用 HTTPDNS SDK 发起域名解析。
- HTTPDNS SDK 查询客户端缓存。如果 HTTPDNS SDK 在客户端缓存中找到了解析记录,会返回解析结果。此时,域名解析完成。
- 如果 HTTPDNS SDK 在客户端缓存中找不到解析记录,会向 HTTPDNS 服务端发送域名解析请求。如果 HTTPDNS 服务端在服务端缓存中找到了解析记录,就会向 HTTPDNS SDK 返回解析结果。此时,域名解析完成。
- 如果 HTTPDNS 服务端没有在服务端缓存中找到解析记录,会向权威 DNS 服务器发起域名解析请求。如果权威 DNS 服务器及时返回了解析结果,HTTPDNS 服务端会把解析结果返回给 HTTPDNS SDK 并缓存解析结果。此时,域名解析完成。
- 如果 HTTPDNS 服务端由于响应超时等原因无法及时向 HTTPDNS SDK 返回域名解析结果,HTTPDNS SDK 会向 Local DNS 服务器发起域名解析请求。
如果您只是想把 HTTPDNS 服务端的解析结果作为备选,可以通过 setHttpDnsPrefer 方法(Android SDK)或 isLocalDnsMode 属性(iOS SDK)选择 Local DNS 服务器作为优先的解析结果来源。在以 Local DNS 解析结果优先的解析过程中,HTTPDNS SDK 在客户端缓存中找不到解析记录时,会首先向 Local DNS 服务器发送域名解析请求。其他步骤与以 HTTPDNS 服务端解析结果优先的解析过程类似。
说明
- 如果您的移动端 App 无法集成 HTTPDNS SDK,您可以通过 HTTP API 向 HTTPDNS 服务端发送域名解析请求。您可以根据 HTTPDNS SDK 的机制自行实现异步解析和解析记录缓存等功能。参见 集成方案概述。
- HTTPDNS Android SDK 默认向 HTTPDNS 服务端发送 HTTPDNS 请求。您也可以通过 HTTPDNS Android SDK 向 HTTPDNS 服务端发送 DoH 请求。参见 什么是 DoH。
- HTTPDNS iOS SDK 不支持发送 DoH 请求。您需要通过 iOS 的原生方法接入 DoH。
移动解析 HTTPDNS 如何优化解析耗时
传统 DNS 解析基于 UDP 协议。移动解析 HTTPDNS 基于 HTTP 协议和 HTTPS 协议。在解析耗时上,Local DNS 具有解析延时低的优势,原因是:
- 运营商 Local DNS 的机房多,且机房的遍布广。用户能就近接入。
- UDP 协议是面向非连接的协议。没有连接握手的 round-trip time(RTT)。HTTP 协议是面向连接的,需要先建立连接,再传输数据。连接握手需要较多的 RTT。如果连接时还使用了 TLS 协议,TLS 握手会进一步增加 RTT。
为了降低解析延时,移动解析 HTTPDNS 在客户端和服务端提供了很多优化机制。这些优化机制使移动解析 HTTPDNS 的解析延时可以接近 Local DNS 的延时。
- 客户端优化:HTTPDNS SDK 中集成了很多的请求优化机制。主要的优化机制包括以下内容:
- 批量预解析:您可以使用 SDK 指定需要预解析的域名。在应用启动时,SDK 会发送这些域名的解析请求,并且将解析结果缓存在客户端。
- 解析一致性保障:由于解析结果是由移动解析 HTTPDNS 提供,不会出现在多个 Local DNS 情况下遇到的解析结果不一致的问题。
- 异步批量更新:在此缓存刷新机制下,当过期的解析记录达到预定数量,SDK 才向服务端请求解析记录的批量更新。这样提升了缓存更新效率。异步批量更新也会有一个过期时间上限。当缓存中某条解析记录过期时间达到上限后,即使已过期的解析记录还未达到预定数量,SDK 也会向服务端请求批量更新所有已过期的解析记录。
- 过期解析记录容忍:在异步批量更新的场景下,您可以使用 SDK 指定一个过期时间的上限。这样,应用可以在可控的过期时间范围内使用过期的解析记录。提升解析效率。
- 服务端优化:移动解析 HTTPDNS 在服务端优化了网络接入和支持多协议。主要的优化机制包括:
- 同步刷新缓存:在每一条解析记录过期前,服务端会向权威 DNS 服务器获取最新的解析记录。
- BGP 接入:提供 BGP 接入。移动解析 HTTPDNS 和各运营商都有专线连接。
- HTTP/2 支持:支持 HTTP/2 协议标准。因此,移动解析 HTTPDNS 能使用 HTTP/2 的特性。
- TLS 会话复用:复用 TLS 会话,可以减少 TLS 握手所需的 RTT,从而降低解析请求的延迟。
- QUIC 支持:支持 Google QUIC (gQUIC) 协议。客户端使用 gQUIC 协议可以进一步降低解析请求的延迟。
- 负缓存:负缓存针对的是双栈解析请求的场景,也就是应用同时请求 IPv4 和 IPv6 的 IP。如果 IPv6 对应的 AAAA 记录在权威 DNS 服务器没有配置,SDK 会将 IPv6 的值设置为空。应用就可以根据 IPv6 的值做相应处理。
HTTPDNS SDK 如何管理缓存的解析记录
移动解析 HTTPDNS 的HTTPDNS SDK 会在本地内存中缓存解析记录,并通过预解析、自动刷新缓存等方式管理缓存的解析记录。如果 SDK 发起的解析请求命中了缓存,SDK 会直接返回缓存中的解析记录。
您可以参见 HTTPDNS SDK 的解析记录缓存机制 了解详细信息。
HTTPDNS 服务端支持的 DNS 查询请求类型
HTTPDNS 服务端支持 HTTPDNS 请求和 DoH 请求。
请求类型 | 接入方式 | 是否支持 | 相关文档 |
---|
HTTPDNS | Android SDK | 是 | 开发指南概述 |
iOS SDK | 是 |
HTTP API | 是 |
浏览器 | 否 |
DoH | Android SDK | 是。SDK 默认不开启 DoH。您需要手动开启 DoH。 | 什么是 DoH |
iOS SDK | 否。您需要基于 iOS 的原生功能发送 DoH 请求。 |
HTTP API | 否。您需要按照 DoH 协议发送 DNS wire format 的 API 请求。 |
浏览器 | 是 |
对于 HTTPDNS 的接入方式,SDK 默认向移动解析 HTTPDNS 服务端发送 HTTPS 请求。
HTTPS 请求与 HTTP 请求的计费不同。参见 计费说明。