DNS与HTTP DNS
今天我们来总结一下客户端是如何找到机房入口 IP,并与后台服务建立连接的。
核心主线
整体链路可以概括为:
1 | 用户输入/客户端访问域名 |
其中:
- DNS 是传统、通用的域名解析体系。
- HTTP DNS 是为了解决传统 DNS 在延迟、劫持、调度精准度、变更生效速度等方面的问题而引入的增强方案。
1.2 DNS:客户端连接机房的基础技术
1. DNS 的意义
互联网通信的基础是 IP 地址。客户端要访问机房,就必须知道机房的公网 IP。
但 IP 地址是一串数字,不方便记忆,也不方便在后台 IP 变更时对用户保持透明,因此引入了域名。
DNS(Domain Name System,域名系统) 的作用是:
维护域名与 IP 地址之间的映射关系,并提供把域名翻译为 IP 地址的能力。
DNS 给互联网应用带来的价值主要有:
- 降低用户记忆成本:用户只需要记住域名,而不需要记住 IP 地址。
- 屏蔽机房 IP 变更:公司更换公网 IP 时,只需修改 DNS 配置,用户无感知。
- 支持简单负载均衡:同一个域名可以映射到多个 IP,把不同用户解析到不同入口。
- 支持故障摘除:如果某个 IP 对应的入口不可用,DNS 可以将其从解析结果中移除。
2. 域名结构
域名采用层次化树形结构,从右向左层级逐渐变细。
以 mail.google.com 为例:
1 | 根 |
常见层级:
- 根域名:域名体系的顶端。
- 顶级域名:如
.com、.net、.cn、.us。 - 二级域名:如
google.com、apple.com。 - 三级域名及更多级别:如
mail.google.com、www.baidu.com。
重点理解:每一级域名负责控制下一级域名的分配和解析入口。
3. 域名服务器类型
DNS 系统中的域名服务器主要分为 4 类。
| 类型 | 作用 | 重点 |
|---|---|---|
| 根域名服务器 | 负责顶级域名服务器地址的查找 | DNS 体系顶层入口 |
| 顶级域名服务器 | 负责某个顶级域名下二级域名的查找 | 如 .com、.cn 对应服务器 |
| 权威域名服务器 | 真正决定某个域名最终解析成哪个 IP | 大公司常自建,中小公司常托管 |
| 本地域名服务器 | 客户端最先请求的 DNS 代理与缓存 | 通常由运营商提供 |
其中最关键的两个角色:
- 权威 DNS 服务器:最终决定域名解析结果。
- 本地 DNS 服务器:客户端的 DNS 查询代理,会缓存解析结果,加速后续查询。
4. DNS 域名解析过程
传统 DNS 解析通常采用递归查询。
以访问 www.baidu.com 为例:
1 | 客户端 |
关键点:
- 客户端会先查本地缓存,例如浏览器缓存、系统缓存、Hosts 文件。
- 未命中后,请求本地域名服务器。
- 本地域名服务器作为代理,依次查询根 DNS、顶级 DNS、权威 DNS。
- 权威 DNS 返回最终 IP。
- 本地 DNS 缓存解析记录,再返回给客户端。
5. DNS 解析记录中的重要字段
DNS 解析结果会被缓存,常见字段包括:
| 字段 | 含义 |
|---|---|
| Domain | 域名 |
| TTL | 生存周期,表示缓存多久 |
| Class | 协议类型,通常为 IN,表示 Internet |
| Type | 记录类型,如 A 表示 IPv4,AAAA 表示 IPv6 |
| Rdata | 记录数据,即域名对应的 IP 地址 |
其中 TTL 很重要:
- TTL 越长,缓存命中率越高,解析压力越小。
- TTL 越长,IP 变更生效越慢。
- TTL 越短,变更更快,但 DNS 查询压力更大。
1.3 HTTP DNS:对传统 DNS 的增强
1. 传统 DNS 存在的问题
虽然 DNS 是互联网基础设施,但在大型互联网应用中,它有明显不足。
问题一:解析延迟较高
传统 DNS 可能经历多级递归查询:
1 | 本地缓存 → 本地 DNS → 根 DNS → 顶级 DNS → 权威 DNS |
理想情况下解析只需几毫秒到几十毫秒,但实际场景中可能超过 1 秒,影响用户访问体验。
问题二:调度不够精准
权威 DNS 看到的通常是本地 DNS 服务器的 IP,而不一定是真实客户端 IP。
这会导致:
- 权威 DNS 判断用户地理位置不准;
- 用户可能被解析到距离较远的机房入口;
- 不同运营商之间可能出现错误调度;
- 运营商做“域名转发”时,用户可能拿到不符合自身运营商网络的 IP。
最终表现为:用户访问路径变长,请求延迟升高。
问题三:DNS 劫持
DNS 劫持是指域名解析结果被篡改,导致用户访问错误 IP。
可能来源:
- 运营商在本地 DNS 层面劫持;
- 黑客篡改用户机器的 Hosts 文件;
- 恶意网络环境返回错误解析结果。
影响包括:
- 用户无法访问目标网站;
- 用户被引导到广告页面;
- 用户被引导到钓鱼网站;
- 企业业务流量受损。
2. HTTP DNS 的原理
HTTP DNS 的核心思想是:
不再通过传统 DNS 协议访问本地 DNS 服务器,而是客户端直接用 HTTP 请求访问指定的 HTTP DNS 服务器 IP,由 HTTP DNS 服务返回域名对应的最优 IP。
示例流程:
1 | 客户端 |
注意:HTTP DNS 服务本身一般不通过域名提供服务,而是通过固定 IP 提供服务。否则访问 HTTP DNS 前仍然需要 DNS 解析,就失去了意义。
3. HTTP DNS 的优势
| 优势 | 说明 |
|---|---|
| 降低解析延迟 | 客户端直接访问 HTTP DNS,缩短传统 DNS 递归链路 |
| 防止 DNS 劫持 | 绕过运营商本地 DNS,降低解析结果被篡改的风险 |
| 调度更精准 | HTTP DNS 能拿到真实客户端 IP,更容易做就近接入和运营商匹配 |
| 变更生效更快 | 不受传统 DNS 多级缓存影响,入口 IP 变更能更快覆盖客户端 |
| 可结合业务策略 | 客户端 SDK 可以按连通性、延迟、失败率等策略选择 IP |
HTTP DNS 本质上并不神秘:它只是把域名解析从 DNS 协议迁移到 HTTP 服务接口上,同时把解析权和调度权更多地收回到业务方可控的系统中。
4. HTTP DNS 实践中的容灾设计
HTTP DNS 有优势,但不能完全替代 DNS。因为域名解析是客户端访问后台的第一步,一旦失败,用户就会被挡在机房之外。
因此,客户端网络 SDK 应该设计多级兜底策略:
1 | 优先使用 HTTP DNS |
具体流程:
- 客户端优先使用 HTTP DNS 解析域名。
- 如果 HTTP DNS 返回空数据或网络错误,则降级到本地 DNS。
- 如果传统 DNS 也失败,则使用客户端内置或服务端下发的兜底 IP。
这种设计的目标是:
- 优先保证解析质量;
- 其次保证解析可用;
- 最后保证用户至少能进入后台入口。
5. HTTP DNS 的补充策略
实践中还可以进一步优化:
安全策略
HTTP DNS 可以使用 HTTPS,避免解析请求和响应被中间人篡改。
多 IP 下发策略
HTTP DNS 服务可以一次返回多个候选 IP,并按优先级排序。
客户端可以:
- 默认使用第一个 IP;
- 如果连通性差或访问失败,切换到下一个 IP;
- 根据延迟、失败率等指标做动态选择。
这样可以进一步提升客户端接入成功率和访问体验。
DNS 与 HTTP DNS 对比
| 对比项 | DNS | HTTP DNS |
|---|---|---|
| 协议 | DNS 协议 | HTTP / HTTPS |
| 客户端访问对象 | 本地域名服务器 | 固定 IP 的 HTTP DNS 服务 |
| 是否依赖运营商本地 DNS | 是 | 否,通常绕过 |
| 解析链路 | 多级递归查询 | 直接请求解析服务 |
| 劫持风险 | 较高 | 较低 |
| 调度精准度 | 可能只能看到本地 DNS IP | 可以看到真实客户端 IP |
| 变更生效速度 | 受多级缓存和 TTL 影响 | 更可控、更快 |
| 通用性 | 浏览器和系统天然支持 | 通常需要客户端 SDK 支持 |
| 最佳实践 | 作为基础兜底能力 | 作为 App / SDK 的优先解析能力 |
最重要的架构思想
- 客户端进入机房的第一步是域名解析:没有正确、快速的解析结果,后面的 LVS、Nginx、业务服务都无法发挥作用。
- DNS 解决了 IP 不可读、IP 变更不透明、简单负载均衡等基础问题。
- 传统 DNS 的主要问题是延迟、劫持、调度不精准、变更不够快。
- HTTP DNS 的核心价值是绕过本地 DNS,把解析过程变成业务方可控的 HTTP 服务调用。
- HTTP DNS 不能单独作为唯一方案:客户端必须设计 DNS 降级和兜底 IP,保证接入链路高可用。
- 大型互联网接入设计的关键不是单点技术,而是多级容灾链路:HTTP DNS 优先,传统 DNS 兜底,预置 IP 保底。
一句话总结
DNS 负责把用户可记忆的域名解析为机房入口 IP,是客户端连接后台的第一步;但传统 DNS 存在解析延迟、劫持、调度不精准和变更生效慢等问题,因此大型互联网应用常引入 HTTP DNS,通过客户端直接请求可控的解析服务来获得更精准、更安全、更快速的入口 IP,同时配合传统 DNS 和兜底 IP 构建高可用的接入解析链路。