📅  最后修改于: 2023-12-03 15:14:45.184000             🧑  作者: Mango
DNS(Domain Name System,域名系统)是互联网的命名系统,用于将域名(www.example.com)转换为IP地址(192.168.0.1),以便计算机网络能够相互通信。在互联网上,每个域名都有一个唯一的IP地址。
当用户输入域名时,操作系统会先在本地缓存中查找是否有对应的IP地址,如果没有就会向DNS服务器发送请求。DNS服务器会根据域名的一级、二级、三级等信息向上查询,最终找到对应的IP地址并返回给用户的计算机。
将域名映射到IPv4地址,如:
example.com. IN A 192.168.0.1
将域名映射到IPv6地址,如:
example.com. IN AAAA 2001:0db8:85a3:0000:0000:8a2e:0370:7334
指定邮件服务器的主机名,如:
example.com. IN MX 10 mail.example.com.
别名记录,将一个域名的解析结果指向另一个域名,如:
www.example.com. IN CNAME example.com.
当本地DNS服务器收到请求时,会尝试向根域名服务器查询,最终返回查询结果。被动式的查询方式被称为迭代查询,当查询结束时,本地DNS服务器就可以把对应记录缓存到本地,以便以后的查询。
主动向指定DNS服务器查询,直到得到结果为止,并不缓存查询结果。
以下演示使用Python的dnspython
库进行域名解析查询:
import dns.resolver
def dns_lookup(domain: str) -> list:
"""
DNS解析查询
"""
res = []
try:
# 查询A记录
answers = dns.resolver.resolve(domain, 'A')
for rdata in answers:
res.append(str(rdata))
# 查询MX记录
answers = dns.resolver.resolve(domain, 'MX')
for rdata in answers:
res.append(f'MX {rdata.preference} {rdata.exchange}')
# 查询CNAME记录
answers = dns.resolver.resolve(domain, 'CNAME')
for rdata in answers:
res.append(f'CNAME {rdata.target}')
except Exception as e:
res.append(str(e))
return res
# 查询baidu的DNS解析结果
print(dns_lookup('baidu.com'))
结果如下:
['119.63.198.16', '220.181.57.216', 'MX 1 mx.baidu.com.', 'CNAME www.a.shifen.com.']
以上就是DNS的介绍和演示,DNS作为互联网的基础设施,是程序员必须掌握的知识之一。