zoukankan      html  css  js  c++  java
  • DNS协议详解

    DNS协议详解

    简介

    DNS(Domain Name System)域名系统,主要实现的功能是将域名转换成ip地址的一个服务。它是由一个分层DNS服务器实现的分布式数据库,同时。他也是一个使得主机能够查询分布式数据库的应用层协议。DNS服务器通常是一个运行BIND(Berkeley Internet Name Domain)软件的UNIX机器。DNS协议运行在UDP之上,使用53号端口。 DNS是一个应用层协议,其原因在于:

    • 使用客户端-服务器模式运行在通信的端系统之间。
    • 在通信的端系统之间通过下面的端到端运输协议来传送DNS报文。

    DNS的分层

    Host文件

    在讲DNS的分层之前,先说一下host文件,以window系统为例,在目录C:WindowsSystem32driversetc下有一个host文件,这个文件中记录了一个ip和域名的字典,当在浏览器中访问域名时,系统会默认先访问host文件查看是否存在访问域名的映射关系,如果不存在时,才将请求的域名发送给DNS系统进行解析获取对应的ip地址。

    DNS分层

    DNS的分层结构如下所示:

    graph TB A[根DNS服务器]-->B[com DNS服务器] A-->C[org DNS服务器] A-->D[edu DNS服务器] B-->E[yahoo.com DNS服务器] B-->F[amazon.com DNS服务器] A-->J[...] A-->K[...] C-->G[pbs.org DNS服务器] D-->H[poly.edu DNS服务器] D-->I[umass.edu DNS服务器] E-->L[...] E-->M[...]

    为了支持扩展性,DNS使用了大量的DNS服务器分布部署在各地,在各级DNS服务器子级又可以继续扩展出本地DNS服务器。这些DNS服务器大致可以分为三类:

    • 根DNS服务器
    • 顶级域(Top-lecel Domain,TLD)DNS服务器
    • 权威DNS服务器

    DNS缓存

    DNS的缓存是为了改善DNS解析的延迟性问题,同时减少因特网上的DNS报文数量。有了缓存之后,DNS服务器可以记住通过自己所解析的域名地址,并将他们缓存起来(缓存不是永久有效的,缓存时会有一个缓存时间设置TTL),同时,本地服务器也可以缓存TLD服务器的ip地址,从而在查询解析时绕过根DNS服务器,直接访问TLD服务器。

    DNS记录和报文

    资源记录

    共同实现DNS分布式数据库的所有DNS服务器存储了资源记录(Resource Record, RR),RR提供了主机名到IP地址的映射。每个DNS的响应报文都会包含一条或多条RR.资源记录是一个包含了下列字段的4元数组:
    (Name,Value.Type,TTL)
    其详细含义为:

    • TTL记录了生存时间,即缓存中资源记录的过期时间。
    • Type=A:此时Name是主机名,Value是主机名对应的Ip地址。
    • Type=NS:Name是个域(此处是类似foo.com的域不是域名),Value是一个DNS服务器的主机名,这个DNS服务器可以获取到(直接或者间接)Name域中主机IP地址。
    • Type=CNAME:Value是别名为Name的主机对应的规范主机名。即Name为主机别名和Value主机实际名称的映射
    • Type=MX:Value是别名为Name的邮件服务器的规范主机名

    范例
    假如一台edu TLD服务器不是主机gaia.cs.umass.edu的权威DNS服务器,则该服务器将包含一条包括主机cs.umass.edu的域记录。如(umass.edu,dns.umass.edu,NS);该edu TLD服务器还将包含一条类型A的记录,如(dns.umass.edu,128.119.40.111,A),该记录将名字dns.umass.edu映射为一个IP地址。

    DNS报文

    报文格式如下所示

    标识符 标志
    问题数 回答RR数
    权威RR数 附加RR数
    问题(问题的变量数)
    回答(资源记录的变量数)
    权威(资源记录的变量数)
    附加信息(资源记录的变量数)

    详细解释:

    • 前三行共12个字节是首部区域
      • 第一个字段(标识符)是一个16比特的数,用于标识该查询,这个标识符会被复制到对查询的回答报文中,作为请求报文的唯一标识,16个比特中有1比特是标识是查询报文(0)还是回答报文(1)
    • 问题区域包含着正在进行的查询信息。该区域包括:
      • 名字字段,表示正在被查询的主机名字。
      • 类型字段,表示有关改名字的正被询问的问题类型,例如类型A:主机地址是与一个名字相关联;类型MX表示主机地址域邮箱服务器相关联。
    • 回答区域包含了对最初请求的名字的资源记录。回答报文的回答区域中可以包含多条RR,因此一个主机名能够有多个IP地址。
    • 权威区域包含了其他权威服务器的记录
    • 附加区域包含了其他有帮助的记录。

    DNS数据库中插入记录

    DNS数据库中插入记录,需要向专门的注册登记机构,注册域名,由注册登记机构验证域名的唯一性。想注册登记机构提供域名是还需要向该机构提供你的基本和辅助权威DNS服务器的名字和IP地址。然后注册登记机构会将以下两条资源记录插入该DNS系统中(以注册networkutopia.com为例)

    • (networkutopoa.com,dns1.networkutopia.com,NS)
    • (dns1.netwworkutopia.com,212.212.212.1,A)
      之后其他用户就可以访问networkupopia.com这个域名,DNS请求会到达dns1这个DNS服务器解析ip地址。

    DNS通信流程

    假设本地机器访问域名networkutopoa.com其详细的协议通讯过程如下:

    1. 浏览器地址栏中输入networkutopoa.com
    2. 浏览器从url地址中获取域名networkutopoa.com,然后将域名传递给本机的DNS应用的客户端。
    3. DNS客户端向本地DNS服务器发送一个包含域名networkutopoa.com)的请求。
    4. 本地DNS服务器先查看本地缓存有没有要查询的域名,如果没有在查看本地缓存中的TLD服务器有没有与域名匹配的服务器地址,如果有直接向TLD服务器发送请求。如果没有则向根服务器请求TLD服务器地址。
    5. TLD服务器直接向本地DNS服务器发送回答。回答中包含了域名对应的ip地址。
    6. 浏览器收到ip地址之后,将请求发送到对应的ip地址上。

    递归查找,迭代查找

    DNS解析域名时主要有两种查询方式:

    • 递归查询
    • 迭代查询

    迭代查询算法

    迭代查询的核心时所有的请求都是直接返回给本地的DNS服务器,然后本地DNS服务器去对应的权威服务器等请求解析地址。整个过程中,只有请求主机到本地DNS服务器的查询时递归的,其余都是迭代的。

    graph TB A[请求主机]-->|1| B[本地DNS服务器] B-->|8|A B-->|2|C[根DNS服务器] C-->|3|B B-->|4|D[TLD DNS服务器] D-->|5|B B-->|6|E[权威DNS服务器] E-->|7|B

    递归查询算法

    递归的查询算法所有的查询都是递归的,详细流程如下所示。

    graph TB A[请求主机]-->|1| B[本地DNS服务器] B-->|8|A B-->|2|C[根DNS服务器] C-->|7|B C-->|3|D[TLD DNS服务器] D-->|6|C D-->|4|E[权威DNS服务器] E-->|5|D

    DDoS

    分布式拒绝服务(DDos)带宽洪范攻击,是一种常见的DNS攻击方式,其主要途径是向每个DNS根/权威服务器发送大量分组,是的大多数合法的DNS请求得不到答案,

    DNS提供的其他服务

    DNS除了完成将域名翻译成ip的任务外,还提供了以下辅助功能

    • 主机别名(host aliasing):DNS除了维护域名和Ip的关系外,还可以维护一套域名和别名的映射关系。比如,域名为www.relay1.west-coast.enterprise.com的主机,我们可以给他起一个别名叫,www.enterprise.com。当我们访问www.enterprise.com的时候,DNS服务器可以自动的跳转到域名www.relay1.west-coast.enterprise.com对应的地址上。
    • 负载分配(load distribution):加入一个域名后面对应多个ip地址。当请求DNS客户端的请求过来之后,DNS服务器可以按照一定的策略对多个ip实行负载分配

    TIP

    Windows环境下清空DNS缓存的命令是 ipconfig/flushdns 也可以通过重启DNS client 和 DHCP client 两项服务清空DNS缓存
    Windows环境下可以用命令 ipconfig /displaydns 来查看DNS缓存的内容
    nslookup 命令可以用来查看域名对应的IP地址,比如 nslookup jocent.me

    参考资料

    《计算机网络自顶向下方法》

  • 相关阅读:
    RESTFUL 设计风格
    GET与POST的区别
    pycharm 对数据库进行可视化操作
    ORM 的基本操作
    pycharm 直接删掉数据表之后,makemigration和migrate 之后,数据库中依然没有生成数据表的问题
    DOM
    BOM对象
    JavaScript
    traversal child window of parent window
    tkinter threading unblock GUI ( check if the thread exists)
  • 原文地址:https://www.cnblogs.com/liyong-blackStone/p/10330188.html
Copyright © 2011-2022 走看看