为什么IPV4使用十进制表示

3
根据IP点表示法,使用十进制表示法而不是十六进制是标准做法。
127.0.0.1 -> 7F.0.0.1
255.255.255.255 -> FF.FF.FF.FF
10.0.0.1 -> 0A.0.0.1
10.0.0.1/24 -> 0A.0.0.1/18

我在RFC文件中找不到关于IPv4为什么使用十进制而MAC和IPV6默认使用十六进制的任何参考资料。

我们这样做有原因吗?还是纯粹出于历史原因?

2个回答

5

十进制是一种事实上的标准;IPv4地址的字符串格式化从未得到适当的标准化。几乎所有工具都只接受十进制、点分十进制表示法,但这并不普遍适用;任何仍使用常见实现的inet_aton()函数的工具可能会处理替代格式。

iputils包中包含的ping命令是一个有用的示例。尝试使用谷歌的一个地址,分别使用十进制、十六进制和八进制点分十进制:

ping -c1 216.58.195.238
ping -c1 0xd8.0x3a.0xc3.0xee
ping -c1 0330.072.0303.0356

这些都会ping同一个地址,因为它们都代表相同的32位。

但它不仅如此。你并不一定要使用四个八位字节;在无类别地址和可变长度子网掩码的日子里,分类寻址曾经指定了8位、16位和24位网络前缀。其中一些仍然被编入了inet_aton()

上面的地址,格式化为8/8/16位:

ping -c1 216.58.50158
ping -c1 0330.072.0141756
ping -c1 0xd8.0x3a.0xc3ee

或者,以8/24位格式呈现:
ping -c1 216.3851246
ping -c1 0330.016541756
ping -c1 0xd8.0x3ac3ee

或者,不用点号,直接输入32位二进制数:
ping -c1 3627729902
ping -c1 033016541756
ping -c1 0xd83ac3ee

但更好的是,您不必以相同格式提交每个块:
ping -c1 0xd8.072.195.0xee

这一切都提醒我们,inet_aton()是一个非常老的函数,它不理解IPv6地址。如果你今天编写代码,你不会想使用inet_aton(),而是想用inet_pton(),它可以处理两种类型的地址。我用过的inet_pton()实现更忠实地遵循十进制点分表示法的事实标准IPv4地址表示。对于IPv6,它确实有关于字符串表示的RFC标准inet_pton()也会遵循这些标准!

inet_aton只适用于基于UNIX的系统对吗?有没有Windows等效的系统调用? - undefined
inet_aton()不在POSIX标准中,但通常由C库实现;我恐怕没有进行过任何重要的Windows网络编程,无法确定,但文档似乎表明他们没有实现inet_aton()。他们建议使用inet_pton(),无论如何都更受推荐。 - undefined

0

RFC 790中,网络号码被分配,你可以从那里找到你的问题的答案。

RFC 790讨论了分配的不同网络号码,所有这些都以十进制的10进制格式表示。


它谈到了十进制和八进制的表示法,但为什么在IPv4中没有使用十六进制表示法呢? - undefined
因为它已经定义了IPv4子网划分的十进制数,而且所有的数字都是以十进制格式定义的。 - undefined
为什么会这样呢?你完全可以像使用CIDR一样轻松地使用十六进制进行子网划分。 - undefined
是的,我们可以使用二进制,但当RFC 790被编写时,他们可能决定采用十进制数。现在使用十进制数来表示IPv4已成为标准。 - undefined
那只是纯粹出于历史原因吗?没有不使用十六进制的好理由吗? - undefined
根据我的搜索,我发现这个RFC只是为了回答你的问题而存在,大家都接受了这种格式,所以这纯粹是出于历史原因,它在标准中作为IPv4的十进制格式。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接