做虚拟网络也有几年了,最近产生了一些想法,就想着记下来。

我记得在读书的时候,搞过一阵子未来网络的体系结构。当时看了一些资料,记得有一个RFC曾经指出了IPv4网络设计的一个局限性,就是把identify(标识)和 location(寻址)的绑定在同一个IP地址上。这个论断,当时看还是很震惊的,感觉非常精辟。怎么理解这个论断呢,其实标识就是名字,说白了就是你是谁,寻址的话也很好理解,就是你在哪。在网络世界里,如果两个IP地址很接近,比如前缀相等,那么你可以认为他可能就在同一个交换机下,这其实就是一种对位置的界定。

在静态网络中,这种绑定其实没有什么问题。但是一旦网络中的个体开始移动,问题就来了,比如一个客户端,具有某个IP1的client移动到了另一个位置,那么按照方便寻址的原则,他在另一个地方的地址应该是另一个地址IP2。但是如果client正处于一个TCP连接中,换掉地址,就相当于五元组变了,那么连接就被破坏,相当于断网。为了一个新的地址,直接丢弃了所有老连接,这就很麻烦。为了解决这些,我记得移动网络中有一个所谓的“三角路由”的概念。具体是啥也忘记了。但是这个寻址和标识的绑定是IPv4网络的局限性的论断,这么多年我都记得。为了解除这个问题,Cisco曾经提出了一个叫LISP,Location Identification Separate Protocol,就是把IP地址分为两类,一类作为标识,一类作为地址,网络中的设备都有两个地址,直接解除了IPv4的这一局限性。可惜当前的互联网已经不可能重来了。

那么这个标识和寻址的绑定和网络虚拟化有啥关系呢?其实之前我在做的时候,也没想过有啥关系。网络虚拟化本质就是overlay技术,说白了就是一个underlay多个overlay。打个隧道连通下各个主机,隧道的目的是为了防止地址overlap,overlay网络中要尽可能的模拟现有的网络,比如二层泛洪,三层路由等等。直到我见到了纯三层虚拟网络,我突然想明白了点什么。

纯三层的虚拟网络里,每个虚机都是/32的掩码,也就是每个虚机自身就是一个子网。任何两个虚机之间的互访就是三层路由。这固然有些限制,比如二层设备里一些基于arp欺骗的主备网络设备的玩法搞不了了,但是对于大多数业务来说,基本没影响。而且,这个限制对虚拟网络的设计来说其实省了一大堆的事情,比如arp在虚拟网络中的泛洪,虚机迁移之后的免费arp发布刷cache等等。

当然这个设计中最重要的一点还是让我立刻理解了虚拟网络中地址已经和位置无关了。试想,两个虚机的IP地址前缀相同,能说明他就一定靠的很近吗?不,有可能这两个虚机在两个相隔甚远的物理机上。既然前缀已经不能决定位置了,干脆就放弃前缀,放弃了前缀就是放弃了虚拟子网,放弃了广播域,放弃了冲突域。虚机的标识就是IP地址,而这个IP地址与虚机的位置毫无关系。所以纯三层虚拟网络,就是暴露了虚拟网络的另一种本质。如果你看着一个vxlan数据包,他的外层IP地址负责寻址,而内层IP地址就是标识。Cisco想实现的LISP,在虚拟网络中实现了。历史总是惊人的相似!

因而虚机的路由表在vswitch中是不能收敛的。每个虚机都会贡献一个路由表项到虚机,没有前缀路由,只有明细路由。因为去往每个虚机的下一跳都可能是不同的宿主机。一个有10w虚机的网络,路由表就有10w条。

这和今天的互联网的骨干网何其类似。因为绑定了标识信息,骨干网络的route表项年年上升,我博士在读时候是350K条,现在貌似远超500K条了。看样子,IP查找算法的研究还可以再续命三年。

那么除了这套玩法,我们还有别的玩法么?当然有,当我们不在意IP地址,而用URL来实现服务标识,玩法又变化了。这块下次再说吧,敲字有点累了。