1. 程式人生 > 程式設計 >Node.js DNS (域名伺服器) 模組

Node.js DNS (域名伺服器) 模組

社會猶如一條船,每個人都要有掌舵的準備。——易卜生

本文主要講解什麼?

  • 什麼是 DNS 域名解析?
  • Node.js DNS 模組兩大類別
  • dns.lookup() 與 dns.resolve() 區別
  • 什麼是DNS 解析過程?什麼是 DNS 本地解析?

作者簡介:五月君,Nodejs Developer,網認證作者,熱愛技術、喜歡分享的 90 後青年,歡迎關注 Nodejs技術棧 和 Github 開源專案 www.nodejs.red

什麼是 DNS?

為了方便記憶,我們通常會通過域名的方式訪問網站,例如直接在瀏覽器位址列輸入 www.nodejs.red 就可得到一個請求響應,但是在計算機網路通訊時是隻能識別 IP(127.0.0.1) 地址的,為什麼我直接輸入一串字母就可以訪問呢?這背後的功勞就要歸功於我們的 “翻譯官” DNS 也就是域名系統,它會將我們的域名轉換為 IP 地址進行工作。

Node.js DNS 模組兩大類別

DNS 模組是基於 UDP 協議來實現的,在 Node.js 中我們可以通過 require('dns') 載入 DNS 實現域名的解析查詢,Node.js DNS 模組分為兩大類:一是使用底層作業系統工具進行域名解析,二是連結到一個 DNS 網路伺服器執行域名解析

一:底層操作工具域名解析

Node.js DNS 模組的 dns.lookup() 方法使用底層作業系統進行域名解析,是不需要經過任何網路通訊的。

const dns = require('dns');

dns.lookup('nodejs.red',(err,address,family) => {
    console
.log('地址: %j 地址族: IPv%s',family); }); 複製程式碼

注意,如果本地 hosts 檔案被修改過了,dns.lookup() 會拿本地 hosts 檔案的域名對映,以下我在 hosts 檔案裡面修改了域名對映,最終輸出的結果為 127.0.0.1 hosts 檔案修改後的結果。

/etc/hosts

127.0.0.1       www.nodejs.red
複製程式碼

輸出結果

地址: "127.0.0.1" 地址族: IPv4
複製程式碼

二:連結到 DNS 伺服器執行域名解析

dns 模組中除 dns.lookup() 之外的所有函式,都會連線到實際 DNS 伺服器以執行名稱解析並始終使用網路執行 DNS 查詢,看以下 dns.resolve() 函式與 dns.lookup() 的不同。

const dns = require('dns');

dns.resolve('www.nodejs.red',records) => {
    console.log(records);
});
複製程式碼

使用 dns.resolve 會發現即使我們修改了 hosts 檔案,也不受影響還是從外部讀取正常的地址。

# 以下為輸出結果
[
  '185.199.108.153','185.199.109.153','185.199.110.153','185.199.111.153'
]
複製程式碼

通過上面的 API 可以實現一個類似下面的 DNS 域名解析功能也不是很難,感興趣的可以親自去實踐下,更多 API 也可參考 nodejs 官網 dns 模組。

圖片描述

dns.lookup() 與 dns.resolve() 不同

dns.lookup() 是同步的還是非同步的?

  1. 儘管以非同步 JavaScript 的角度來呼叫 dns.lookup(),但在內部 libuv 底層執行緒池中卻是同步的呼叫 getaddrinfo(3),所以可能會由於一些不確定因素造成 Node 程式阻塞。

  2. 與 dns.lookup() 不同的是 dns.resolve() 這些方法沒有使用 getaddrinfo(3),是通過網路執行的 DNS 查詢,始終是保持非同步不會對其它程式產生負面影響。

注意事項參考: nodejs.cn/api/dns.htm…

什麼是 DNS 解析過程?什麼是 DNS 本地解析?

當我們訪問一個域名 www.nodejs.red 的時候會有一個 DNS 域名系統,會將我們的域名轉換為相應的 IP,所經歷的步驟大致為:瀏覽器 DNS 快取 —> 系統(OS)快取 -> 路由器快取 -> ISP DNS 快取,詳細可參考 github.com/Q-Angelo/ht…

DNS 本地解析指的是 系統(OS)快取 這一階段,在瀏覽器 DNS 快取未命中的情況下,會從本地系統的一個 hosts 檔案尋找對應 IP。

Reference