先记住这个答案
A记录把主机名解析为IPv4地址,CNAME将主机名指向另一个规范名称,解析器跟随该目标继续查询。但CNAME记录与其它数据记录不能共存于同一节点,且不允许有子节点;根域名必须包含NS、SOA等管理记录,若引入CNAME则违背RFC 1034规则,导致基础解析功能破坏,因此根域不能设为CNAME。
- A记录是地址映射,直接给出IPv4。
- CNAME是别名跳转,需要目标继续解析。
- CNAME禁止与其它记录共存,根域因此受限。
A与CNAME在解析机制上的差异
A记录是终结点记录,它直接把一个DNS名称与IPv4地址绑定。比如 api.example.com 用A记录指向 203.0.113.10,递归解析器查询该名称时,返回的就是这个地址,整个过程没有二次查询。
CNAME记录是别名记录,它把一个名称标记为另一个名称的别名。例如 www.example.com 是 cdn.example.net 的CNAME,递归解析器先获得目标名 cdn.example.net,然后需要对该目标名再发起一次独立的查询,继续解析以找到最终的IP。由于CNAME的本质是跳转,链中每一跳都必须解析成功,并且总跳数通常由递归服务器限制(具体数值因实现而异),以防死循环。
协议层面的关键约束是:如果DNS节点上存在CNAME,那么该节点就不能有其它记录,比如A、MX、TXT。RFC 1034规定,当查询名称匹配到CNAME且查询类型不是CNAME时,服务器应返回CNAME记录,客户端需继续向目标名称查询以获取所需类型记录(递归解析器可自动跟随)。这一约束使得CNAME只适合用在完整主机别名上,不适合挂在需要多种记录类型的根区域或命名空间节点上。
迁移主机时如何选A还是CNAME
假设你用 blog.example.com 发布博客,托管在 webhost1.example.net,IP是 192.0.2.1。某次运维中你需要把站点切换到另一服务商的 webhost2.example.net(其IP为 198.51.100.1)。如果最初使用的是A记录,你必须同时修改 blog.example.com 的A记录为新IP,并可能在服务商侧进行内容迁移配置;而使用CNAME,只需把 blog.example.com 的CNAME指向 service.example.net,由托管商统一调整该名称的解析,用户端的DNS天然跟随变化,TTL传播后无需改动自有域。
然而CNAME的使用有限制:当 blog.example.com 还需要同时提供MX邮箱服务或TXT验证记录时,直接设CNAME就会与MX、SPF等记录冲突,导致邮件路由失效。这种情况下要么改用A记录,要么把不同服务分配到不同子域,如 www.example.com 作为站点CNAME,邮件用 mail.example.com 的A和MX。实际决策时应先列出该名称需要的所有记录类型,凡有其它业务需求,优先选A。
根域名为什么不能使用CNAME
根域名(如 example.com)是DNS区域中的顶点,它携带区域权威性所需的记录:至少要有NS记录(区域权威服务器列表)和SOA记录(区域管理参数)。若把 example.com 设为CNAME,根据前述的共存规则,NS、SOA甚至MX都不得与其同存,于是权威服务器将无法宣告自己是该区域的来源,整个域的解析都会失效。
即使只把根域CNAME到其它域名,递归解析器也会遇到矛盾:查询 example.com 的NS时发现它对CNAME,指向 target.net,但区域数据中 example.com 又必须是权威起点,无法委派给 target.net。RFC 1912等实践文档也明确根域不允许CNAME。变通做法是让根域自身返回WEB服务器的IP(A记录),并让 www.example.com 作为CNAME;若需要完全跟随内容域变化,可使用HTTP 301跳转或使用DNS服务的ALIAS/ANAME非标准功能(但这是私有实现的工程取舍)。
容易答错的地方
- 认为CNAME解析速度慢于A记录
- 实际上两者都能被递归服务器缓存;CNAME额外暴露的目标名通常也会在单个查询响应中附带,若配合合适TTL差别很小,慢源于跳数多和目标不在同一区域时的额外解析轮次,并非CNAME本身。
- 根域不能CNAME只是CDN限制
- 这是常见的误解。根域不能CNAME的根本是DNS协议中CNAME不得与NS、SOA等共存,而并非CDN或服务商不提供。CDN厂商的ALIAS/ANAME记录就是为规避这一限制实现同类效果。
面试官还会怎么问?
CNAME 链最多能有多长?
递归解析器通常会设置CNAME链的最大跳数以防止无限循环,但具体上限没有统一标准,通常由实现决定(如BIND等常见软件有可配置参数),超过限制则返回错误。每跳都增加一次潜在的查询开销。
CNAME 和 HTTPS 记录(SVCB/HTTPS)之间的关系是什么?
HTTPS记录(类型65)可指示客户端使用特定端口或ALPN等参数,但不能被用作CNAME。CNAME若指向目标后,客户端通常会解析目标的HTTPS记录;部分场景下可用HTTPS记录做并行解析优化,但两者数据结构不同,不可替换。
WWW 子域名用 CNAME 时,对外发起的网络连接由谁完成?
由CNAME最终目标对应的IP地址负责。客户端的连接请求发往目标记录解析出的IP,而不是别名域名自身,因此源站、证书域名校验都以最终域名为准。
参考资料
示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。