[发明专利]无锁DNS缓存方法和DNS服务器有效
申请号: | 202011363848.2 | 申请日: | 2020-11-27 |
公开(公告)号: | CN112543237B | 公开(公告)日: | 2023-07-11 |
发明(设计)人: | 袁立志;吴琦;孙浩然;邢志杰;毛伟 | 申请(专利权)人: | 互联网域名系统北京市工程研究中心有限公司 |
主分类号: | H04L61/4511 | 分类号: | H04L61/4511;G06F9/52;G06F16/22 |
代理公司: | 北京市万慧达律师事务所 11111 | 代理人: | 黄玉东 |
地址: | 101408 北京市怀柔区雁*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | dns 缓存 方法 服务器 | ||
本申请涉及一种无锁DNS缓存方法和DNS服务器;所述方法包括:创建多个hash桶,每个hash桶都是一个单链表;获取原始DNS报文,并将DNS报文解析成结构体;从解析的结构体中获取请求域名和请求类型,并根据请求域名和请求类型确定该DNS报文对应的hash桶;根据解析结果生成新的链表节点,并将该链表节点插入确定出的hash桶的单链表中。本申请的方案使用无锁hash链表方式来替代锁,既保证了数据的一致性、稳定性又能提高读写的性能,解决了高性能需求下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协议段中的每个资源记录的偏移。
进一步地,所述根据解析结果生成新的链表节点,包括:
将原始报文和解析后生成的结构体存储到链表节点中。
进一步地,所述方法还包括:
对链表节点的修改操作需要在所有的读操作都完成时进行,并通过原子操作改变新节点的上游节点的指向。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于互联网域名系统北京市工程研究中心有限公司,未经互联网域名系统北京市工程研究中心有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/202011363848.2/2.html,转载请声明来源钻瓜专利网。