首页 > 代码库 > DNS协议
DNS协议
说明:本文仅供学习交流,转自请标明出处,欢迎转载!
本文是以下文献相关内容的总结:
[1] 《TCP/IP详解 卷1:协议》
[2] 《TCP/IP协议族 第4版》
[3] 《计算机网络 第5版》
如果说ARP协议是用来将IP地址转换为MAC地址,那么DNS协议则是用来将域名转换为IP地址(当然也可以将IP地址转换为相应的域名地址)。 在讨论DNS协议之前,先回答几个容易想到的问题。
问题一:网络中的主机为什么不直接使用域名而用IP地址进行通信?
因为IP地址是固定长度的,IPv4是32位,IPv6是128位,而域名是变长的,不便于计算机处理,但便于用户使用,例如www.baidu.com这是百度的域名,我们一看就明白。总结一点就是IP地址是面向主机的,而域名则是面向用户的。
问题二:假如用户希望通过FTP客户进程来访问运行在一台远程主机上的FTP服务器,该FTP服务器的域名为xxx.com.,给出整个处理流程大致描述?(假设xxx.com是一个实际存在的服务器域名)
1.用户将xxx.com.传递给其主机上的FTP客户进程;
2.FTP客户程序将xxx.com.传递给DNS客户进程;
3.由于每一台主机在加载内核后都能获得其DNS服务器的IP地址,DNS客户进程便通过该IP地址向DNS服务器发送DNS查询报文,要求服务器给出xxx.com对应的IP地址;
4.DNS服务器进程在收到该DNS查询报文后,通过一系列的查询操作(递归查询或迭代查询)获得xxx.com对应的IP地址后将xxx.com的IP地址写入到DNS响应报文中发回给DNS客户进程;
5.DNS客户进程将获得的xxx.com的IP交付给FTP客户进程;
6.FTP客户进程在收到FTP服务器的IP地址后,就可以访问FTP服务器了。
Notice:客户进程在于服务器进程发送数据报之前,必须要知道服务进程所在服务器的IP地址,因为socket地址=(IP地址:端口号),网络进程间的通信是通过socket进行的。
下面详细地介绍下DNS协议的工作原理。
域名
像Linux目录结构一样,现代因特网采用层次树状结构的命名方法,任何一个连接在因特网上的主机或路由器,都有一个唯一的层次结构的名字,该名字称为域名。
(1)域名的分级:域名可以划分为各个子域,子域还可以继续划分为子域的子域,这样就形成了顶级域、二级域、三级域等。
其中顶级域名分为:国家顶级域名、通用顶级域名、反向域名。
国家顶级域名:中国:cn, 美国:us,英国uk...
通用顶级域名:com 公司企业 edu教育机构 gov政府部门 int国际组织 mil军事部门 net网络
org非盈利组织...
反向域名:只有一个arpa,用于PTR查询(IP地址转换为域名) 。
(2)域名的完整性:根据域名的完整性,我们将域名分为FQDN和PQDN。
FQDN(Full Qualified Domain Name):完全合格的域名,也称为绝对域名(还记得绝对路径吗?Linux中的绝对路径是以/开头,而此处的绝对域名则是已.结尾)。
PQDN(Partiallly qualified domain name):标号不是以.结束,在将该地址传递给DNS服务器之前,本主机的DNS客户进程中的解析程序可以补充缺少的部分(称为后缀),使得PQDN变为FQDN,显然DNS客户程序通常保存了一份有关后缀的列表。
一个域名服务器所负责的范围,或者说有管理权限的范围,就称为区,每一个区中所有的结点必须是连通的,每一个区中都设置相应的权限域名服务器,用来保存该去中的所有主机的域名到IP地址的映射。所以,DNS服务器的负责范围不是以“域”为单位的,而是以“区”为单位,区可能小于或等于域,但一定不会大于域,区是“域”的子集。
NOTICE:同一个区可能存在多个权限域名服务器。
域名服务器主要分为:根域名服务器、顶级域名服务器、权限域名服务器、本地域名服务器。
根域名服务器:相当于一个总指挥,每一个域名服务器都必须知道如何与根域名服务器联系;
顶级域名服务器:负责管理所有的二级域名;
权限域名服务器:负责管理一个区。当一个权限域名服务器还不能给出最后的查询回答时,就会告诉查询请求的DNS客户进程,下一步应当找哪一个权限域名服务器;
本地域名服务器:可以看成是默认域名服务器,DNS客户进程收到主机发送过来的域名后,就会最初向该域名服务器发送查询请求。
为了保证数据的安全性,一个区域的管理者必须为该区域提供一个主域名服务(primaryserver)和 辅助域名服务器(secondary server)。主域名服务器从磁盘文件中调入该区域的所有信息,而辅助域名服务器则从主域名服务器调入所有信息,我们将辅助域名服务器从主域名服务器调入信息的过程称为区域传送。当主域名服务器的磁盘文件更新时,辅助名字服务器会定时(通常为3h)向主域名服务器询问是否有数据更新,如果有,则通过区域传送方式获得新数据。建立辅助域名服务器的目的是为了保证数据的安全性,当主域名服务器出现故障时间,其辅助域名服务器可以继续对客户提供服务。
NOTICE:一个服务器可以是某个区域的主域名服务器,同时又是另一个区域的辅助域名服务器。
递归查询与迭代查询
在理解递归查询与迭代查询之前,必须要弄明白“递归”与“迭代”的区别。我们从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;
}
NOTICE递归和迭代的区别,通俗地说:递归就是把一件事情交给别人,如果事情没有办完,哪怕已经办了很多,都不要把结果告诉我,我要的是你的最终结果,而不是中间结果;如果你没办完,请你找别人办完;而迭代则是我交给你一件事,你能办多少就告诉我你办了多少,然后剩下的事情就由我来办。
(待后续补充)