一般将域名转换为ip的过程称之为dns解析,网络通信双方均需要知道对方的ip地址和应用端口,即必须知道ip地址和端口,而不是域名和端口。但无论是发送http请求还是通过socket直连通信,一般都只用到域名而不是使用IP。这是因为python像很多高级语言一样会自行处理dns解析问题。
同样类似其它高级语言,为了加速dns解析速度会使用多级缓存,如hosts文件、应用缓存、系统缓存、各级域名服务器缓存等。但这些由于默认行为中这些缓存带来的不确定性甚至不可干预,会导致一些复杂场景的业务无法实现。例如流量分发、http dns、vpn、虚拟操作系统等场景均需要自行处理dns解析问题。
python语言中,我们可以使用dnspython模块来实现自定义的DNS查询请求,由于该代码是直接发送DNS查询请求不会使用任何本地缓存,因此不会受到hosts文件、dns缓存的干扰,这是简单的示例代码
import dns.resolver # pip install dnspython
result = dns.resolver.query(host, 'A')
for ipval in result:
print('IP', ipval.to_text())