首頁  >  文章  >  web前端  >  詳解nodeJS中的網域DNS

詳解nodeJS中的網域DNS

零下一度
零下一度原創
2017-06-26 13:33:221700瀏覽

前面的話

  本文將詳細介紹域名解析模組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);//nullconsole.log(address);//218.11.2.249console.log(family);//4});

  同一個域名,可能對應多個不同的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);//nullconsole.log(hostname);//baiconsole.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');//IPV4dns.resolve('www.qq.com',function(err,address){
    console.log(address);//[ '125.39.240.113', '61.135.157.156' ]});//IPV6dns.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的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn