互联网的历史以层层创新为标志。在当时看似好的和必要的想法往往会被后来出现的更好的想法所取代。
我们有一位运行NetBSD的客户在与我们交换电子邮件时遇到问题。他们可以很好地联系其他人,但不能联系我们。
调查和调试最终确定他们的服务试图直接与我们的邮件服务器通信,而不是通过网关。该服务使用的是手动添加的IP地址。我们确定,当他们通过ifconfig添加地址时,他们没有提供网络掩码。然后,NetBSD为其分配了默认网络前缀/8。A/8将包括1600万台其他主机,这是毫无意义的。
我们最初认为这是ifconfig的默认行为,但一些工作表明,BSD内核和Linux内核中都内置了该默认行为。这一切都可以追溯到一个名为“有类网络”的系统,该系统于1981年开发,并在1993年被无类域间路由(CIDR)所取代。反过来,CIDR使用可变长子网掩码(VLSM),而在有类网络中,子网掩码是固定的。
NetBSD正在为旧的有类系统分配与默认子网掩码关联的网络前缀。我们的网络设置了可变的网络掩码,因此使用了不同的网络前缀。这将我们的客户置于与我们不同的子网中,并破坏了我们的通信。
那么,什么是有类网络呢?为什么它一开始就存在呢?为什么现代内核仍然默认使用一个在近30年前就已经过时的系统呢?
互联网很早就遇到了可伸缩性问题。按照互联网地址的书写方式,第一次迭代只能识别256个独特的网络。网络由32位IPv4地址的前8位定义,单独的机器由其他24位或其余三个八位字节以四进制记法定义。
早期只有256个巨大的网络是不错的,当时周围唯一的网络是像ARPANET(第10号网络)和SATNET(第3号网络)这样的巨头。但很快就清楚了,最终将有超过256个网络,其中绝大多数将不需要这三个尾随的八位字节所允许的16,777,216个单独的节点。
解决方案是将IPv4地址域划分为“类”,并赋予它们不同的扩展能力。有五个班级,分配了字母A到E。
A-C类为规则网络。D类分配了组播地址,而E类保留用于特殊用途。
该系统由RFC791于1981年引入。1993年,根据RFC 1518和RFC 1519规范,CIDR取代了它。Classful Networking持续了12年,但这只是一个权宜之计。问题在于规模从C类网络(256个节点)到B类网络(65,536个节点)的巨大飞跃。许多新兴网络需要的机器远远超过256台,因此被分配到B类,但很少有真正需要超过65,000台机器的网络,所以B类地址池被浪费了。
CIDR通过使网络掩码长度可变,并以更易于写入和记忆的格式分配从网络掩码派生(也因此定义)的网络前缀来解决此问题。网络前缀只是网络掩码地址中前导1位的数量,所有其他位都设置为0。旧的有类网络掩码是固定的,因此会收到上表中定义的网络前缀。
CIDR自1993年开始使用其可变网络掩码,至今仍是使用的寻址系统。
大约在Internet从有类网络向CIDR过渡的时候,BSD和Linux的内核正在积极开发中。因此,它们将有类网络IP分配作为其默认行为的一部分。
这意味着当您使用ifconfig分配IP地址时,如果您没有指定网络掩码和/或网络前缀,则内核会将IP地址分配给五个类中的一个,并为其提供该类的默认网络掩码和前缀。
在现代内核中更改这些缺省值会破坏兼容性。所以它们一直保留到今天。
但是,如果没有向网络配置工具提供网络掩码,则警告用户不应破坏向后兼容性。如果您对一年的免费服务感兴趣,以换取将此警告添加到我们官方支持的任何分发中,请与我们联系。
特别感谢黑客新闻的sigjuus、cpach和其他人,他们提供了关于ifconfig和Linux内核历史的宝贵信息。