
bind源码分析
wellwang1993
这个作者很懒,什么都没留下…
展开
-
源起
bind是一款dns服务器软件,通常作为cdn各个厂商中解析环节的重要的一部分,这次因为有相关的功能需求,介于网上bind源码的分析也很少,于是只好自己动手了,在此做一个记录,主要想把这段时间有关dns的相关信息做一个总结,也是自己这段时间的一个输出。 因为涉及到公司内部的一些比较机密的信息,所以有关bind源码的分析部分会公开,而公司相关的一部分就进行保留。目前做解析的市面上大多数使用的都是b...原创 2018-10-22 15:28:53 · 244 阅读 · 0 评论 -
响应udp请求
在调用query_find查找到相应的数据以后,开始响应该请求了,具体调用的函数是query_send query_send(ns_client_t *client, query_log_t* q_log) { dump_answer(client, q_log); { //设置响应头 } ns_client_send(client); ...原创 2018-10-31 15:49:43 · 2622 阅读 · 0 评论 -
bind数据存储—Berkeley DB
这里还需要讲一个信息,就是bind的数据是通过怎样的方式组织起来的,Bind通过Berkeley DB的方式组织数据的,它是一个开源的文件数据库软件,介于关系数据库和内存数据库之间,使用方式和内存数据库类似,提供一系列可以直接访问数据库的函数,它可以保存任意类型的键值对 它的结构:它内部支持B+树,支持hash等算法 核心数据结构 数据库环境句柄DB_ENV:每个DB_ENV相当于一个...转载 2018-10-29 16:00:36 · 543 阅读 · 0 评论 -
处理udp请求
接下来就分析如何处理udp请求了,它主要用到的函数就是client_request client_request(isc_task_t *task, isc_event_t *event) { ns_client_t *client = event->ev_arg; //处理的连接数++ ns_client_requests++; //这里是udp协议过...原创 2018-10-25 18:46:32 · 2147 阅读 · 1 评论 -
db分析
我们在前面分析的都是socket相关,也就是它究竟是如何实现高并发的,然后分析到了client_request,这里有个内容绕不过去了,bind作为一款dns软件,它含有域名对应的A记录的解析,之前的做法中,他通过一个zone文件就实现这些资源的管理,但是这样就会带来一些问题,比如说如果采用zone文件的方式,那么他就需要将zone文件加载到内存中会消耗内存,或者zone文件含有很多记录的话会耽搁...原创 2018-10-25 13:51:50 · 468 阅读 · 0 评论 -
管理器之socket
上一篇主要介绍了任务管理器,这篇开始介绍socket管理器,我们知道服务器在支持并发的时候会有几种不同的方式,在讲解下面的内容之前,先回顾一下传统的tcp和udp是怎么进行通信的,这里由简单到复杂 1.第一种是最原始的tcp调用,服务端调用socket创建套接字进行通信,调用bind绑定端口,调用listen来监听端口是否有客户端请求过来,该函数用一个队列来保存未处理的连接请求,然后阻塞到...原创 2018-10-22 19:46:29 · 1009 阅读 · 0 评论 -
管理器
bind中有俩类重要的线程,一类是工作线程,它的任务就是跑业务代码,常见的查询,发送等就是它来实现的,一般线程的个数是cpu的个数;还有一类是管理socket的线程,一般就是一个,bind通过io多路复用来实现高并发,我这里就拿select来举例,这类线程负责监听fd的情况,包括增加,删除,针对读写调用相关action。它和工作线程之间的通信往往通过一对pipe进行。对各个线程的同步则通过条件变量...原创 2018-10-22 17:52:39 · 409 阅读 · 1 评论 -
启动server
在上面创建好管理器以后,中间还会有dlz即动态数据的加载,暂且把它们放到后面的部分来讲解,这里重点分析一下server的启动过程,为了和前面socket管理那一块相呼应,所以这里会重点讲一下根socket相关的部分,对于数据部分的加载我会在适当的时候进行分析 重要的数据结构: 1.db的类型,主要有三个 typedef enum { dns_dbtype_zone = 0, dns_dbty...原创 2018-10-24 19:02:56 · 847 阅读 · 0 评论