DNS协议详解

1、 什么是DNS协议?

<1>DNS协议就是用来将域名解析到IP地址的一种协议,当然,也可以将IP地址转换为域名的一种协议。
<2>DNS协议基于UDP和TCP协议的,端口号53,用户到服务器采用UDP,DNS服务器通信采用TCP
<3>大型运营商、互联网机构等会向公众提供免费的DNS服务,例如,谷歌的8.8.8.8 8.8.4.4 阿里巴巴223.5.5.5 223.6.6.6
<4>如果DNS服务器down掉了,那么你只能通过IP地址来访问服务了。
<5>我们从以下几部分来理解DNS协议:

  • 域名结构
  • 域名服务器
  • 域名查询

2、域名结构

像Linux目录结构一样,现代因特网采用层次树状结构的命名方法,任何一个连接在因特网上的主机或路由器,都有一个唯一的层次结构的名字,该名字称为域名。

例如:xxx.yyy.zzz.com
从右边的com是顶级域名,到左依次是:二级域名,三级域名,四级域名

域名的分级:域名可以划分为各个子域,子域还可以继续划分为子域的子域,这样就形成了顶级域、二级域、三级域等。

其中顶级域名分为:国家顶级域名、通用顶级域名、反向域名。

    国家顶级域名:中国:cn, 美国:us,英国uk...
    通用顶级域名:com 公司企业  edu教育机构 gov政府部门  int国际组织  mil军事部门  net网络 org非盈利组织...
    反向域名:只有一个arpa,用于PTR查询(IP地址转换为域名) 。 

3、域名服务器

域名服务器主要分为:根域名服务器、顶级域名服务器、权限域名服务器、本地域名服务器。

先举个例子来看一下各个服务器之间的联系:

当一个应用要通过DNS来查询某个主机名,比如www.google.com的ip时,粗略地说,查询过程是这样的:它先与根服务器之一联系,根服务器根据顶级域名com,会响应命名空间为com的顶级域服务器的ip;于是该应用接着向com顶级域服务器发出请求,com顶级域服务器会响应命名空间为google.com的权威DNS服务器的ip地址;最后该应用将请求命名空间为google.com的权威DNS服务器,该权威DNS服务器会响应主机名为www.google.com的ip。

实际上,除了上图层次结构中所展示的DNS外,还有一类与我们接触更为密切的DNS服务器,它们是本地DNS服务器,我们经常在电脑上配置的DNS服务器通常就是此类。它们一般由某公司,某大学,或某居民区提供,比如Google提供的DNS服务器8.8.8.8;比如常被人诟病的114.114.114.114等。
  • 根域名服务器
    根服务器主要用来管理互联网的主目录。
    所有根服务器均由美国政府授权的互联网域名与号码分配机构ICANN统一管理,负责全球互联网域名根服务器、域名体系和IP地址等的管理。
    全球共有13台根服务器。1个为根服务器架构主根服务器,放置在美国。其余12个均为辅根服务器,其中9个放置在美国,欧洲2个,位于英国和瑞典,亚洲1个,位于日本。 据说,在主根服务器系统上还有一个更高级的、隐藏着的母服务器,当然也在美国,而全世界所有的顶级域名都是由这台母服务器来确定的。
    中国还没有自己的根服务器。都是根服务器的镜像(5个)

  • 顶级域名服务器
    负责管理所有的二级域名

  • 权限域名服务器
    负责管理一个区。当一个权限域名服务器还不能给出最后的查询回答时,就会告诉查询请求的DNS客户进程,下一步应当找哪一个权限域名服务器;

  • 本地域名服务器
    可以看成是默认域名服务器,DNS客户进程收到主机发送过来的域名后,就会最初向该域名服务器发送查询请求

题外话:
美国控制了域名解析的根服务器,也就控制了相应的所有域名和IP地址,这对于其他国家来说显然存在着致命的危险。如果哪一天美国屏蔽某国家的域名,那么它们的IP地址将无法解析出来,这些域名所指向的网站就会从互联网中消失了。由此联想,如果“.cn”从域名系统中删除,甚至将分配给中国境内使用IP地址取消的话,中国将成为国际主干网的看客。
所以,从国家互联网安全的角度来看,我们是需要一个根服务器的。抛开中国政府屏蔽国外网站不说,为了我们整个国家的国防安全、在国际互联网的话语权,中国互联网络信息中心CNNIC已经努力向ICANN申请争取一台根服务器,使中国的网站都能有所保障。

4、域名的查询

查询方式分为递归查询和迭代查询,在理解递归查询与迭代查询之前,必须要弄明白“递归”与“迭代”的区别。我们从C++的角度来理解递归与迭代的区别,所谓递归就是函数自己调用自己,而迭代则是函数内部循环地调用他人。下面,我们举出递归与迭代的C++程序:
递归程序:f(n)=f(n-1)+n,f(1)=1,我们用C++递归实现如下

#include<iostream>  
int f(int n)  
{  
    if(n==1)  
        return 1;  
    else  
        return f(n-1)+n;//递归过程
}  

迭代程序:f(n)=1+2+3+…+n,我们用C++迭代实现如下

#include<iostream>  
int f(int n)  
{  
    int i,sum=0;  
    for(i=1;i<=n;i++)  
    {  
        sum+=i;//迭代过程、  
    }  
    return sum;  
}  

递归查询就好比是我问A同学一个问题,他不知道,于是他就去问B同学,如果B知道,就告诉A,A再告诉我结果,如果B也不知道,那么就继续向C问,知道A知道答案,告诉我,最终也是A和我直接交互。
如这一张图:

迭代查询就好比我问A同学问题,A不知道,但是A告诉我,B知道,你去问B吧,于是B告诉了我答案,这就是与上面递归的区别。如下图所示:

查询过程中,递归查询和迭代查询可能会都使用,客户和服务器之间采用递归查询,服务器之间采用迭代查询,可能会多次迭代。
迭代查询的逻辑顺序按照域名系统的域名结构中的层次去查询
如下所示:

5、总结一下DNS查询过程

1)当客户机提出查询请求时,首先在本地计算机的缓存中查找,如果在本地无法查询信息,则将查询请求发给DNS服务器
2)首先客户机将域名查询请求发送到本地DNS服务器,当本地DNS服务器接到查询后,首先在该服务器管理的区域的记录中查找,如果找到该记录,则进行此记录进行解析,如果没有区域信息可以满足查询要求,服务器在本地缓存中查找
3) 如果本地服务器不能在本地找到客户机查询的信息,将客户机请求发送到根域名DNS服务器
4) 根域名服务器负责解析客户机请求的根域名部分,它将包含下一级域名信息的DNS服务器地址地址,返回给客户机的DNS服务器地址
5) 客户机的DNS服务器利用根域名服务器解析的地址访问下一级DNS服务器,得到再下一级域名的DNS服务器地址
6) 按照上述递归方法逐级接近查询目标,最后在有目标域名的DNS服务器上找到相应IP地址信息
7) 客户机的本地DNS服务器将递归查询结构返回客户机
8) 客户机利用从本地DNS服务器查询得到的IP访问目标主机,就完成了一个解析过程
9) 同时客户机本地DNS服务器更新其缓存表,客户机也更新期缓存表,方便以后查询
如下图所示:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值