DNS(domain name system):域名系统。
现代主机通讯的过程如下:
1、首先应用层的把数据封装一个应用层首部交给传输层;
2、传输层接收到上层数据后在后面封装一个传输层首部交给网络层;(源端口和目的端口)
3、网络层接收到上层数据后在后面封装一个网络层首部交个数据链路层;(源IP和目标IP)
4、数据链路层收到上层数据后在后面封装一个数据链路层首部交给物理层;(源MAC和目标MAC)
5、物理层收到上层数据后把上层数据转换成二进制放到传输介质上进行传输,传输过程会经过交换机、路由、防火墙到达目的地。
6、数据到达目标主机后,目标主机会反向拆封发送主机发过来的数据包,从而得到发送方应用程序发过来的数据。
在上面数据封装的时候。传输层的端口号在封装时会从本地的1024以上的未用的端口中随机选一个作为源端口,目的端口通常是默认的,也可以让用户指定。数据链路层的MAC地址通常是通过ARP广播得到。
那么现在就有一个问题, 网络层的IP地址怎么指定呢?
通常情况下都是用户直接指定的,第二种情况是在在程序中指定。
在程序中指定的话那就简单了,直接在程序中写入即可。如果是用户指定的话那就麻烦了,使用的用户就得一个一个去记想要访问的主机的IP地址,然而现在的互联网上有成千上万台主机,如果想让每个用户都记住每台主机的IP地址和它所提供的功能,那几乎是一件不可能完成的事情。但是如果让用户记名字呢?比如说
www.baidu.com这个名字,人们一看到这个名字就知道是百度公司的搜索引擎。
基于上面的原因DNS服务就诞生了。DNS服务是现代互联网上的网络基础服务――域名解析服务,它能够完成主机名到IP地址的映射。当用户需要访问百度时,只需要在本地配置号DNS,然后在浏览器中输入www.baidu.com这个名称即可访问。
早期的互联网上的主机数量不是很多,因此那时候主机是互联网上的主机的主机名和IP地址的对应关系写在本地的/etc/hosts文件中。当用户想基于主机名跟别的主机通讯时,只需要用户输入主机的主机名,计算机会自动根据主机名在/etc/hosts文件中查找与之对应的IP地址,而后用这个IP地址跟主机通讯。由于后来的互联网的速度发展过快,主机数量成几何数增长,本地的/etc/hosts文件中所要记录的条目过多,每次想基于主机名通讯时,查找主机名对应的IP地址时的速度过慢。因此就出现了目前的DNS服务器的模型。
下面我来介绍一下现在DNS服务器的模型。
1、最上面的 . 代表根域,是域名系统中最大的域名,他只负责直接处于其下面的域名,不负责其他的域。
2、第二层的.com、.net、.cn、.us这些域名是顶级域,也称一级域。他也只负责直接处于其下面的域名,不负责其他的域,不知道处于其上面的父域的存在。且这些域都是独立的命名空间,意思就是在两个不同的一级域内,可以有两个名称相同的子域。
3、第三层的.baidu、.movekj、.sina这些都是二级域,,也只负责直接处于其下面的域名,不负责其他的域,不知道处于其上面的父域的存在。且这些域都是独立的命名空间,意思就是在两个不同的一级域内,可以有两个相同名称的子域。在每个二级域的下面也可以分其他的子域,在其子域下面还可以分其他的子域......。
ps:上面的每一个域内都有专门的DNS服务器,这些服务器负责接收并响应本域内的主机名的名称解析请求,且每台服务器上都存有本域主机的主机名和其IP地址对应关系的解析库。
基于上面的DNS模型的,DNS客户端在基于DNS服务器做www.baidu.com这个主机名的名称解析的步骤如下:(客户端在网络配置中配置DNS服务器的IP地址)
1、DNS客户端把www.baidu.com这个主机名的名解析请求发送给DNS服务器,
2、DNS服务器接收到客户端的查询请求后,判断该请求的主机名的.baidu.com这个域是不是本机负责的,如果是则该服务器直接返回解析结果给DNS客户端;否则该服务器会把该请求转发给根域。
3、根域的DNS服务器收到请求后,则根据请求的主机名的顶级域名.com返回.com顶级域的DNS服务器的IP地址给发起该请求的DNS服务器;
4、DNS服务器收到结果后,会根据结果中的.com域的DNS服务器的IP,把请求发送给.com域的DNS服务器;
5、.com域的DNS服务器收到请求后,则根据请求的主机名的二级域.baidu.com返回.baidu.com二级域名的DNS服务器的IP地址给发起该请求的DNS服务器;
6、 DNS服务器收到结果后,会根据结果中的.baidu.com域的DNS服务器的IP,把请求发送给.baidu.com域的DNS服务器;
7、.baidu.com域的DNS服务器收到请求后,则会判断本域有没有叫www.baidu.com主机名的主机,如果有,则返回www.baidu.com主机名的IP地址给发起该请求的DNS服务器,若没有,则返回给发起该请求的DNS服务器一个否定答案。
8、DNS服务器得到结果后就把结果回应给DNS客户端。 DNS客户端得到结果后,如果结果是否定答案,就把否定答案缓存在本地。否则,就会根据结果中的IP地址请求相关服务。
PS:在上面的过程中,DNS客户端把请求发送给DNS服务器这个过程称之为递归查询,DNS服务器到其他DNS服务器帮DNS客户端查询请求的过程称之为迭代查询。
DNS服务器类型:在DNS服务器中,根据DNS服务器所完成的功能不同,分为不同的类型。类型主要有以下几种:
缓存DNS服务器:不负责任何域的解析请求,负责接收本地DNS客户端的请求,并转发请求,且缓存解析到的结果。
主DNS服务器:负责一个域或多个域内的主机名解析请求,且负责接收本地DNS客户端的请求,并转发请求。且缓存解析外部域的主机名到的结果。
辅助DNS服务器:负责一个域或多个域内的主机名解析请求,且负责接收本地DNS客户端的请求,并转发请求。且缓存解析外部域的主机名到的结果。
转发器:不负责任何域的解析请求,负责接收本地DNS客户端的请求,并转发请求,但不缓存解析到的结果。
现代的互联网中,很多的DNS服务器都是使用bind这个软件来提供DNS主机名解析服务。配置bind的时候主要需要配置/etc/named.conf配置文件,而后给每个区域创建区域配置文件。在每个区域配置文件中常用的有以下几种资源记录类型:
通用格式:
name [ttl] IN RRT value
name:资源记录名称
ttl:资源记录缓存时长(可以省略)
RRT(resouce record type):资源记录类型
vlaue:该条资源记录的值
资源记录类型
SOA(起始授权记录):定义了该区域谁是主DNS服务器、管理员邮箱地址、否定答案的缓存时间,且定义了该区域中的主从DNS服务器直接的数据如何同步。
NS(域名服务器记录):定义了该区域内的DNS服务器,可以有多条。(需要有正向解析记录)
MX(邮件服务器记录):定义了该区域内的邮件服务器,可以有多条。(需要有正向解析记录)
A(正向解析记录):定义了该区域内的主机的主机名与IP地址的对应关系,可以有多条。
PTR(反向解析记录):定义了该区域内的主机的IP地址与I主机名的对应关系,可以有多条。