一、DNS基礎知識
DNS(Domain Name System)指域名解析系統,它將域名與IP地址相互映射。
通過將域名轉換為IP地址,客戶端可以通過IP地址訪問到想要的服務器,並獲得需要的服務。
在DNS系統中,一共有13個根域名服務器,它們都是分佈式的,即它們位置分散且互相獨立,且根域名服務器的數量很少發生變化。
二、DNS遞歸查詢過程
遞歸查詢方式是客戶端向本地域名服務器發起域名解析請求,本地域名服務器從離他最近的DNS服務器開始,一步一步向上遞歸查詢,直到找到域名對應的IP地址。
遞歸查詢由客戶端發起,經過本地域名服務器,中間逐級向上查詢,直到根域名服務器
下面是實現DNS遞歸查詢的代碼示例
import java.net.InetAddress; import java.net.UnknownHostException; public class DNSRecursiveQuery { public static void main(String[] args) throws UnknownHostException { InetAddress address = InetAddress.getByName("www.baidu.com"); System.out.println("Baidu's IP Address is:" + address.getHostAddress()); } }
三、DNS迭代查詢過程
迭代查詢方式是客戶端向本地域名服務器發起域名解析請求,本地域名服務器從離他最近的DNS服務器開始查詢,如果該DNS服務器無法解析,就返回給本地域名服務器,並讓本地域名服務器去查詢下一個DNS服務器,類似向下迭代查詢,直到查詢到域名對應的IP地址。
迭代查詢由客戶端發起,經過本地域名服務器,沿着DNS服務器向下查詢,直到查到想要查詢的主機
下面是實現DNS迭代查詢的代碼示例
import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import javax.naming.NamingException; import javax.naming.directory.Attributes; import javax.naming.directory.SearchControls; import javax.naming.NamingEnumeration; public class DNSIterativeQuery { public static void main(String[] args) throws NamingException { String[] servers = {"dns1.example.com", "dns2.example.com"}; DirContext ictx = new InitialDirContext(); Attributes attrs = ictx.getAttributes("www.baidu.com", new String[] { "NS" }); String rootServer = ""; if (attrs != null) { NamingEnumeration servers = attrs.getAll(); while (servers.hasMore()) { rootServer = servers.next().toString(); break; } } SearchControls controls = new SearchControls(); NamingEnumeration results = ictx.search(rootServer, "www.baidu.com",controls); while (results.hasMore()) { System.out.println(results.next()); } } }
四、DNS遞歸查詢與迭代查詢對比
遞歸查詢需要經過多個DNS服務器,每次查詢比較耗時,查詢速度較慢。
而迭代查詢方式中,每次查詢只查一級域名,查詢速度相對較快。
下面是遞歸查詢與迭代查詢的時間對比
import java.net.InetAddress; import java.net.UnknownHostException; public class TimeTest { public static void main(String[] args) throws UnknownHostException { //遞歸查詢 long startTime = System.currentTimeMillis(); InetAddress address = InetAddress.getByName("www.baidu.com"); long endTime = System.currentTimeMillis(); System.out.println("Recursive Query Time:" + (endTime - startTime) + "ms"); //迭代查詢 startTime = System.currentTimeMillis(); DirContext ictx = new InitialDirContext(); Attributes attrs = ictx.getAttributes("www.baidu.com", new String[] { "NS" }); String rootServer = ""; if (attrs != null) { NamingEnumeration servers = attrs.getAll(); while (servers.hasMore()) { rootServer = servers.next().toString(); break; } } SearchControls controls = new SearchControls(); NamingEnumeration results = ictx.search(rootServer, "www.baidu.com",controls); while (results.hasMore()) { System.out.println(results.next()); } endTime = System.currentTimeMillis(); System.out.println("Iterative Query Time:" + (endTime - startTime) + "ms"); } }
五、總結
DNS遞歸查詢與迭代查詢是兩種查詢方式,它們都可以用於查詢域名對應的IP地址。遞歸查詢從上到下遞歸查詢DNS服務器,速度較慢;而迭代查詢從下到上迭代查詢DNS服務器,速度相對較快。具體使用哪種查詢方式,要根據實際情況選擇。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/301620.html