无锁DNS缓存方法和DNS服务器技术

技术编号:27776290 阅读:15 留言:0更新日期:2021-03-23 13:16
本申请涉及一种无锁DNS缓存方法和DNS服务器;所述方法包括:创建多个hash桶,每个hash桶都是一个单链表;获取原始DNS报文,并将DNS报文解析成结构体;从解析的结构体中获取请求域名和请求类型,并根据请求域名和请求类型确定该DNS报文对应的hash桶;根据解析结果生成新的链表节点,并将该链表节点插入确定出的hash桶的单链表中。本申请的方案使用无锁hash链表方式来替代锁,既保证了数据的一致性、稳定性又能提高读写的性能,解决了高性能需求下DNS缓存存在读写瓶颈的问题;无锁设计提高了DNS缓存读写的性能,同时兼顾了线程安全。

【技术实现步骤摘要】
无锁DNS缓存方法和DNS服务器
本申请涉及域名解析
,具体涉及一种无锁DNS缓存方法和DNS服务器。
技术介绍
传统的DNS缓存是将每个资源记录集(RRSET)中的RR分别进行存储(RFC2136:https://tools.ietf.org/html/rfc2136),查找时再将每一条记录组合成RRSET进行应答。当客户端发起DNS域名请求,如果DNS递归服务器中有请求的域名的缓存数据就会立即应答给客户端,即读取DNS缓存;如果DNS递归服务器的缓存中不存在请求的域名则会向外递归或迭代得到请求域名的结果,向客户端应答同时进行缓存,即写入DNS缓存。DNS递归服务器接收的域名请求中有95%以上的域名会直接命中缓存,所以可以看出DNS缓存是一种读多写少的数据集。为了提高DNS递归服务器的性能并保证数据的一致性,递归服务器多采用多线程的架构,在每个线程中都会发生读写操作,为保证数据的安全性,就需要对缓存加锁。相关技术中,无论是互斥锁还是读写锁,当写操作发生时,所有其他读操作和写操作要等待写操作完成,即使对于DNS缓存读多写少,随着对性能需求的增长,使用锁操作的DNS缓存也会成为DNS递归服务器性能的瓶颈点。
技术实现思路
为至少在一定程度上克服相关技术中存在的问题,本申请提供一种无锁DNS缓存方法和DNS服务器。根据本申请实施例的第一方面,提供一种无锁DNS缓存方法,包括:创建多个hash桶,每个hash桶都是一个单链表;获取原始DNS报文,并将DNS报文解析成结构体;从解析的结构体中获取请求域名和请求类型,并根据请求域名和请求类型确定该DNS报文对应的hash桶;根据解析结果生成新的链表节点,并将该链表节点插入确定出的hash桶的单链表中。进一步地,所述根据请求域名和请求类型确定该DNS报文对应的hash桶,包括:将请求域名和请求类型拼接为字符串;对该字符串进行散列运算,得到hash值H;根据H确定对应的hash桶。进一步地,所述根据H确定对应的hash桶,包括:hash桶的数量为M个,将H对M取模得到数值N;编号为N的hash桶即为对应的hash桶。进一步地,所述将DNS报文解析成结构体,包括:在将DNS报文解析成结构体的同时,将原始报文中的每个部分的偏移记录到结构体中,包括每个DNS协议段中的每个资源记录的偏移。进一步地,所述根据解析结果生成新的链表节点,包括:将原始报文和解析后生成的结构体存储到链表节点中。进一步地,所述方法还包括:对链表节点的修改操作需要在所有的读操作都完成时进行,并通过原子操作改变新节点的上游节点的指向。进一步地,所述方法还包括:读线程和写线程互相分离,并分别配置读线程和写线程的数量。根据本申请实施例的第二方面,提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如上任意一种实施例所述无锁DNS缓存方法的操作步骤。根据本申请实施例的第三方面,提供一种DNS服务器,所述服务器采用了如上任意一种实施例所述的无锁DNS缓存方法。本申请的实施例提供的技术方案具备以下有益效果:本申请的方案使用无锁hash链表方式来替代锁,既保证了数据的一致性、稳定性又能提高读写的性能,解决了高性能需求下DNS缓存存在读写瓶颈的问题;无锁设计提高了DNS缓存读写的性能,同时兼顾了线程安全。应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请。附图说明此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本申请的实施例,并与说明书一起用于解释本申请的原理。图1是根据一示例性实施例示出的一种无锁DNS缓存方法的流程图。图2是根据一示例性实施例示出的一种DNS报文解析成结构体(message)的示意图。图3是根据一示例性实施例示出的一种单链表的示意图。图4是根据一示例性实施例示出的一种在单链表中修改节点的示意图。具体实施方式这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的方法和装置的例子。图1是根据一示例性实施例示出的一种无锁DNS缓存方法的流程图。该方法可以包括以下步骤:步骤S1:创建多个hash桶,每个hash桶都是一个单链表;步骤S2:获取原始DNS报文,并将DNS报文解析成结构体;步骤S3:从解析的结构体中获取请求域名和请求类型,并根据请求域名和请求类型确定该DNS报文对应的hash桶;步骤S4:根据解析结果生成新的链表节点,并将该链表节点插入确定出的hash桶的单链表中。本申请的方案使用无锁hash链表方式来替代锁,既保证了数据的一致性、稳定性又能提高读写的性能,解决了高性能需求下DNS缓存存在读写瓶颈的问题;无锁设计提高了DNS缓存读写的性能,同时兼顾了线程安全。下面结合具体的应用场景,对本申请的方案进行拓展说明。一些实施例中,所述将DNS报文解析成结构体,包括:在将DNS报文解析成结构体的同时,将原始报文中的每个部分的偏移记录到结构体中,包括每个DNS协议段中的每个资源记录的偏移。如图2所示,为减少DNS报文组包的性能损耗,在将DNS报文解析成结构体(message)的同时,将原始报文(rawdata)也进行存储,并将原始报文中的每个部分的偏移记录到结构体中,包括每个DNS协议段(section)中的每个资源记录(RR)的偏移。利用偏移量可以对资源记录进行排序等操作。一些实施例中,所述根据请求域名和请求类型确定该DNS报文对应的hash桶,包括:将请求域名和请求类型拼接为字符串;对该字符串进行散列运算,得到hash值H;根据H确定对应的hash桶。一些实施例中,所述根据H确定对应的hash桶,包括:hash桶的数量为M个,将H对M取模得到数值N;编号为N的hash桶即为对应的hash桶。如图3所示,首先将创建M个hash桶(HT1,HT2,HT3,……),每个hash桶都是一个单链表。获取应答的原始DNS报文解析出来请求域名(qname)以及请求类型(qtype),利用qname+qtype进行散列运算得到HASH值H,对M取模得到桶值N,即第N个链表:N=H%M。一些实施例中,所述根据解析结果生成新的链表节点,包括:将原始报文和解析后生成的结构体存储到链表节点中。根据解析结果生成新的链表节点,向链表N中插入新节点,链表中每个节点存储的是原始报文(rawdata)和解析后生成的本文档来自技高网...

【技术保护点】
1.一种无锁DNS缓存方法,其特征在于,包括:/n创建多个hash桶,每个hash桶都是一个单链表;/n获取原始DNS报文,并将DNS报文解析成结构体;/n从解析的结构体中获取请求域名和请求类型,并根据请求域名和请求类型确定该DNS报文对应的hash桶;/n根据解析结果生成新的链表节点,并将该链表节点插入确定出的hash桶的单链表中。/n

【技术特征摘要】
1.一种无锁DNS缓存方法,其特征在于,包括:
创建多个hash桶,每个hash桶都是一个单链表;
获取原始DNS报文,并将DNS报文解析成结构体;
从解析的结构体中获取请求域名和请求类型,并根据请求域名和请求类型确定该DNS报文对应的hash桶;
根据解析结果生成新的链表节点,并将该链表节点插入确定出的hash桶的单链表中。


2.根据权利要求1所述的方法,其特征在于,所述根据请求域名和请求类型确定该DNS报文对应的hash桶,包括:
将请求域名和请求类型拼接为字符串;
对该字符串进行散列运算,得到hash值H;
根据H确定对应的hash桶。


3.根据权利要求2所述的方法,其特征在于,所述根据H确定对应的hash桶,包括:
hash桶的数量为M个,将H对M取模得到数值N;
编号为N的hash桶即为对应的hash桶。


4.根据权利要求1-3任一项所述的方法,其特征在于,所述将DNS报文解析...

【专利技术属性】
技术研发人员:袁立志吴琦孙浩然邢志杰毛伟
申请(专利权)人:互联网域名系统北京市工程研究中心有限公司
类型:发明
国别省市:北京;11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1