好像很多人在学习网络时候都搞不明白一个问题,即有了 IP 地址通信的情况下为什么还要 MAC 地址呢?

很多人从层级模型解释这个问题,实际上也确实是这么一回事,从分层模型的角度,根据计算机的抽象,我们把每层进行抽象然后屏蔽一些底层细节,这在软件工程当中是非常常见的,但我们也许更应该了解的是为什么会存在这样的抽象,他的意义在哪里。而这些不从计算机网络发展历史入手是很难去解释的。这便成了从新的角度去理解 ARP,但实际上只是现在的人们忘记了过去的时代而已。

计算机网络已经发展到了 2022 年,现在一些奇怪的网络协议已经消亡,当今的网络已经几乎完全建立在以太网上,而绝大多数人也已经见不到那些 X.25 链路的网络,甚至连新版本的 Cisco 认证也不再讨论了。

当然这也是有很大坏处的,即现在的新人们不去搜索的情况下已经无从得知现在的一些网络设计究竟为什么这么做。

这里面最典型的例子就是为什么我们需要将 IP 和 MAC 地址分离并使用 ARP 协议构建 ARP Table 来维护其对应关系。为什么不直接使用 ARP 等一系列问题。

今天我们不从理论入手描述 ARP 协议的必要性,而从更久远的视角谈论这种分层结构为什么会存在。

并不唯一的二层协议

现如今的网络,在二层网络中已经几乎完全是以太网了,以至于大多数人见到局域网二层组网就将其和以太网对等起来,实际上在计算机网络的发展阶段不但有以太网,也存在着其他的各种二层网络。

有一些是现在已经几乎不再使用的,例如令牌环网络,FDDI 网络。这些协议已经随着网络的发展退出了历史舞台。

也有一些是现在还在小范围使用的,例如 X.25 网络,ISDN 网络,帧中继网络,曾经被寄予厚望的 ATM 网络等,现在也不多见了。

还有一些在特定场景使用的高速网络,如 InfiniBand 网络,通常用在数据中心对网络速率和延迟要求非常高的场合,代表了计算机网络的先进技术。

尽管这些都是不同的二层协议,但他们有一个共同点,那就是他们都可以在上层,即第三层承载 IP 协议。

显然,由于链路使用的二层协议不同,他们的获取 MAC 地址的方式也可能不同,链路通信的方式也必然不同,因此,从软件工程的角度来说,将这些不同的部分抽象出来以简化更高级的部分的调用就显得理所应当了。

我想,这大概就是 ARP 协议诞生的初衷。

也并不唯一的三层协议

我们先把 ARP 放在一边,因为他是 IP 协议的一部分,我们来看看其他的东西。

实际上,计算机网络也不仅仅只有 TCP/IP 协议簇。

在过去,在 TCP/IP 还没有像现在这样成为完全的标准时,三层的协议也可谓是百花齐放。

例如,我们有 Novell 的 IPX 协议。

在 Windows 95 甚至更早的 DOS 年代,Novell 的 IPX/SPX 协议曾红极一时,成为了那时企业局域网的重要组成部分。最重要的是,Novell Directory Service 的推出要比 Microsoft Active Directory 还要早 6 年,这也使得 Novell 的 Netware 在那时迅速的占领了市场。

甚至现在的 Windows 里还保留的那个树的图标,实际上就是 Novell Directory 的图标。

Tree Icon in Windows

Windows 中的 Tree 图标

Novell Tree in Windows 95

Novell Login Program

一些 Novell Directory 画面

但 IPX 不需要 ARP,因为他是直接与 MAC 地址挂钩的,这也导致了 IPX 协议很难在大型网络中部署使用,因此退出了历史舞台。

这个时代同时存在的一些协议还包括 AppleTalk,DECNet 等,他们的工作方式各不相同,但很多是为有限场景设计的,并不适合大型的 Internet 互联,因此他们都逐渐被 TCP/IP 取代了。

通常我们使用 ARP 都是在解析 IPv4 地址,但显然这种抽象为这种不同的三层协议实现也提供了不同的解决方式。

总结

回顾历史,让我们明白了一些软件设计的原因,也让我们更好的去理解一些现在看来理所当然的东西。这种探究的过程也是非常有趣的。

技术的发展有时候不是理所应当的,历史也是非常值得研究和记录的,我希望能有更多的人能去关注这些逝去的老技术,让后来的人能够更直观的知道当今的一些技术不是突然间变成的,这也可以作为一种 Retro 的文化符号保留下来。

我在写这篇文章的时候也看了一些资料,经过我的理解写成,希望能让更多的人对这些 Retro 文化感兴趣吧。