在终端输入ping baidu.com,命令先返回IP地址,之后展示响应时间。这个过程,本地电脑向DNS服务器查询,获取域名对应的IP地址。DNS服务器检索之后返回结果,电脑依靠IP发送数据包。域名和IP的映射关系就是这样建立。
很多人误以为映射是一对一,一个域名固定绑定单个IP,单个IP只承载一个域名。实际情况复杂很多。一个域名可以对应多个IP,大型网站尤其普遍。你每次访问同一个域名,DNS返回IP可能不一样,依靠轮询或者负载均衡实现。多台服务器分担流量,DNS把请求分发到不同IP,避免单台服务器压力过载。反过来单个IP可以对应多个域名,虚拟主机就是这个原理。一台服务器部署几百个网站,域名解析全部指向同一个IP。服务器收到请求,读取HTTP头Host字段,判断用户访问哪个网站,返回对应页面内容。

域名和IP映射存储在DNS记录。基础类型A记录,域名指向IPv4地址。IPv6使用AAAA记录,格式相似,地址字符更长。CNAME记录不直接指向IP,指向另一个域名。例如www.example.com配置CNAME指向example.com,访问www的时候,DNS先查询example.com的A记录,拿到IP返回用户。CNAME优势在于IP变更时,只修改example.com的A记录,www记录不用改动。很多CDN服务商要求添加CNAME,指向分配边缘节点域名,IP由CDN动态调整。
家庭宽带动态IP是IP变更典型场景。运营商分配IP不是固定的,间隔一段时间或者重启光猫,IP就会变化。家里搭建服务,希望外部用户通过域名访问,需要DDNS。路由器或者设备部署DDNS客户端,IP发生变化自动通知DDNS服务商更新A记录,域名指向新IP。花生壳、No-IP就是这类产品。没有DDNS,IP更新之后域名会指向别的设备。
DNS查询存在缓存。电脑、路由器、运营商DNS服务器,链路中间每一层都可能缓存解析结果。缓存时间由TTL控制。TTL数值小,IP变更信息全网传播更快,但DNS查询请求变多。TTL数值大,减少查询压力,但IP修改之后等待全网更新时间更长。修改解析之后部分地区正常、部分地区无法访问,就是不同节点缓存过期时间不一致。TTL到期之后,全网解析记录同步。
正向解析之外还有反向解析。正向解析是域名查IP,反向解析依靠PTR记录,通过IP查询对应域名。反向解析在邮件服务器场景比较关键,很多收件服务器校验发件IP是否配置PTR记录,没有配置直接判定垃圾邮件。普通用户很少用到,搭建邮件服务需要配置。
还有本地hosts文件,属于本地映射表,优先级高于DNS查询。hosts写入一行127.0.0.1 example.com,本机访问example.com直接访问本机,完全跳过DNS。开发测试经常这么操作,临时把域名指向本地或者测试服务器。hosts仅对当前这台机器生效,修改需要管理员权限。
CDN让域名和IP映射变得更加复杂。用户请求域名,DNS返回的不是源站IP,而是距离用户最近的CDN边缘节点IP。不同地区用户拿到IP不一样,同一地区不同运营商分配节点也不同。源站IP被隐藏,用户不会直接访问源服务器。这个过程对用户透明,直观感受就是访问速度提升,背后IP多次切换。
站在用户角度,域名相当于名字,IP相当于门牌号。名字方便记忆,门牌号用于精准定位。DNS就像查号台,负责把名字翻译成门牌号。查号台不止一处,缓存遍布链路,映射关系不是固定不变,会随业务动态调整。你拿到的IP,只是此刻、当前网络环境、经过一系列DNS查询返回的结果。更换网络、更换时间,返回IP可能发生变化。