unbound源码分析
版本: 1.17.2
编译选项:
./configure --prefix=your_path --enable-subnet --enable-debug --with-libevent
请求调用栈:
看了worker_handle_request的源码,unbound也是存在ip维度的限速的。
dig qq.com @127.0.0.1
worker_init
初始化线程变量worker
在comm_base_set_slow_accept_handlers方法中传入worker_stop_accept和worker_start_accept函数指针以及worker,并设置到worker->base->stop_accept和worker->base->start_accept,worker->base->cb_arg。
在调用accpet相关函数指针时,就会传入worker->base->cb_arg。
设置worker->comsig的信号回调函数为worker_sighandler。处理信号为SIGHUP
、SIGINT
、SIGQUIT
、SIGTERM
。
设置worker->front为listen_create返回值(接收用户请求),主要回调方法是worker_handle_request
。
回调方法原型:typedef int comm_point_callback_type(struct comm_point*, void*, int, struct comm_reply*);
unbound使用struct comm_point来表示一个监听的socket。
- tcp类型的comm_point创建通过
comm_point_create_tcp
方法。其accept回调为comm_point_tcp_accept_callback
。 - udp类型的comm_point创建通过
comm_point_create_udp
方法。其回调为comm_point_udp_ancil_callback
。
unbound worker通过worker_handle_control_cmd来执行命令控制。
每个worker里面存在back字段来向权威服务器发起递归,主要是在worker_init
方法中调用outside_network_create
方法来初始化。
unbound的lruhash数据结构:动态增长的哈希表(当元素数量等于数组长度时,扩容为原来的2倍),采用lru机制来限制哈希表的内存使用量,当超过最大内存使用量时淘汰最少使用的元素。(原理跟java中的linkedhashmap差不多)
slabhash则是对lruhash进行一层封装,内部用数组存放多个lruhash,再进行一层hash,把数据分散到不同lruhash中。
unbound的region数据结构:内存分配缓冲区,分配的内存大于large_object_size
时,就调用malloc方法分配内存,然后用large_list
保存为单链表节点,如果当前需要的内存大小大于available
时,就malloc分配一块8192字节大小的内存块,然后用next
保存为单链表节点,使用data
保存当前分配的内存块,然后从内存块中划分一块内存出去。
unbound接收请求后,最后会保存为一个mesh事务树,然后依次调用subnet模块查ecs缓存、iterator模块发起递归请求。(方法mesh_run)
递归查询:iter_operate方法
- process_handle -> iter_handle
- iter_handle -> processInitRequest -> processQueryTargets -> worker_send_query -> outnet_serviced_query -> serviced_create(设置定时器,默认第一次触发就发送数据)
- process_response -> iter_handle -> processQueryResponse
超时回调:serviced_timer_cb、响应回调:worker_handle_service_reply
选路算法:
iter_server_selection
第一次发送数据:
serviced_timer_cb -> serviced_udp_send -> pending_udp_query(创建一个pending_udp_timer_cb的定时器) -> randomize_and_send_udp -> comm_point_send_udp_msg
响应路径:
comm_point_udp_ancil_callback -> outnet_udp_cb -> serviced_udp_callback -> serviced_callbacks -> worker_handle_service_reply -> mesh_report_reply -> mesh_run -> iter_operate -> process_response -> iter_handle -> processQueryResponse -> processFinished -> mesh_continue -> mesh_query_done -> mesh_send_reply -> comm_point_send_reply
标签:分析,udp,unbound,point,worker,源码,comm,handle From: https://www.cnblogs.com/Lht1/p/18107212