上一篇文章里,我们建好了一个小王国:一个山谷、几个村庄、几座信号塔,还有一套运行得相当不错的本地网络。这套系统是那些还相信"医学就是平衡四种体液"的人发明的,能跑起来已经算奇迹。

但问题来了。野心最大的人很快发现,一个王国太小了。侦察兵翻过山发现了新的定居点,军队沿着以前赶羊的路开拔,几年之内,我们那个整洁的小王国就变成了横跨好几个山谷的帝国。

打开网易新闻 查看精彩图片

道德困境不在本文讨论范围内。作为中世纪欧洲的网络工程师,我们没资格评判领主的军事政策。我们需要评判的是:第一篇文章里的通信系统,能不能扛住这次扩张?

旧系统的致命盲区

我们的旧系统知道怎么在一个山谷内传送帧,但它完全不知道"山谷"是什么概念,不知道边界在哪里,更不知道当目的地藏在三道山隘后面、还要经过别人家的税收系统时该怎么办。

所以我们要用建本地网络的方式,来建这个更大的系统。继续守着信号塔,直到消息能穿越整个帝国。等这套机制跑通了,再回到真实的计算机和互联网。这个顺序很重要——当你先亲身感受过问题,IP地址、网关和路由表就变得好记多了。

这篇文章要讨论的是:IP地址、网络前缀、网关、路由表和ARP,如何把本地网络变成"网络的网络"。然后看看同样的模型在Linux上长什么样,DHCP怎么给主机它需要的信息,以及一个数据包穿过多个路由器时会发生什么变化。

两个山谷,两个0A

现实部分聚焦在以太网上承载的IPv4。其他链路技术可以不用以太网承载IP,IPv6用邻居发现替代了ARP,但一个边界清晰的世界暂时够用了。我们的帝国已经够难治理了,不必再开几个新大陆。

在现有系统里,每座塔都有一个本地名字,比如0A、0B、0C。整个已知世界都在一个山谷里时,这套命名完美运行。

然后我们拿下了另一个山谷。

新山谷有自己的塔,可能叫1A、1B、1C。也可能叫0A、0B、0C——因为中世纪王国之间的协调,显然不比现代IT部门之间好多少。

现在,发给"0A"的命令有歧义了。山谷1有个0A,山谷2也有个0A。旧名字只有在我们已经知道说的是哪个本地网络时,才能告诉我们消息该给谁。

这不是旧系统的缺陷。本地名字本来就是为本地投递发明的,在一个山谷内它依然完美胜任。帝国只是制造了第二个问题——而这个问题,需要一套全新的寻址机制来回答。