1 网络分层协议栈
网络可以按4层分,由下往上分别为:
L2
:数据链路层,常见协议为ethernetL3
:网络层,常见协议为IPv4/IPv6L4
:传输层,常见协议为TCP/UDP/SCTPL5
:应用层,常见协议为DNS/HTTP/TLS/SSL
4层网络视图如下:
L5 |
---|
L4 |
L3 |
L2 |
2 DNS
2.1 DNS协议的组成
DNS协议,英文全称为Domain Name System,是网络的基础协议,主要用于域名与IP地址之间的翻译转化。
DNS协议,主要分为2个独立内容:
- 说明域名的语法与规则以便组成树状名称空间(构建数据记录)。基本语法为
local.group.site
;域名全球唯一 - 说明如何高效地实现域名与IP地址之间的翻译(查询数据记录),主要依赖分布式/分层的域名方案,采用C/S架构进行DNS查询
2.1.1 DNS 3大组件元素
参考rfc1034,DNS有如下3个组件元素:
域名名称空间与资源记录RR
- 名称空间,说明DNS查询的方向
- 资源记录,即最终DNS查询的结果
NS服务器(即权威DNS服务器)
- 存储其负责域名的域名名称空间与资源记录RR
解析服务器(即本地DNS服务器)
- 用户应用程序DNS查询的第一站
- 与用户应用程序直接相连
- 可以访问到NS服务器
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的示例如下:
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协议文档,参考:
- Domain Names - Concepts and Facilities 提纲挈领 http://www.ietf.org/rfc/rfc1034.txt
- Domain Names - Implementation and Specification 报文格式 http://www.ietf.org/rfc/rfc1035.txt
- DNS Encoding of Network Names and Other Types https://www.ietf.org/rfc/rfc1101.txt
- New DNS RR Definitions https://www.ietf.org/rfc/rfc1183.txt
- DNS NSAP RRs https://www.ietf.org/rfc/rfc1348.txt
- A Means for Expressing Location Information in the Domain Name System https://www.ietf.org/rfc/rfc1876.txt
- Serial Number Arithmetic https://www.ietf.org/rfc/rfc1982.txt
- Clarifications to the DNS Specification https://www.ietf.org/rfc/rfc2181.txt
- Negative Caching of DNS Queries (DNS NCACHE) https://www.ietf.org/rfc/rfc2308.txt
- Domain Name System Security Extensions https://www.ietf.org/rfc/rfc2535.txt
- Extension Mechanisms for DNS http://www.ietf.org/rfc/rfc2671.txt
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数据.Question区格式如下:
DNS数据.RR格式如下:Answer/Authority/Additional区共用这个格式
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服务器查询结果
- 客户端向本地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里展示情况如下: