文章出處

前面的話

  本文將詳細介紹域名解析模塊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);//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);//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'
});

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()