DNS

打印 上一主题 下一主题

主题 623|帖子 623|积分 1869

DNS

什么是DNS

DNS是域名系统(Domain Name System),简单来说就是平时上网输入的URL,如 www.baidu.com 就是域名,而DNS就是将这个域名解析成IP地址,如 www.baidu.com 的一个IP地址为 14.215.177.38,DNS使用的端口号为53,使用UDP协议
为什么需要DNS

因为在我们上网的过程中,IP地址很难记住,而域名相对说就简单很多,所以需要把我们的域名转换成IP地址
计算机为什么不使用域名和使用IP地址?

因为域名长度可变,计算机处理起来困难,而IP地址是定长的,处理起来简单很多
为什么需要分不同的域名服务器(如根域名...)

从理论上来讲,可以只需要一台服务器把所有的域名都装入这台服务器就可以,大家查询DNS的时候访问这个DNS服务器即可,为了安全也可以设置多个服务器,每台服务器都装入所有的IP地址,个人认为这样显然是可以的(如果担心访问量太大导致网络瘫痪就设置多个这样的服务器,而且同一个IP可以用多台主机来进行处理),书上的解释就是所有的主机都访问这一台DNS服务器导致瘫痪,期待更合理的解释
DNS解析过程


  • 首先看浏览器DNS的缓存,如果浏览器DNS缓存有,那么就直接访问;
  • 如果浏览器DNS没有相应的缓存,则看HOST文件,如果HOST有文件,则直接访问即可;
  • 如果发现还没有对应的IP地址,则主机需要向本地DNS服务器(ISP服务器或者自己手动设置的DNS服务器)发起查询,但是这里有一个问题,本地DNS服务器地址哪里来的?(如果是通过运营商上网的,会自动分配IP与设置DNS,如果是通过路由器上网的,那么就会通过DHCP的方式配置IP与DNS地址,具体可以百度DHCP客户端请求IP地址的过程,这里暂时还不太清楚,留下这个坑)
  • 本地DNS服务器收到请求后,会查看本机的DNS缓存,值得注意的是,本地DNS缓存需要安装诸如systemd-resolved,dnsmasq或nscd之类的缓存服务,如果没有安装,则没有操作系统级别的DNS缓存;
  • 本地DNS服务器发起请求(Ubuntu可以通过cat /etc/resolv.conf和nslookup [host]查看)
    ,在Ubuntu下,查看本地DNS的服务器的地址为127.0.0.53,显然这个是一个环回地址(环回地址的意思就是主机向自身发送消息,环回地址的IP为127.0.0.1 - 127.255.255.254),那么显然这个数据发送给本机的,本机肯定不能解析这个IP地址,实际上127.0.0.53相当于本地DNS服务器,127.0.0.53还有一个上游DNS服务器的地址(可以通过resolvectl查看)
    ,如果是通过路由器连接网络的,通常上游DNS的地址为路由器本身的地址,如192.168.1.1,那么这个上游DNS服务器怎么来的?本地主机连接路由器的时候,通过DHCP分配本机的IP地址,同时也会告诉主机DNS服务器地址,具体看DHCP篇,梳理一下这个过程就很好理解了,DNS请求首先发给本地DNS服务器127.0.0.53,本地DNS服务器把DNS请求发给路由器,之后路由器再根据上网方式的不同,比如路由器也可以通过DHCP上网,那么路由器也会获得DNS服务器的地址,比如进入路由器后台,查看得到路由器得到的两个DNS服务器地址,那么就是路由器收到DNS请求就把该请求转发路由器得到的这两个DNS服务器地址,之后就是DNS正常解析的流程
  • 需要补充的是,主机到本地DNS服务器(127.0.0.53)通常都是递归的方式进行查询,而本地DNS服务器与顶级域名服务器···(一级,二级,三级)通常都是迭代,如何从顶级域名到各级域名服务器可以百度,比较简单;
wireshark抓包分析


  • DNS数据报格式



  • 事务 ID(2字节):DNS 报文的 ID 标识。对于请求报文和其对应的应答报文,该字段的值是相同的。通过它可以区分 DNS 应答报文是对哪个请求进行响应的;
  • 标志(2字节):DNS 报文中的标志字段;

    • QR(Response):查询请求/响应的标志信息。查询请求时,值为 0;响应时,值为 1。
    • Opcode:操作码。其中,0 表示标准查询;1 表示反向查询;2 表示服务器状态请求。
    • AA(Authoritative):授权应答,该字段在响应报文中有效。值为 1 时,表示名称服务器是权威服务器;值为 0 时,表示不是权威服务器。
    • TC(Truncated):表示是否被截断。值为 1 时,表示响应已超过 512 字节并已被截断,只返回前 512 个字节。
    • RD(Recursion Desired):期望递归。该字段能在一个查询中设置,并在响应中返回。该标志告诉名称服务器必须处理这个查询,这种方式被称为一个递归查询。如果该位为 0,且被请求的名称服务器没有一个授权回答,它将返回一个能解答该查询的其他名称服务器列表。这种方式被称为迭代查询。
    • RA(Recursion Available):可用递归。该字段只出现在响应报文中。当值为 1 时,表示服务器支持递归查询。
    • Z:保留字段,在所有的请求和应答报文中,它的值必须为 0。
    • rcode(Reply code):返回码字段,表示响应的差错状态。当值为 0 时,表示没有错误;当值为 1 时,表示报文格式错误(Format error),服务器不能理解请求的报文;当值为 2 时,表示域名服务器失败(Server failure),因为服务器的原因导致没办法处理这个请求;当值为 3 时,表示名字错误(Name Error),只有对授权域名解析服务器有意义,指出解析的域名不存在;当值为 4 时,表示查询类型不支持(Not Implemented),即域名服务器不支持查询类型;当值为 5 时,表示拒绝(Refused),一般是服务器由于设置的策略拒绝给出应答,如服务器不希望对某些请求者给出应答。

  • 问题计数(2字节):DNS 查询请求的数目;
  • 回答资源记录数(2字节):DNS 响应的数目;
  • 权威名称服务器计数(2字节):权威名称服务器的数目;
  • 附加资源记录数(2字节):额外的记录数目(权威名称服务器对应 IP 地址的数目)。
以上,为DNS的头部,长度固定,为12字节

  • 问题部分

其中,查询名长度不固定,查询类型2字节,查询类长度2字节,在DNS请求报文中,只有以上部分,而查询名长度不固定,所以查询类型和查询类是通过DNS报文最后4个字节来确定的;
以上,就是DNS请求的所有部分

  • 在回复报文中,除了以上部分,还有如下三个:


    • 域名:DNS 请求的域名。
    • 类型:资源记录的类型,与问题部分中的查询类型值是一样的。
    • 类:地址类型,与问题部分中的查询类值是一样的。
    • 生存时间:以秒为单位,表示资源记录的生命周期,一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间。它同时也可以表明该资源记录的稳定程度,稳定的信息会被分配一个很大的值。
    • 资源数据长度:资源数据的长度。
    • 资源数据:表示按查询段要求返回的相关资源记录的数据。


  • 发送的DNS请求包,如图

    分别有以太网首部(14字节),IP数据报首部(固定部分20字节),之后是DNS数据报格式
  • 接收的DNS数据包


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万万哇

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表