前面的话

  本文将详细介绍域名解析模块DNS

工作原理

  打开浏览器,在上方地址栏输入网址的那一刻,这个回车按了之后,发生了很多事情。首先,计算机只懂0和1,也就是说人类的字母网址计算机是不懂的,它只认识IP地址,如果是IPV4那就是4组8位的二进制数字。为了人类方便,需要有一个把网址翻译成IP地址的服务,就是DNS

  DNS整个获取过程是被层层缓存的

  1、浏览器搜索自身的DNS缓存

  浏览器DNS缓存的时间跟DNS服务器返回的TTL值无关。

  浏览器在获取网站域名的实际IP地址后会对其IP进行缓存,减少网络请求的损耗。每种浏览器都有一个固定的DNS缓存时间,其中Chrome的过期时间是1分钟,在这个期限内不会重新请求DNS

  Chrome浏览器看本身的DNS缓存时间比较方便,在地址栏输入

chrome://net-internals/#dns

  2、搜索操作系统自身的DNS缓存

  3、读取本地的HOST文件,Windows下路径一般为

c:\Windows\System32\drivers\etc\hosts

  4、向宽带运营商ISP发起一个DNS的系统调用,ISP服务器查看本身缓存

  5、如果还没有找到,ISP服务器会代替本地计算机发起一个迭代DNS解析的请求

  6、如果仍然不成功,则解析失败

本地解析

  dns模块包含两个类型的函数,其中一种是使用底层操作系统工具进行域名解析的函数,并不须要进行网络通信。这类函数只有一个:dns.lookup()

【dns.lookup(hostname[, options], callback)】

  该方法将域名(比如'cnblogs.com')解析为第一条找到的记录 A (IPV4)或 AAAA(IPV6)。参数 options可以是一个对象或整数。如果没有提供 options,IP v4 和 v6 地址都可以。如果 options 是整数,则必须是 4 或 6

  options参数包含以下属性

family:地址协议族,必须为4或6的整数
hints:设置getaddrinfo的标志,dns.ADDRCONFIG 或者 dns.V4MAPPED(ipv4映射成ipv6)
all:false(默认),布尔值,如设置为true,则返回IP数组,否则返回单个IP地址
{
family: 4,
hints: dns.ADDRCONFIG | dns.V4MAPPED
}

  回调函数包含参数 (err, address, family)。 address参数表示 IP v4 或 v6 地址。family 参数是4 或 6,表示 address 家族(不一定是之前传入 lookup 的值)。出错时,参数 err 是 Error 对象,err.code是错误代码

  [注意]err.code等于'ENOENT',可能是因为域名不存在,还有可能是其他原因,如没有可用文件描述符

var dns = require('dns');
dns.lookup('www.cnblogs.com', function(err, address, family){
console.log(err);//null
console.log(address);//218.11.2.249
console.log(family);//
});

  同一个域名,可能对应多个不同的ip。可以通过设置options = {all: true}来获取

var dns = require('dns');
dns.lookup('www.qq.com',{all:true}, function(err, address, family){
console.log(err);//null
/*
[ { address: '125.39.240.113', family: 4 },
{ address: '61.135.157.156', family: 4 } ]
*/
console.log(address);
console.log(family);//undefined
});

【dns.lookupService(address, port, callback)】

  与lookup相对应,lookupService()方法进行从ip地址和端口到域名的反向解析

  该方法的回调函数的参数是 (err, hostname, service)。 hostname 和 service 都是字符串 (比如 'localhost' 和 'http')。出错时,参数err 是 Error 对象,err.code是错误代码

var dns = require('dns');
dns.lookupService('127.0.0.1',80,function(err, hostname, service){
console.log(err);//null
console.log(hostname);//bai
console.log(service);//http
});

网络解析

  除dns.lookup()以外的所有dns模块中的函数,都需要连接到实际DNS服务器进行域名解析的函数,并且始终使用网络执行DNS查询

【dns.resolve(hostname[, rrtype], callback)】

  该方法将一个域名(如 'cnblogs.com')解析为一个 rrtype 指定记录类型的数组

  有效的 rrtypes 值为:

'A' (IPV4 地址, 默认)
'AAAA' (IPV6 地址)
'MX' (邮件交换记录)
'TXT' (text 记录)
'SRV' (SRV 记录)
'PTR' (用来反向 IP 查找)
'NS' (域名服务器 记录)
'CNAME' (别名 记录)
'SOA' (授权记录的初始值)

  回调参数为 (err, addresses). 其中 addresses 中每一项的类型都取决于记录类型。出错时,参数err 是 Error 对象,err.code是错误代码

var dns = require('dns');
//IPV4
dns.resolve('www.qq.com',function(err,address){
console.log(address);//[ '125.39.240.113', '61.135.157.156' ]
}); //IPV6
dns.resolve('www.qq.com','AAAA',function(err,address){
console.log(address);//[ '240e:e1:8100:28::2:16' ]
}); //别名
dns.resolve('www.qq.com','CNAME',function(err,address){
console.log(address);//undefined
});

【dns.resolve4(hostname, callback)】

  和 dns.resolve() 类似,仅能查询 IPv4 (A 记录)

var dns = require('dns');
dns.resolve4('www.qq.com',function(err,address){
console.log(address);//[ '125.39.240.113', '61.135.157.156' ]
});

【dns.reverse(ip, callback)】

  该方法用于反向解析 IP 地址,返回指向该 IP 地址的域名数组。回调函数参数 (err, hostnames)。出错时,参数err 是 Error 对象,err.code是错误代码

var dns = require('dns');
dns.reverse('114.114.114.114',function(err,hostnames){
console.log(hostnames);//'public1.114dns.com'
});

nodeJS之域名DNS的更多相关文章

  1. 域名dns查询_查询域名dns ip地址

    最近有部分用户反应管理的天气网站打开偏慢,决定从每一个可以出现的问题点查起!首先就是dns! 通过360dns监控对比发现,同一组域名,15tianqi.cn的dns响应时间比较长,在300-700间 ...

  2. 域名DNS解析说明

    一直都对域名DNS 解析很懵逼,今天看到一个博客上面详细的介绍了域名解析. 特意记录下: 记录类型: A记录: 将域名指向一个IPv4地址(例如:8.8.8.8)CNAME:将域名指向另一个域名(例如 ...

  3. 服务商域名DNS大全

    服务商域名DNS:  服务商 DNS服务器   常用DNS: 英文域名DNS 主DNS名称:ns11.xincache.com 辅DNS名称:ns12.xincache.com 说明:新网共有5组DN ...

  4. bind域名dns解析及主从服务的配置

    bind域名dns解析及主从服务的配置 1.dns解析介绍     人们习惯记忆域名,但机器间互相只认IP地址,域名与IP地址之间是多对一的关系,一个ip地址不一定只对应一个域名,且一个域名只可以对应 ...

  5. 谈谈域名DNS的缓存问题

    可以从很多地方看到,许多刚开始做站的朋友,对域名设置方面的知识原理一知半解,以至于为了某些测试需要,经常对域名解析大动干戈.今天改个A记录,明天又换个NS.又或者,在迁移域名,迁移网站的时候的时候由于 ...

  6. WordPress搭建教程---购买域名+购买VPS主机+域名DNS解析+网站环境+上传网站程序

    WordPress搭建教程 购买域名---NameSilo 购买VPS主机---Vultr 域名DNS解析 网站环境 上传网站程序 参考文章: 1. WordPress搭建教程 https://zhu ...

  7. 解决域名DNS解析的故障

    在实际应用过程中可能会遇到DNS解析错误的问题,就是说当我们访问一个域名时无法完成将其解析到IP地址的工作,而直接输入网站IP却可以正常访问,这就是因为DNS解析出现故障造成的.这个现象发生的机率比较 ...

  8. TTL值的含义以及与域名DNS TTL值的区别

    TTL值的含义以及与域名TTL值的区别 本文来源于时光漂流瓶 http://www.9usb.net , 原文地址: http://www.9usb.net/201004/ttl-yuyuming-t ...

  9. 域名DNS解析工具ping/nslookup/dig/host

    常见 DNS 记录的类型 类型 目的 A 地址记录,用来指定域名的 IPv4 地址,如果需要将域名指向一个 IP 地址,就需要添加 A 记录. AAAA 用来指定主机名(或域名)对应的 IPv6 地址 ...

随机推荐

  1. thinkphp 单字母函数

    在ThinkPHP中有许多使用简便的单字母函数(即快捷方法),可以很方便开发者快速的调用,但是字母函数却不方便记忆,本文将所有的字母函数总结一下,以方便以后查找. 1.U() URL组装 支持不同UR ...

  2. UE4 difference between servertravel and openlevel(多人游戏的关卡切换)

    多人游戏的关卡切换分为无缝和非无缝.非无缝切换时,客户端将跟服务器断开连接,然后重新连接到同一个服务器,服务器则加载一个新地图.无缝切换不会发生这样的情况. 有三个函数供我们使用:UEngine::B ...

  3. SpringMVC转发和重定向区别!

    在servlet中,转发和重定向是由request和response完成的.两者之间的区别请看我之前的文章.那么在springMVC中是如何完成的呢? /**转发**/ @RequestMapping ...

  4. mybatis 查询 xml list参数

    mybatis 查询 xml list参数: <select id="getByIds" resultType="string" parameterTyp ...

  5. 原始js调用 选中事件

    curRadio.get(0).checked=true;//原始js调用 选中事件,curRadio是radio单个对象

  6. LaTeX初识 新手入门 Texlive和Texmaker学习

    转载自:http://blog.sina.com.cn/s/blog_90444ed201016iq6.html http://blog.csdn.net/zb1165048017/article/d ...

  7. JavaScript函数部分

    函数部分学习:+parseInt(): -parseInt()函数将其收到的任何输入值(通常是字符串)转换成整数类型输出,如果转换失败就返回NaN. -parseInt(“参数”,第二参数基数):没有 ...

  8. 如何解决java文件上面有错,但是文件夹上面不显示的错误

    查了网上很多办法,都是解决不了的,不是我说什么,有些人真的人云亦云,没解决的瞎**乱转发 解决方法是:换个工作空间(workplace)即可,不行你打我

  9. Chrome DevTools 调研笔记

    1  说明 此篇文章针对Chrome DevTools常用功能进行调研分析.描述了每个功能点能实现的功能.应用场景和详细操作. 2  Elements 2.1  功能 检查和实时更新页面的HTML与C ...

  10. date时间转换

    <!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/h ...