本章我们主要介绍一下ngx_resolver.c源文件,其主要是实现对nginx中涉及到的域名的解析。
1. 函数ngx_resolver_resend_handler()
此函数的作用是使用ngx_resolver_t.event来建立定时器事件,从而发发送resend队列中的任务。
2. 函数ngx_resolver_resend()
此函数用于处理resend队列中的到期任务,并返回最近一个没有到期的任务的剩余时间。
3. 函数ngx_resolver_resend_empty()
用于判断resend_queue中是否仍有待发送任务。
4. 函数ngx_resolver_udp_read()
从rev->data所表示的ngx_connection_t
中读取UDP数据,然后调用相应的方法处理数据。
5. 函数ngx_resolver_tcp_write()
此函数用于发送对应write_buf中的数据。下面简要介绍一下实现流程:
6. 函数ngx_resolver_tcp_read()
此函数读取TCP数据到buf中,并在读取到足够数据时调用ngx_resolver_process_response()来对DNS返回的数据进行处理。
7. 函数ngx_resolver_process_response()
本函数用于解析DNS返回的应答信息。下面我们简单分析一下实现流程:
8. 函数ngx_resolver_process_a()
此函数用于处理由域名获得IPv4(或IPv6)地址
的解析。下面简单介绍一下函数的处理流程:
9. 函数ngx_resolver_process_srv()
此函数用于处理由服务名获得IPv4(或IPv6)地址
的解析。下面简要介绍一下函数的处理流程:
10. 函数ngx_resolver_resolve_srv_names()
此函数用于解析rn->u.srvs
,即将规范化服务名称解析为IP地址
。下面简要讲解一下本函数的实现流程:
11. 函数ngx_resolver_srv_names_handler()
本函数是将规范化服务名称解析为IP地址
完成后的回调函数。涉及到两个context: 首先context_1
将尝试将服务名解析为IP地址
,但是只返回了规范化服务名称
; 接着会创建一个新的context_2
来将该规范化服务名成解析为IP地址
。这里可以认为context_1是context_2的父上下文。
基本实现步骤如下:
12. 函数ngx_resolver_process_ptr()
此函数用于处理将IP地址转换为域名
的响应。下面简要介绍一下函数的实现流程:
[参看]
-
Nginx DNS resolver配置实例
-
nginx关于域名解析的源码分析
-
DNS协议详解及报文格式分析