“域名就是IP地址”,这句话听着好像没问题。浏览器输入域名就能打开网页,ping域名返回一串数字IP,很容易让人把两者划等号。严格来说这个说法不对。域名和IP属于两套完全独立体系,中间依靠DNS做映射,映射正常的时候,普通人感知不到这套机制存在。
先说IP。IP是网络世界的门牌号,设备依靠IP互相寻址通信。IPv4格式类似43.156.78.90,四段数字,每段范围0到255。IPv6地址更长,由十六进制字符搭配冒号组成。家里路由器、手机、服务器只要接入网络,都会分配IP,至少内网会有。IP才是网络通信真正用到的地址,数据包在网络里传输,依靠IP寻址转发,不是域名。

域名是给人识别记忆的名称。example.com、baidu.com、taobao.com这类字符串本身没有寻址能力,网络设备无法直接识别。域名读取顺序从右往左,.com属于顶级域,example是二级域,前面还可以附加www、mail、api这类子域名。域名作用就是降低记忆门槛,用户不可能背诵一串IP访问网站,体验很差。域名就是为了解决IP难记这个问题诞生的。
为什么很多人会觉得域名等于IP。浏览器输入域名访问网站,底层依旧会解析成IP。这个过程DNS在后台工作。输入example.com,操作系统先检索本地缓存,没有记录就请求DNS服务器,DNS服务器逐层递归查询,最终返回IP地址。浏览器拿到IP之后,才建立连接访问网站。整套流程一般几十毫秒,用户感知不到。ping命令逻辑一样,先执行DNS解析,把域名转成IP,再发送ICMP数据包,所以输出结果展示IP,不是域名本身。
DNS里面最常见记录类型是A记录,把域名映射到IPv4地址。AAAA记录对应IPv6。CNAME记录是把一个域名指向另一个域名,最终依旧要解析到IP。这些记录说明,域名和IP属于映射关系,不是等同关系。映射关系可以随时修改,支持一对多、多对一。
一个域名对应多个IP是常态。大型网站部署CDN,不同地区用户解析得到就近边缘节点IP,北京用户拿到北京节点IP,广州用户拿到广州节点IP。负载均衡场景,域名轮询返回多个IP,分摊请求压力。反过来,同一个IP托管多个域名也很普遍,虚拟主机就是典型案例,几百个网站共用同一个IP,服务器依靠HTTP请求头里Host字段区分访问站点。所以现实环境不存在“一个域名固定对应单个IP”。
域名和IP获取方式差别很大。域名需要向注册商注册购买,按年付费,到期不续费域名会被释放,其他人可以抢注。IP由ISP或者云服务商分配,租用服务器会分配公网IP,这个IP所有权不属于租户,服务器退租之后IP回收重新分配。域名支持过户、交易,可以长期持有;IP一般无法个人持有,除非向区域互联网注册管理机构申请独立IP段,门槛很高。
还有个经常混淆的例子localhost和127.0.0.1。localhost属于特殊主机名,默认解析到127.0.0.1本机回环地址。可以修改hosts文件,强制域名指向指定IP,绕过DNS解析。hosts文件优先级高于DNS,很多人用hosts屏蔽广告或者本地开发调试。这也能看出域名和IP绑定关系可以人为修改,不是天生固定绑定。
反过来,没有域名,IP依旧可以访问。浏览器直接输入公网IP,只要服务器开放80端口,网页可以正常打开。只是IP容易变更,不方便记忆;而且同一个IP托管多个站点时,直接访问IP不一定能打开目标网站。没有IP,域名只是一串无意义字符,无法解析访问。两者依赖关系并不对等。
所以“域名就是IP地址”这个说法,好比说人名就是身份证号,混淆了两个不同层面概念。域名是人类使用的名称,IP是机器寻址地址,DNS相当于通讯录。名称可以更换,地址也可以更换,通讯录记录同步更新就行。访问网站用域名,底层网络通信依靠IP,两者配合工作,但不能互相替代。下次再听到这个说法,可以简单回复:域名给人看,IP给机器用,中间翻译的服务叫DNS。