Erlang 的 DNS 解析方法有包括 file(读取 /etc/hosts 文件)、dns(Erlang 自己的 DNS 客户端)、native(调用外部程序 inet_gethost 用 libc 的 gethostbyname 函数解析域名) 在内的好几种方式,可以在 kernel inetrc 文件中以 {lookup, [...]} 形式指定多种 DNS 解析方法的应用顺序。在 inet:gethostbyname_tm/4 函数中可以发现任意一个域名的解析顺序是:
- 尝试按 lookup 属性中指定的顺序应用 file、dns、native(或yp、nis、nisplus、wins等)中的方法解析域名,并忽略不认识的 DNS 解析方法;
- 若所有指定的 DNS 解析方法都试过以后也没能得到 IP 地址,就检查给定域名是不是已经是一个 IPv4/v6 地址了,若是则直接返回,否则报错。
由于 dns 方式比 native 方式效率高、并发能力好,所以配置 lookup 为 [file, dns] 是比较常见的。这一解析顺序通常情况下工作的都很好,但若 DNS 服务器会将所有无法正常解析的域名解析为一个统一的 IP 地址(例如大部分公司网络环境),而你尝试去解析一个已经是 IPv4/v6 地址的字符串,就会产生严重的问题。Why?因为在第 1 步中,dns 方法会将已经是 IP 地址的字符串当作域名发送给 DNS 服务器,由于前述的 DNS 服务器特性,解析结果就会变成另外一个驴头不对马嘴的 IP 地址,造成严重的混乱。
这一问题影响面很广,基础库中的 gen_tcp、gen_udp、http 等都会受波及。目前的临时解决方法有这么几种:
- 若可能被当作域名解析的 IP 地址是有限的几个,最简单的办法是在 /etc/hosts 文件中为这些域名设置本地域名别名,这样在 file 解析阶段就能将其正确处理了;
- 或者在 lookup 属性中用 native 替代 dns,由于 native 使用 libc 的 gethostbyname 函数解析域名,其会先识别给定域名是否已经是 IP 地址,故可以避免发生此问题。弊端是 native 调用外部进程解析域名,并发度和性能上都有不小的损失;
- 或者自行用 inet_parse:ipv4_address/1,ipv6_address/1 预先检查待解析的域名字符串是否已经是 IP 地址,若是则以标识 IP 地址的 4 元组(IPv4)或 16 元组(IPv6)作为主机地址参数。但此法对 http 模块无效,因为即便 URL 中给出的主机地址是 IP,该模块内部还是会进行一次域名解析。
该问题我已经发到了 erlang-bugs@erlang.org 并得到了 Raimo Niskanen 的积极回应,有望在下个版本中得到改进。
Raimo Niskanen 写道
This leaves us some other alternatives:
1) To extend the 'file' or the 'dns' lookup
methods with IP string detection.
2) To do only do IP string detection when the 'native'
lookup method is not used, but to do it first instead
of last as today, within the inet:gethostbyname
lookup method wrapper itself.
3) To introduce a new lookup method e.g 'ipstring' that the
user can insert in the lookup chain wherever suitable.
I do not like 1) since it would make either of those
lookup methods impure, harder to test and harder to explain.
I prefer 2) because it would behave kind of natural.
However, 3) is the purest but would require manual
configuration in more cases.
But 2) wins...
At least until someone convinces me otherwise.
分享到:
相关推荐
在Erlang编程语言中,DNS(Domain Name System)解析是一项关键功能,它允许程序将域名转换为IP地址,反之亦然。Erlang提供了强大的工具来处理网络通信,包括DNS解析。这篇博客(虽然链接不可用)可能讨论了如何在...
dns_erlang 支持大多数常见记录类型,TSIG身份验证消息,EDNS0和DNSSEC的Erlang DNS消息库。用法该库通过include/dns.hrl公开类型,而include/dns.hrl依次包括include/dns_terms.hrl和include/dns_records.hrl ,...
调试是软件开发中不可或缺的环节,Erlang提供了许多强大的调试工具,例如Erlang的crash dump分析工具、snooper消息监听器等,它们帮助开发者在开发和测试阶段快速定位和解决问题。 #### 4. 并发与网络 ##### 4.1 ...
### Erlang深度分析知识点 #### 1. Erlang VM分析 Erlang的虚拟机(VM)即Erlang Runtime System(ERTS),是Erlang系统运行的基础。它支持轻量级进程,提供了高效的并发处理能力。在性能方面,ERTS经过优化,能够...
《Erlang深度分析》这本书可能会涵盖这些主题,并提供深入的实例和解析,帮助你全面理解和掌握Erlang。"更多Erlang资料下载.txt"可能是其他相关资源的链接列表,你可以通过这个文件获取更多学习材料,进一步提升...
### Erlang深度分析知识点概述 #### 1. Erlang虚拟机(VM)分析 - **概念**: Erlang VM,也称为BEAM (Bytecode for the Erlang Abstract Machine),是Erlang语言的基础运行环境。 - **特性**: - **轻量级进程**: ...
**Erlang编程:Introducing Erlang** Erlang是一种函数式编程语言,由爱立信在1986年开发,主要用于构建高可用性、容错性和并发性的分布式系统。"Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,...
2. **API更新**:可能对Erlang的内置函数或模块进行增强,提供新的功能或修复已知问题。 3. **兼容性提升**:与先前版本相比,25.0可能增强了与其他软件或框架的兼容性。 4. **错误修复**:解决上一版本中的已知问题...
顺序编程是 Erlang 编程语言的基础,用户可以使用 Erlang Shell 编写和运行顺序编程代码。顺序编程是指按照顺序执行的编程方式,用户可以使用各种运算符号和函数来实现不同的计算任务。 3. 模块和函数 模块和函数...
Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,主要用于构建高可用性、分布式和实时系统。版本24.3.4.4是Erlang的一个更新版本,包含了对先前版本的改进和修复。Erlang以其强大的错误...
标题中提到的“Erlang官网下载过慢”可能是因为网络问题或者官方服务器的繁忙导致的,这对于急需安装或更新Erlang的开发者来说是一个常见问题。在这种情况下,用户可以选择通过第三方镜像站点或者从他人分享的安装包...
对于开发者来说,了解这些更新和变化至关重要,因为它们可能影响到现有项目的行为,或者提供新的工具和技术来解决特定问题。学习和掌握Erlang22的新特性有助于提升开发效率和应用质量,特别是在构建高并发、分布式...
Erlang/OTP 26.2.1,Erlang,OTP,26.2.1
6. **性能优化**:通过解决实际问题,学习者可以学习到如何有效地利用Erlang的特性进行性能优化,比如避免全局状态,利用并行计算等。 综上所述,"xiandiao"文件夹中的源码是学习Erlang编程和理解其并发特性的宝贵...
我自己在新学erlang,在LeetCode OJ上找了题目练习,题目很适合新手熟悉语言,但是LeetCode OJ里面只有几门主流语言的答案,下面是已完成的erlang源代码,后续有空再做其他问题续传,题目包含:(源码开头都有题目...
这个“erlang资源”包含两本PDF书籍——《Erlang并发编程》和《Erlang入门手册》,它们是深入理解和学习Erlang语言的关键资料。 《Erlang并发编程》这本书可能涵盖了以下知识点: 1. **并发模型**:Erlang的并发...
Erlang B和Erlang C是电信领域中两种重要的流量模型,用于预测和分析通信系统中的呼叫处理能力和拥塞情况。这两个模型由丹麦工程师Agner Krarup Erlang在20世纪初提出,至今仍广泛应用于现代通信网络的设计与优化。 ...
在使用Erlang进行开发时,了解Erlang的REPL(Read-Eval-Print Loop)是很有帮助的,通过erl命令启动,可以快速测试代码和调试问题。Erlang还有强大的模块系统,每个文件对应一个模块,模块内包含函数定义。 OTP库...
节点间的通信高效、安全,通过epmd实现类似DNS的名称解析。OTP(Open Telecom Platform)提供了诸如gen_server这样的行为模式,简化了分布式系统中的位置透明性和容错机制。 **Mnesia 分布数据库** Mnesia 是Erlang...