自研DCI网络路由交换协议DCIP-白牌交换机时代的企业网络

一转眼从听华为3Com的路由交换课程到如今已经13年有余了,依稀记得第一节课的时候我带着老婆去听的课(老婆是日语系的。那时还是女朋友,并不懂网络,仅仅是跟着我去上课的)。抢了个头排,讲师宋岩老师提问了一个问题:“为什么要学习网络?”然后看没人回答就要点名,可能是宋老师对美丽的女生感兴趣吧。直接点名了我老婆...然后就尴尬了,只是没想到老婆回答的还真不错。自那以后,我也就開始了对网络的兴趣。对网络设备的兴趣,路由和交换这门课整体学的还不错。只是,后来我成了程序猿。也就没有机会去触摸那些设备了,也算是遗憾。
        我深深知道程序猿和网管之间有个鸿沟,但我就是无法填掉它,有时这道鸿沟就在我自己的心里。

如今,我依旧是个程序猿,以往我一向喜欢说自己是比較懂网络可是编程编的不好的程序猿。以此展示一下我心中的那道鸿沟。SDN的时代来临,软件定义网络,那道鸿沟能够填补了。网络不再是网管的专利,而是程序猿编码的一个程序。

在《网络虚拟化(SDN,NFV..)和企业骨干网的演化》一文中,我的观点比較原始且传统,我描写叙述的企业骨干网是一个AS。通过IGP互联,比方OSPF,这显得企业骨干就是一个IP骨干网。

可是。事实上真有这个必要在企业网部署IGP吗?我们看一下企业骨干网的典型结构:

自研DCI网络路由交换协议DCIP-白牌交换机时代的企业网络

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZG9nMjUw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

企业骨干网特别是互联网公司的骨干网事实上更大意义上是一个数据网而不是一个通信网。

它的目的是数据的调度。而不是让不同的节点互联互通。这是企业骨干网与运营商骨干网的非常重要的差别。

基于这个差别。我们便能够优化企业网的路由系统了。
        细致观察企业网的层级结构。就会发现它是一个基于胖树的典型CLOS交换结构。之所以能够规划成这样的规则的结构,源自于以下的事实:
1.企业网互联的节点一般都是数据中心而不是接入点,而数据本来就是分层的。
2.企业的数据中心能够自己规划的,节点固定,稳定。
所以说。全然不是必需在这些数据中心之间执行OSPF这类路由协议,而应该将企业网做成真正交换型的网络。
        我来给出一个拍脑袋想出来的简单的”交换协议“来替代复杂的IGP路由协议为企业骨干网打通脉络,在给出这个协议之前,我得先来解释一下路由和交换的差别。在我这里。路由指的是须要复杂计算的寻路过程,主要包含双方面的计算开销,一方面是动态路由协议的计算开销(假设你是静态配置的路由。那么这部分开销由你的脑力替代),还有一方面是为数据包查找路由表的开销,这部分计算主要消耗在最长前缀匹配中。如今看看什么是交换,交换在我这里指的是一个转发动作,这个动作的计算开销必须尽可能的小,比方仅仅须要固定几步这样的,像CPU的MMU执行的那种转换操作那样,所以交换应该非常easy用硬件实现,在交换网络中,数据的转发动作开销是极小且固定的,基本不须要进行运算。而这些固定的步骤是怎样做到数据的正确转发的呢?交换机怎么知道数据包该转往那个port呢?转发信息来源于两种机制,一种机制是交换机自己学习,第二种是依靠路由表来生成。

假设转发交换表是路由表生成的,那么这样的设备能够看作是高端路由器。交换表便可视为路由表项的Cache。按照这样的方式设计出来的硬件早就不知道跑了多少年了,无论是路由Cache。还是那种相似Cisco CEF机制,背后的原则都是一次路由,多次转发,仅仅只是CEF的转发表是主动生成的。而不是等到数据包到达的时候才生成的。所以说,这样的方式实乃一种传统的方式。

假设转发交换表是自己学习生成的。那么这样的设备在常识上就是真正的交换机。比方以太网交换机,靠MAC/Port映射表来转发数据。比方MPLS交换机,靠标签/Port映射表来转发数据,无论哪种交换机。其映射表都是学习获得的。比方以太网交换机有从帧头学习MAC/Port映射的能力。而MPLS交换机则能够通过标签交换协议来生成映射。此外还有很多其他的交换机。比方ATM交换机,也是有自己的虚电路协议的。已经快被淘汰了,故不多谈。

我前面说过,要把数据中心连成一个交换网络而不是一个IP路由网络。那么使用那种交换机呢?是以太网交换机,还是MPLS交换机呢?事实上。数据中心全然能够承载在一张MPLS网上,那简直比IP网要好太多。只是要是那样,也就没有本文了。

本文的意思是,自己设计一种交换机,不须要不论什么现有的协议交换机!
        这怎么可能?假设在十几年前,这样的思路也仅仅能停留在大学或者Cisco。华为之类设备商的实验室里,然而在SDN时代,出现了叫做裸交换机和白牌交换机的东西,这些交换机说白了就是能够随意编程。

这样不论什么公司都能够自研定制的交换机了!自研交换机能够更贴合自己的网络,可谓是高端定制。SDN时代是彻底结束了厂商垄断的时代,SDN将网络开放给了程序猿,CCIE将不再牛逼。
        開始我的协议。
        首先介绍一下网络中每一台设备里的转发表是什么样子:

自研DCI网络路由交换协议DCIP-白牌交换机时代的企业网络

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZG9nMjUw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

这个转发规则非常easy,就是一个位图,按照从上到下,从左到右的顺序去匹配第一个bit为1的索引值,那就是要转发出去的port,这个非常easy用硬件实现。顺便说一下,这个跟Linux 2.6内核的O(1)进程调度器非常像。至于说链路负载均衡,那也不难,直接在位图的同一行选择多个链路就可以。

之所以能够构建这个位图,就是由于全交叉连线的胖树在每个节点都有三个走向:
往树叶方向:假设目标port位于源port的一个方向,那么这就是近期的路径,当然是首选。
往平行方向:不同目标ToR的最优选择或者树叶方向不可达时的次优选择。
往树根方向:树叶方向。平行方向均无路可走时的默认选择。相似默认路由。

那么下一个问题,这个转发交换表是怎么生成的呢?
        首先。我们要定义边缘设备,在这样的设备上,源IP地址和目标IP地址被转换成源port和目标port,这样在数据包进入这个网络后,就能够用port来交换了。这就避开了用最长前缀匹配计算的开销,全然用port这个确定的一维数据来作为交换的根据,这个思路和MPLS是一致的,和MPLS不同的是,我这里的网络拓扑是确定的CLOS结构。这就让内部的交换结构更加简单,每个节点的三个固定走向分属三个不同的优先级意义也正在此。IP地址和port之间的映射方式有非常多种,我首选的是HASH映射,这样比較简单而且高效。
        以下说下节点的port学习,最简单的方法往往是最高效的方法。

在网络初启的时候,从每个边缘设备发起以自己的portID为内容的Flood,每个Flood数据包传遍全网,这样全部的设备就能够学习到特定port的方向信息,这个和以太网交换机是一致的。不同的是,以太网交换机是带内学习的,以太网本身就是一个广播网络,查询映射表项失败的情况下能够用广播来发送数据。而我这里的协议交换机则是带外学习的,由于我的目的是在传输数据之前就构建好每一台设备的交换表。旨在高速转发。

最后一个问题,这个交换网络该怎么维护呢?假设有一条线缆断掉了。或者一台设备宕机了,怎样通知其他设备更新转发交换表呢?这就须要一个新的协议。非常easy。仅仅须要往上游和平行两个方向传播链路状态变更就可以。不须要向叶子节点传播。由于向上游转发总是最后的不得已的选择。为什么能够如此简单?由于这是一棵棵树组合而成的胖树CLOS结构! 认识到这个特征,非常多设计都能够非常easy。
        理解了转发交换表是怎么生成的。终于的效果应该是以下这样:

自研DCI网络路由交换协议DCIP-白牌交换机时代的企业网络

我这个自研交换协议确实是拍脑袋的产物,由于我个人并不是做这一块业务的。仅仅是兴趣使然,不然也不会占周末的时间去搞这么一个可能永远也用不起来的东西。
        之前像腾讯这样的巨头企业也设计过这样的自研的协议,比方以下连接里介绍的SRP:腾讯-SRP。然后,在弯曲评论上被喷了,在别的地方感兴趣的也不多,仅仅是在某本吹水的SDN书籍上提到过。

事实上,在厂商垄断的时代,再牛逼的互联网企业也仅仅能停留在做业务编程的水准,评论里说腾讯做网络外行,我想在厂商垄断的年代,确实非常外行。真正的内行仅仅有Cisco,华为做核心交换的那帮人,再牛逼的编程者面对真正网络技术而言,都是外行。我自己在2013年的时候,也说过腾讯的网络技术就是堆概念,拿着一大堆新的网络技术胡来。

比方业内推出了SDN。赶紧就部署,Cisco的协议在腾讯的机房都能看到,里面的人也能把这些概念背得滚瓜烂熟,可是做出来的网络真真就是四不像,表面上看牛逼的样子,事实上就是拿名词吓人的。以我如今的观念来看,当时确实苛求腾讯这样的非网络厂商了。仅仅要不是网络厂商的人。谁都做不好。别说腾讯,换家美国的互联网公司也一样。要想做好网络。好办,买Cisco或者华为的方案就可以,然后他们派个project队帮你实现了,全程不用你插手。知道网管多牛逼了吧。我经常搞不懂为什么网吧的小混混网管怎么能够这么牛逼哄哄,难道由于他们是混混吗?后来见了外资银行那些不纹身但穿西装的网管也相同牛逼哄哄的时候,我才明确。原来人家玩的是垄断。我能碰的东西。你们不能碰。
        上学时老师就讲过,网络切分为资源子网和通信子网,互联网公司的技术局限在资源子网,而通信子网差点儿垄断在设备厂商的手中,他们就像网吧纹身的小混混网管一样。屌的非常。在互联网公司看来,所谓的网络技术就是TCP,假设提到路由和交换,他们是不屑的,互联网公司想当然地觉得TCP能解决一切问题,假设说再深入一些。无奈非常吃力地在IP协议上做点文章。搞搞网卡驱动。至于说数据出了网卡,他们真真的没辙...我想我看到了程序猿和网管之间分歧的本质了。
        回到腾讯的SRP。从技术上评价它,其最大的败笔就是明明已经触到了交换核心概念的边缘,却又回到了路由!搞那么复杂但高效的交换矩阵,到头来就是为了设置路由!注意,是路由啊。已经触碰到了成功的边缘却还是没能突破边界,所以遗憾。路由仅仅是概念并不是标准。否则。MPLS就不会被发明出来了。我们在乎的是找一个出口把数据包发出去。而这件事为什么非得靠路由来做呢?更何况。设备的控制权已经不在厂商手里了,已经全然交给了程序猿。人家都是那路由表生成交换表,腾讯的SRP却反其道而行,设计出一个还不错的链路状态更新协议却仅仅是为了生成路由表...
        从弯曲评论里的那个PDF中搞出一个SRP的结构图:

自研DCI网络路由交换协议DCIP-白牌交换机时代的企业网络

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZG9nMjUw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

这实际上并不能算是一个路由协议,而是一种链路负载的协议。我之前设计过一个链路上的VRRP协议。详见《LVrrp的设计过程-基于链路的vrrp》,我觉得SRP和这个LVRRP比較相似,LVRRP依赖底层的VRRP,而SRP依赖底层的静态路由,都是在现有的底层上铺设了一个控制平面而已。当然。以腾讯公司的人力和財力,在细节上肯定会设计的比較缜密,但我的意思是说,从内部看,SRP确实比較精细缜密,从外部往里看,确实做的外行了。
        来看看我本文里设计的协议,姑且叫它DCIP(DCI Protocol)协议吧。其根本意义在又一次映射了数据平面。实际上就是一种Overlay。它的图演示样例如以下:

自研DCI网络路由交换协议DCIP-白牌交换机时代的企业网络

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZG9nMjUw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

这么看来,DCIP本身就是一个数据平面的交换协议,而SRP则仅仅是一个控制平面协议。两者结合会不会更好呢?
        能如此设计DCIP有个前提。那就是交换机是裸交换机或者白牌交换机。顺便说一下,就是由于有了这样的交换机。才会有越来越多的厂商声称自己的交换机是自研交换机,当然,自研的水平參差不齐,毕竟如今网络技术研发才刚刚开放。以后全部公司的自研设备水平都会提高的,就跟业务编程一样简单。

...
以前我们听说过一般企业网会部署OSPF。而ISP会部署IS-IS。以后,在设备的控制权掌握在自己手中之后,越来越多的企业网将会自研交换协议,而不再使用标准的路由协议,迫于这样的客户将脱缰的压力。设备厂商不得已而为之,也陆续将设备的编程接口逐步开放,比方推出I2RS标准。让客户能够折腾自己已经购买的设备,这样鉴于大厂商的口碑,客户依旧会购买大厂的设备而不会流失掉。

以前。网络技术水平取决于你花钱的水平,花钱干什么呢?花钱来培训,考证。学习配置命令,学习Cisco之类公司的私有协议,由于钱是最硬的门槛,所以网络专家一般都是精英。

如今呢,网络技术水平全然取决于你的编程水平,买来裸机。编敲代码,你就有了自研的协议...知道谁是精英了吗?程序猿!

Google公司是SDN持续进化的推动力之中的一个。它本身作为一家互联网公司并不生产网络设备,可是它遍布全球的server却须要强大的网络技术支撑,所以自研肯定是最经济的选择,在SDN还是纸面概念的时候,Google就领先拿B4作为其试验田,让SDN成为了现实,紧随其后,各大互联网公司均開始引入SDN的思想...

... 明天有时间且有新内容的话再继续

声明:本文中的DCIP协议,仅仅是今早跑步时拍脑袋的产物,可是这并最好还是碍我今后会完好它,精细化它。

上一篇:插入视频(youtube)


下一篇:substr与substring的区别