client module
2016-10-14 17:31:21 0 举报
AI智能生成
bind9 client模块,从接收,处理,封装全过程跟踪
作者其他创作
大纲/内容
ns_interfce_listenudp
ns_clientmgr_createclients
client_create
event_init(client_start)
tcp client_accept
udp client_udprecv
event_recv client_request
event_send client_done
dns_message_create
ns_interface_accepttcp
client 结构示意重要说明
opt 类型: rdataset,对应dns message opt.
填充数据的数据结构为rdata
rdata说明
struct dns_rdata {
unsigned char * data;
unsigned int length;
dns_rdataclass_t rdclass;
dns_rdatatype_t type;
unsigned int flags;
ISC_LINK(dns_rdata_t) link;
};
作用:作为回应包的opt选项填充
由函数client_addopt实现
query
struct ns_query {
unsigned int attributes;
unsigned int restarts;
isc_boolean_t timerset;
dns_name_t * qname;
dns_name_t * origqname;
unsigned int dboptions;
unsigned int fetchoptions;
dns_db_t * gluedb;
dns_db_t * authdb;
dns_zone_t * authzone;
isc_boolean_t authdbset;
isc_boolean_t isreferral;
isc_mutex_t fetchlock;
dns_fetch_t * fetch;
isc_bufferlist_t namebufs;
ISC_LIST(ns_dbversion_t) activeversions;
ISC_LIST(ns_dbversion_t) freeversions;
};
client封装过程
event-recv
socketevent
struct isc_socketevent {
ISC_EVENT_COMMON(isc_socketevent_t);
isc_result_t result; /* OK, EOF, whatever else */
unsigned int minimum; /* minimum i/o for event */
unsigned int n; /* bytes read or written */
unsigned int offset; /* offset into buffer list */
isc_region_t region; /* for single-buffer i/o */
isc_bufferlist_t bufferlist; /* list of buffers */
isc_sockaddr_t address; /* source address */
isc_time_t timestamp; /* timestamp of packet recv */
struct in6_pktinfo pktinfo; /* ipv6 pktinfo */
isc_uint32_t attributes; /* see below */
isc_eventdestructor_t destroy; /* original destructor */
};
从socket获取的数据,放在region
确定buf指针,指向regoin
dns_message_peekheader,查看是请求还是应答
应答就下放给dispather
dns_message_parse,解析请求数据包
将包解析并填充message结构,header如图
client_request
query ns_query_start
query_find(client)
process
query_addrrset
query_send
ns_client_send
dns_compress_init
dns_message_renderbegin
dns_message_setopt
dns_message_rendersection
分别填充
DNS_SECTION_QUESTION
DNS_SECTION_ANSWER
DNS_SECTION_AUTHORITY
DNS_SECTION_ADDITIONAL
dns_message_renderend
client_sendpkg
ns_client_next
exit_check
query_getdb(client)
query_getzonedb
dns_zt_find
dns_rbt_findname
dns_rbt_findnode
dns_name_fullcompare
dns_db_find(dns_db)
imp-zone_methods|cache_methods
static dns_dbmethods_t zone_methods = {
attach,
detach,
beginload,
endload,
dump,
currentversion,
newversion,
attachversion,
closeversion,
findnode,
zone_findzonecut,
attachnode,
detachnode,
expirenode,
printnode,
createiterator,
zone_findrdataset,
allrdatasets,
addrdataset,
subtractrdataset,
deleterdataset,
issecure,
nodecount,
ispersistent,
overmem,
settask
zone_find
(dns_db转换类型为dns_rbtdb) @rbtdb.c
dns_rbt_findnode(dns_rbt)
query_addrrset
dns_message_findname
query_addrdataset
(master|xfrout.c)ns_xfr_start
get start serial,end serial,find jouranl,bindstream,
sendstream
[recv] update ns_update_start
send_update_event
update_action
cname|cname_incompatible_rrset_exists
cname,ns exculde|rrset_exists
do_diff
diff_apply
dns_journal_write_transaction
dns_journal_begin_transaction
*dns_journal_writediff[写日志文件注意转化为line线路标示]
dns_journal_commit
notify ns_notify_start
[recv] update dns_message_parse
getsection
newrdata
xfrout.c[recv][master] ns_xfr_start
*sendstream
dns tree struct
TLD domain chain
-------------------------------------- |
wwww www mail next |
-------------------------------------- |
a abc test down |
-------------------------------------- |
* wild |
-------------------------------------- node
dns_zone_load
zone_load
dns_db_create
zone_startload
dns_db_beginload|主要完成callback[*addp = loading_addrdataset,loadp=loadctx]
dns_master_loadfile
load
gettoken
isc_lex_gettoken
dns_rdataclass_fromtext
COMPARE in
find line
coverto uint
*[master.c]|dns_rdata_fromtext
*commit
loading_addrdataset
dns_rdataslab_fromrdataset
add
dns_db_endload
zone_postload
[send] update nsupdate
setup_system
getinput
user_interaction
get_next_command
evaluate_update
update_addordelete
start_update
zone && server is sure |send_update
[normal] sendrequest,query soa
sendrequest
dns_request_createvia3
recv response
recvsoa
send_update
dns_request_createvia3
dns_message_rendersection
DNS_SECTION_UPDATE 默认是DNS_SECTION_AUTHORITY
*add_rr_prepare_action
先比较rdata值是否相等
1(rdata值重复的记录值并且ttl也相等的,不添加,忽略不提示,直接返回)
2 对于type为cname,dname,soa,nsec 这类解析,只能存在一个,
如果要添加,必须先删除已经存在的,再添加新值
3 对于ttl不等的,删除原有解析值,然后如果记录值也不等的,添加新解析值
dns_zone_dump
[masterdump.c]dns_master_dump
dumptostreaminc
使用dbiterator来封装数据
allrdatasets
dump_rdatasets
dump_done
*dns_journal_compact(注意jnl文件的体积)
xfr
[slave ] in
[master] out
journal
read_one_rr|journal.it加一个line,文件写线路名字,读的时候转换成line数字表达
header{
{format【16】
begin
end
indexsize 有几条记录
}union h
pad[64]
}
rawpos {
serial[4]
offset[4]
}
journal format
header|rawpos|rawpos|...indexsize..|rawpos|

收藏
0 条评论
下一页