📜  dns (1)

📅  最后修改于: 2023-12-03 15:14:45.184000             🧑  作者: Mango

DNS介绍

DNS(Domain Name System,域名系统)是互联网的命名系统,用于将域名(www.example.com)转换为IP地址(192.168.0.1),以便计算机网络能够相互通信。在互联网上,每个域名都有一个唯一的IP地址。

DNS的工作原理

当用户输入域名时,操作系统会先在本地缓存中查找是否有对应的IP地址,如果没有就会向DNS服务器发送请求。DNS服务器会根据域名的一级、二级、三级等信息向上查询,最终找到对应的IP地址并返回给用户的计算机。

DNS记录类型
A记录

将域名映射到IPv4地址,如:

example.com. IN A 192.168.0.1
AAAA记录

将域名映射到IPv6地址,如:

example.com. IN AAAA 2001:0db8:85a3:0000:0000:8a2e:0370:7334
MX记录

指定邮件服务器的主机名,如:

example.com. IN MX 10 mail.example.com.
CNAME记录

别名记录,将一个域名的解析结果指向另一个域名,如:

www.example.com. IN CNAME example.com.
DNS服务器的分类
递归查询DNS服务器

当本地DNS服务器收到请求时,会尝试向根域名服务器查询,最终返回查询结果。被动式的查询方式被称为迭代查询,当查询结束时,本地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作为互联网的基础设施,是程序员必须掌握的知识之一。