nodeJS之功能變數名稱DNS

来源:http://www.cnblogs.com/xiaohuochai/archive/2017/06/04/6940940.html
-Advertisement-
Play Games

前面的話 本文將詳細介紹功能變數名稱解析模塊DNS 本地解析 dns模塊包含兩個類型的函數,其中一種是使用底層操作系統工具進行功能變數名稱解析的函數,並不須要進行網路通信。這類函數只有一個:dns.lookup() 【dns.lookup(hostname[, options], callback)】 該方法將功能變數名稱 ...


前面的話

  本文將詳細介紹功能變數名稱解析模塊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'
});

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、apply,和call的用法。 先來一個與本次博文無關的東西,就是apply和call的用法。其實apply和call的用法都一樣,只是他們的傳參不一樣。apply是數組,而call是單獨的傳,類似枚舉。 1.列子一把arguments轉化為標準數組,可以使用push等方法。 2.如何把argu ...
  • HTML 一、簡介 1.HTML是超文本標記語言,標準通用標記語言下的一個應用,解釋性語言。 2.“超文本”就是指頁面內可以包含圖片、鏈接,甚至音樂、程式等非文字元素。 3.超文本標記語言的結構包括“頭”部分(英語:Head)、和“主體”部分(英語:Body),其中“頭”部提供關於網頁的信息,“主體 ...
  • 頭部 header 用於頭部 主要內容 main 用於主體內容(中部) 左側 main-left 左側佈局 右側 main-right 右側佈局 外套 wrap 用於最外層 導航條 nav 網頁菜單導航條 內容 content 用於網頁中部主體 底部 footer 用於底部 頭部 header 用於 ...
  • 【塊級標簽與行級標簽的區別】 1.塊級標簽: 預設寬度100%(獨占一行) 自動換行(右邊不能有任何東西) 可以使用css設置寬度高度 2.行級標簽: 內容寬度,由內容撐開(內容多寬,寬度就占多寬) 不會自動換行(從左往右依次排列) 【常見的行級標簽】 span(文本) img(圖片) em(強調) ...
  • 優雅降級(graceful degradation):一開始就構建站點的完整功能,然後針對瀏覽器測試和修複。 漸進增強(progressive enhancement):一開始只構建站點的最少特性,然後不斷針對各瀏覽器追加功能。優雅降級:使用優雅降級方案,Web站點在所有新式瀏覽器中都能正常工作,如 ...
  • [1]基礎 [2]代碼組織 [3]文件操作 [4]網路操作 [5] [6] ...
  • 前面的話 在HTTP部分,詳細介紹了URL的相關知識。而nodejs中的url模塊提供了一些實用函數,用於URL處理與解析。本文將詳細介紹nodeJS中的URL URL對象 解析 URL 對象有以下內容,依賴於他們是否在 URL 字元串里存在。任何不在 URL 字元串里的部分,都不會出現在解析對象里 ...
  • 先上html結構 如圖,這是前端進階經典書籍【鋒利的jquery】中的一個案例,使用attr方法給元素添加屬性以達到選中與取消效果。 要求:1. 點擊全選/全部選,改變下麵四個覆選框選中狀態; 2. 單獨點擊下方按鈕,只要存在未選中的,則上方全選/全不選為未選中狀態,全部選中,則上方全選/全不選也自 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...