本章我们主要介绍一下ngx_resolver.c源文件,其主要是实现对nginx中涉及到的域名的解析。
1. ngx_resolver_hdr_t数据结构
ngx_resolver_hdr_t
定义了DNS报文结构的头部。关于各字段的含义,请参看DNS协议详解及报文格式分析
2. ngx_resolver_qs_t数据结构
此结构定义了DNS查询报文中的Queries区域
。其中type
用于指明查询类型; class
用于指明查询类。
3. ngx_resolver_an_t数据结构
此结构定义了DNS应答报文中的Answers区域
4. 相关静态函数声明
5. 函数ngx_resolver_create()
本函数用于创建一个ngx_resolver_t
对象。在介绍本函数的具体实现之前,我们先来大体看一下resolver的配置:
resolver 223.5.5.5 223.6.6.6 1.2.4.8 114.114.114.114 valid=3600s;
因此,如果解析到此resolver
命令时调用ngx_resolver_create()函数,那么names
将为后面所有以空格分隔的字符串。
下面介绍一下本函数的大体实现流程:
5. 函数ngx_resolver_cleanup()
此函数是ngx_resolver_t对象的pool被销毁时的回调函数,主要完成相关内存资源的回收以及关闭对应的连接:
6. 函数ngx_resolver_cleanup_tree()
本函数按从小到大的顺序依次删除ngx_resolver_t
中相应红黑树的节点。并将该节点所关联的rn->waiting
链表中的上下文对象进行删除。
7. 函数ngx_resolve_start()
本函数用于创建ngx_resolver_t
的上下文。如果传入的参数temp不为NULL,且temp->name
能够被解析为一个IPv4地址,则复用temp,将其作为r
的上下文对象; 否则新建一个新的上下文对象。
这里注意,当temp->name
能够成功解析为IP地址时,会将temp->quick置为1,这样后续就不再需要请求DNS来解析了。
8. 函数ngx_resolve_name()
在介绍本函数之前,我们先大体说明一下DNS的服务查询(SRV)的格式:
_ldap._tcp.example.com
下面我们再来简单介绍本函数的实现:
9. 函数ngx_resolve_name_done()
此函数用于处理当解析完成(可能成功,也可能失败),进行相应的收尾工作。下面我们先简要介绍一下通过服务名来查询IP
返回报文的基本格式:
_Service._Proto.Name TTL Class SRV Priority Weight Port Target
下面是本函数的基本流程:
10. 函数ngx_resolve_name_locked()
本函数实现的主要功能就是向DNS服务器发起域名查询
或服务名查询
。下面我们简要分析一下函数的实现步骤:
11. 函数ngx_resolve_addr()
本函数进行DNS逆查询,即通过DNS,查询ctx->addr
地址所对应的域名。下面简要介绍一下本函数的实现:
12. 函数ngx_resolve_addr_done()
此函数用于处理当解析完成(可能成功,也可能失败),进行相应的收尾工作:
13. 函数ngx_resolver_expire()
此函数用于淘汰相应超时队列上的1~2个超时节点。
14. 函数ngx_resolver_send_query()
此函数用于向DNS服务器发送相应的查询报文。
15. 函数ngx_resolver_send_udp_query()
采用UDP方式向DNS服务器发送查询报文
16. 函数ngx_resolver_send_tcp_query()
以TCP方式向DNS服务器发送查询报文。如果连接没有建立,则创建对应的连接,并设置好读写缓冲。
[参看]
-
Nginx DNS resolver配置实例
-
nginx关于域名解析的源码分析
-
DNS协议详解及报文格式分析
-
DNS系统SRV和NAPTR记录类型说明
-
DNS中的协议字段定义
-
DNS RFC文档