一、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/n/301620.html
微信扫一扫
支付宝扫一扫