本章我们主要介绍一下ngx_resolver.c源文件,其主要是实现对nginx中涉及到的域名的解析。
1. 函数ngx_resolver_lookup_name()
此函数用于根据名称domain name
从指定红黑树中查找节点。
2. 函数ngx_resolver_lookup_srv()
此函数用于根据名称service name
从指定红黑树中查找节点。
3. 函数ngx_resolver_lookup_addr()
此函数用于根据addr
从指定红黑树中查找节点。
4. 函数ngx_resolver_lookup_addr6()
此函数适用于IPv6从指定红黑树中查找节点(当前我们并不支持NGX_HAVE_INET6
宏定义)
5. 函数ngx_resolver_rbtree_insert_value()
此函数用于向以temp
为根的红黑树中插入节点node
。
6. 函数ngx_resolver_rbtree_insert_addr6_value()
此函数用于向以temp
为根的红黑树中插入节点node
。(用于IPv6,当前我们并不支持此宏定义)
7. 函数ngx_resolver_create_name_query()
此函数用于构造域名查询IP
的报文。报文格式如下:
ngx_resolver_hdr_t
domain name
ngx_resolver_qs_t
注意构造查询报文时会设置:
即会保存查询报文及长度。
8. 函数ngx_resolver_create_srv_query()
此函数用于构造服务名查询IP
的报文。报文格式如下:
ngx_resolver_hdr_t
service name
ngx_resolver_qs_t
注意构造查询报文时会设置:
即会保存查询报文及长度。
9. 函数ngx_resolver_create_addr_query()
此函数用于构造向DNS服务器进行逆查询的报文,即查询addr
地址处的域名。报文格式如下:
ngx_resolver_hdr_t
查询IP
in-addr4arpa
PTR
注意,我们在构造查询报文时还会将报文内容
及长度
保存在rn上。
10. 函数ngx_resolver_copy()
此处主要是为了处理DNS返回的压缩指针。这里请参看[rfc1035 Message compression]。
11. 函数ngx_resolver_timeout_handler()
此函数作为context在超时(context->timeout)之后的回调函数
12. 函数ngx_resolver_free_node()
此函数用于释放一个ngx_resolver_node_t
节点。删除如下:
1) query查询报文
2) name查询域名或服务名
3) 规范名称canonical name
4) 解析到的IP地址信息
5) SRV查询时的目标服务器信息
13. resolver相关的内存分配与释放
14. 函数ngx_resolver_dup()
分配一块size
大小的内存,并进行数据拷贝。
15. 函数ngx_resolver_export()
此函数用于导出ngx_resolver_node_t
节点中的ip地址信息。参数rotate
用于控制是否以一个随机的起始点导出数据。
16. 函数ngx_resolver_report_srv()
此函数用于按一定的顺序报告查询到的ip地址信息。
17. 函数ngx_resolver_strerror()
打印指定错误码的error信息。
18. 函数ngx_resolver_log_error()
用于将日志格式话到buf
中。
19. 函数ngx_udp_connect()
此函数首先采用socket()
方法构造一个fd,然后调用非阻塞的connect()连接到指定地址。注意: 针对UDP建立连接,那么后续在发送时就可以不用指定目标地址。
20 函数ngx_tcp_connect()
此函数用于建立一个tcp连接。下面我们简要分析一下建立流程:
21. 函数ngx_resolver_cmp_srvs()
根据priority
来比较两个ngx_resolver_srv_t类型对象的大小。
[参看]
-
Nginx DNS resolver配置实例
-
nginx关于域名解析的源码分析
-
DNS协议详解及报文格式分析