很多个月前,当我只是一个职业生涯的小白裙时,我接受了一个低级开发人员职位的面试。那时我刚刚学会了CIDR的实施方式,所以我很想炫耀我的知识。我记得被问到的第一个问题完全弄糟了(然后r之以鼻,这一切都是下坡路)。问题是:


为什么IPv4地址是32位的?


我欣然承认我不知道答案,但是我确实知道原始协议设计将地址空间划分为8位网络号和24位主机标识符,因此我基于协议设计者设想由几个网络组成的Internet进行合理化(毕竟,它最初旨在将特定的几个链接在一起),每个包含许多主机,并且为了简化编程,使所有内容都保持字节边界对齐。真正的原因是保证它可以放入C的long int内,因此简化了实现细节。当时还很年轻,很绿色,我接受了一个合理的答案,并且(在今天之前)再也没有考虑过。我认为,这似乎并不完全合理:


在包含固定大小的网络和主机字段的原始寻址方案下,开发人员不太可能希望分配将两个字段串联到一个变量中(我无法访问任何早期的IP实现来验证它们在实践中的实际作用);和
在TCP / IP上开始工作的时候,C既不是标准化的,也不是今天已经成为低级软件开发的事实上的“通用语言”。

面试官的建议实际上成立了吗?如果不是,那么协议设计者选择32位寻址的真正原因是什么?

评论

640 kB对于任何人都足够的相同原因。没有人期望烤面包机和冰箱可以上网。

@afwe:嗯。问题不是他们为什么不选择更大的数字呢? aka为什么只有32位? (这确实是\ @Jens出色答案的重点),但是还有更多关于32位(而不是16位,24位或48位)的特殊之处吗?

@Downvoter:想发表评论吗?

#1 楼

以下是与Vint Cerf进行的环聊的链接(2014年4月),在其中他解释了他如何认为该互联网仅应作为实验: (好吧,这将是任意数量的网络全部互连在一起-我们不知道有多少个,我们也不知道它们将如何连接),但是我们认为全国范围的网络“很好,也许有每个国家最多只能有两个”(因为价格昂贵:目前已经发明了以太网,但并没有像几年后那样在各处扩散)。

然后我们说“有很多国家?” (每个国家有两个网络,有多少个网络?),所以我们没有Google询问,因此我们猜测为128,即256个网络(即8位)是128的2倍,然后我们说:“将有多少台计算机每个网络上都有?”我们说:“一千六百万呢?” (又是24位),所以我们有一个32位地址,该地址允许43亿个终结点-我认为在1974/3年就足以进行实验!


我已经发布了这是对Jens Link的回答的评论,但我觉得它应该多出一点。

评论


我认为这不仅仅是“多一点表面”,还比詹斯的答案更直接地回答了实际问题。

– eggyal
2014年5月19日在8:21



感觉就像有人合理化他们已经做出的决定。显然,真正的答案是32位,而16位显然太小,如果当时有任何平台支持64位数字,则很少,因此必须将64位地址拆分并分成多个部分来处理。 。

– Peter Green
1月22日18:12

#2 楼

简单的答案:因为Vint Cerf如此决定。他认为自己正在设计一个实验性协议,并认为32位足以满足此目的。他没想到IPv4会在生产系统中使用,因此对地址空间的大小没有更多的考虑。 IPv6互联网是什么样的?在此期间,他叙述了:


之所以决定使用32位地址空间,是因为一群无法决定的工程师之间进行了一年的战斗32、128或可变长度。经过一年的战斗,我说-我现在在ARPA,正在运行程序,我正在为这些东西付款并使用美国税金-我想取得一些进展,因为我们不知道这去上班。所以我说32位就足够进行一个实验,它有43亿个终端,即使国防部也不需要43亿个东西,反正买不起43亿个边缘设备来进行测试。因此,当时我以为我们正在进行实验以证明该技术,并且如果该技术可行,我们将有机会进行该产品的生产版本。好吧-[笑声]-它逃脱了! —它问世了,人们开始使用它,然后变成了商业用途。


Peter E. Murray的文字稿。

评论


啊,我真愚蠢!奥卡姆的剃刀再次击中。至少您知道面试官是错的,给了我自满的满足感。

– eggyal
2014年5月15日15:43

@ user5025:是的,有可能(一般情况下)。但是如果Vint说这些是他为IPv4选择32位的原因,那么很难说他还有其他人。

– eggyal
2014年5月15日15:56



@ user5025:好的,这很公平。实际上,他提到工程师们一直在争论长度应该是多少,有些人主张32位。所以我想问题是,他们提倡32位的动机是什么(即什么使Vint可以接受)?

– eggyal
2014年5月15日下午16:15

@eggyal:我的意思不是说32位整数“绝对”是一个激励因素,而是建议我认为,有足够多的工程师建议使用大小可能已经考虑了一个因素,而没有证据表明这一点很合理。相反,我认为不能排除它是最终选择的一个因素。

–超级猫
2014年5月15日23:20

@eggyal:您问什么可能促使工程师选择32位。我的目的是回答这个特定问题。我已经在“裸机”上写了一个TCP / IP堆栈,不得不在各种场合下处理地址,但是对解析它们从来没有兴趣-只是确定它们是否匹配[这个特定的堆栈仅处理传入的TCP / IP连接,因此它必须处理ARP,但不能处理网关]。

–超级猫
2014年5月15日23:32

#3 楼

字大小。他们在写软件,而不是在设计计算机硬件-尽管我确定他们考虑到了性能和可移植性。那时,wordlongwordintlongInt或其他任何值都是32位。请参阅Word Size Choice。 -维基百科

评论


除非您建议TCP / IP的架构师考虑特定的计算机体系结构,否则我不确定您将如何使用该论点...您是否有证据表明他们正在使用/设计用于32-位架构,或者甚至是字长与它们为网络地址选择的长度有关?

– eggyal
17年1月8日在18:01

@eggyal:用于8位和16位计算机的语言通常包含32位整数数据类型,但是对于32位计算机上的语言具有多字整数数据类型的情况要少得多。至少在源代码级别上,使用32位值本质上与使用16位值一样方便,并且绝对比使用更大的类型更方便。此外,对于通信需求有限的设备,如果它们通过更复杂的网关进行通信,则32位寻址就可以了。

–超级猫
18-10-16在17:43