C.dns协议

1 网络分层协议栈

网络可以按4层分,由下往上分别为:

  • L2:数据链路层,常见协议为ethernet
  • L3:网络层,常见协议为IPv4/IPv6
  • L4:传输层,常见协议为TCP/UDP/SCTP
  • L5:应用层,常见协议为DNS/HTTP/TLS/SSL

4层网络视图如下:

L5
L4
L3
L2

2 DNS

2.1 DNS协议的组成

DNS协议,英文全称为Domain Name System,是网络的基础协议,主要用于域名与IP地址之间的翻译转化。
DNS协议,主要分为2个独立内容:

2.1.1 DNS 3大组件元素

参考rfc1034,DNS有如下3个组件元素:

  • 域名名称空间与资源记录RR
    • 名称空间,说明DNS查询的方向
    • 资源记录,即最终DNS查询的结果
  • NS服务器(即权威DNS服务器)
    • 存储其负责域名的域名名称空间与资源记录RR
  • 解析服务器(即本地DNS服务器)
    • 用户应用程序DNS查询的第一站
    • 与用户应用程序直接相连
    • 可以访问到NS服务器

DNS的3大组件元素

DNS 3元素

2.1.2 树状名称空间NS

参考rfc1034,树状名称空间NS被构建为树状:

  • 顶层为根,可以理解为对应的根 DNS服务器
  • 第二层节点,可以理解为对应的TLD DNS服务器
  • 第三层节点,可以理解为对应的权威 DNS服务器
  • 剩下的层,为更细化的域名
  • 最后的叶子,也是域名
  • 这样,符合DNS规范的域名,都可以在这个树状名称空间NS里找到
  • 查询域名,变为查询特定的子树里的节点

树状名称空间示例:

树状名称空间

2.1.3 资源记录RR

参考rfc1034,资源记录RR存储着域名相关的数据信息:

  • IP地址CName
  • 每一个数据,为一条资源记录RR
  • IP地址为A记录
  • CName为CName记录
  • 一个域名下,可以有多个资源记录

资源记录RR的组成如下:
RR的组成

资源记录RR的示例如下:
RR的示例

2.2 DNS协议的识别

DNS协议一般承载于传输层即L4,比如TCP/UDP。

  • 域名与IP地址之间的翻译转化,承载于UDP
  • 区域传输(用于交换数据库记录),承载于TCP

DNS协议,一般通过传输层端口识别,对应tcp.port/udp.port为53

4层网络视图如下:

L5:DNS
L4:TCP.port/UDP.port=53
L3
L2

2.3 DNS协议文档

DNS协议文档,参考:

2.4 DNS报文格式

DNS报文,参考rfc1035,一般分为DNS头DNS数据

DNS头,固定12字节,一定存在。

  • ID:16bit
    • 由客户端设置,由服务器返回
    • 客户端用它来匹配响应与查询
  • QR:1bit
    • 0表示DNS请求,1表示DNS响应
  • OpCode:4bit
    • 说明DNS请求的类型,由客户端设置,服务器拷贝回填
    • 0,标准查询
    • 1,反向查询
    • 2,服务器状态请求
    • 3-15,保留
  • AA:1bit
    • 只在DNS响应里有效
    • 说明对应的回答为权威回答
  • TC:1bit
    • 表示"可截断的",由于DNS消息长度超过传输层的允许长度
    • 使用UDP时,它表示当应答的总长度超过512字节时,只返回前512个字节
  • RD:1bit
    • 在DNS请求中设置,DNS响应中拷贝回填返回
    • 设置后,它告诉服务器执行递归查询;
  • RA:1bit
    • 表示"递归可用"。
    • 如果服务器支持递归查询,则在响应中设置该字段;
  • Z:3bit
    • 保留
    • 在DNS请求-DNS响应消息里,均为0即b’000’
  • RCODE:4bit
    • DNS响应码,作为DNS响应的一部分
    • 0(NoError)、1(Format error)、
    • 2(Server failure)、3(Name Error)
    • 4(Not Implemented)、5(Refused)
    • 6-15 保留
  • QDCOUNT:16bit
    • DNS消息的Question区的数目
    • DNS请求消息里,通常为1,后面3个字段为0
  • ANCOUNT:16bit
    • DNS消息的Answer区的数目
    • DNS响应消息里,至少为1
  • NSCOUNT:16bit
    • DNS消息的Authority区的数目
  • ARCOUNT:16bit
    • DNS消息的Additional区的数目

DNS数据,参考rfc1035,共有4个部分:根据DNS头判断是否存在。

  • Question区:QDCOUNT说明其数目
  • Answer区:ANCOUNT说明其数目
  • Authority区:NSCOUNT说明其数目
  • Additional区:ARCOUNT说明其数目

DNS报文格式如下:
DNS报文格式

DNS头格式如下:
DNS头格式

DNS数据.Question区格式如下:
DNS请求区格式

DNS数据.RR格式如下:Answer/Authority/Additional区共用这个格式
RR记录格式

2.5 DNS查询流程

客户端要进行域名-IP地址的翻译转化,一般情况下由客户端发起DNS查询流程:

  • DNS查询依赖于C/S架构,由客户端发起DNS请求,由DNS服务器返回DNS响应
  • DNS查询具体可以分为2个阶段:
    • 客户端向本地DNS服务器进行DNS查询:
      • 一般采用递归查询
      • 查询成功则由本地DNS服务器直接返回DNS响应
      • 查询失败则由本地DNS服务器继续向外部DNS服务器查询后返回DNS响应
    • 本地DNS服务器向外部DNS服务器进行查询:第一阶段失败后激活
      • 一般采用迭代查询
      • 涉及逐层查询根DNS服务器、TLD DNS服务器、NS DNS服务器
      • 最终由NS DNS服务器告诉本地DNS服务器查询结果

2.6 DNS缓存机制

如果每一次访问域名,都需要客户端进入DNS查询流程,显然太过耗时:

  • 第一阶段查询,限于本地,查询时延较低
  • 第二阶段查询,需要外部DNS服务器,查询时延较高

为了降低域名-IP地址的翻译转化时延,DNS加入缓存机制:

  • 将之前查询的结果,缓存起来
  • 下次访问相同域名,若缓存命中则不必进入耗时的DNS查询流程
    • 缓存命中,则网络上将没有相关的DNS流量*
  • 缓存有超时机制,即TTL,超时后会自动删除缓存

DNS缓存层次:

  • 浏览器的缓存
  • OS的缓存
  • 本地DNS服务器的缓存

2.7 DNS报文

可以在本地电脑上抓取DNS报文。

  • 先清空dns缓存:ipconfig /flush
  • 再发出DNS请求:ping douban.com

DNS报文在wireshark里展示情况如下:
DNS报文在wk里展示情况

2.8 参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值