耶鲁大学教授杨阳:SDN编程,向正确的抽象方法迈进

2015年5月18日,“2015全球未来网络暨SDN技术大会”在北京揭幕,耶鲁大学教授杨阳做了“SDN编程:向正确的抽象方法迈进”的主题演讲。

2015年5月18-19日,“2015全球未来网络暨SDN技术大会”在北京召开,耶鲁大学教授杨阳做了《SDN编程:向正确的抽象方法迈进》的主题演讲。

以下是演讲速录(内容未经确认):

 耶鲁大学教授杨阳:SDN编程,向正确的抽象方法迈进

大家好,非常高兴能够有这个机会来做这样一个演讲,能够跟大家有一个交流。我首先来说有一个小小的评论,第一个就是我这个报告会用中文来讲,但是可能在报告过程中间会有一些英文。第二点来说,我想说的一点就是我感觉好像我的议题跟其他人有不同的,我会比较技术一点,大家看我穿的衣服就能看到,我没有西装。

第三点来说,我想说明一点,这个英文有很多种解释,一种解释比如说可以说是正确,还有一种解释就是比较合适,尤其其实来说,当我讲的是网络编程,SDN编程,可能编程更像是一个技术的东西,所以应该说合适更好的解释,其实我想利用一下这个词本身的词意。

下面让我来进入正题。我今天讲的内容是控制平面,为什么会选择这样一个题目呢?我向大家介绍一下,其实对我整个研究的生涯,工作生涯影响特别大的一个方法来自于海明码的创始人,这个人非常有意思,他每次工作的时候碰到一个新来的人,他吃中午饭的时候到处找一些地方坐。当坐下之后,他找到一个人问他说,在你的领域上面最最重要的三个问题是什么呢?我在读研究生的时候听到的这个故事,后来我养成了一个习惯,最起码我认为的这个问题是不是我认为最重要的三个问题之一,以及具体的SDN的控制层面来说。下面我来说一说为什么讲这个抽象的问题,这个其实也很简单,因为抽象的话,在这张胶片的上半角有一个非常有名的图,这是一个女士,非常能干,为什么抽象呢?从这个地方来说,其实她提到两点,对于未来网络来说第一个是把问题分解,然后形成一种模块。我在耶鲁的时候教一门很大的编程入门的课,有很多的学生来听我的课,很多其实都不是专业的。他们经常会问我一个基本的问题,说杨教授,如果你们计算机上来说,如果我学完之后我可以学到什么?我说很简单,把问题分解了来解决它,这是一个非常重要的方法论,会贯穿我整个的演讲。她这句话说的好的地方,这个分解应该是基于抽象的,基于概念。这是第一点我想说的。事实上来说的话,抽象在咱们计算机领域来说,在很多领域上来说它影响了整个领域的发展。比如说我是做网络的,按照美国的标准划分网络属于系统。在数据库中间,关系模型对于整个数据库的影响有很大的影响,咱们在看操作系统,操作系统现成,这两点对操作系统的影响也非常大。在耶鲁来说,有一个非常大的做语言的。早期计算机的发展,一开始的时候,大家用特别底层的编语言,比如说C语言,慢慢地我们有了更好的抽象,有了高级语言,然后我们编程程度得到了极大的提高。大家如果想想来说,如果没有高级语言,我们现在的发展就会慢很多很多,这也是抽象的一大概念。当然不要老长别人的威风,其实对于我们网络也有很大的抽象的进展,分层的结构就被认为非常好的抽象,分解的抽象,点对点,然后最后形成了这样一个,其实也是抽象的过程。如果让我看的话,我觉得网络最大的不好的地方就是我们在控制平面上我们的抽象做得不够好。其实最近意识到以后也已经有了很大的进步。这一点来说,我想说一点最近一段的,尤其对我影响比较大的一点就是一个老师,他在2011年的时候,他提到了控制平面的抽象非常重要,而且他指出了方向,在控制层面有三个抽象非常重要,你把网络的基本信息,分布的信息收集出来,从底下向上提出来。第二点怎么做呢?就是你应该引入抽象,使得上面的配置更加简单。第三个方面,她提到的就是大家最关注的一点就是更新版的一些。

其实来说这三个抽象不只有,它们已经开始进入实际系统之间了。一个系统是我今天提到的,这张图是来自一个网站,他说如果你不用这个来的话,那么它对你来说就没有太大的意义。从这个角度来看,它就是支持这个抽象。大家看到右边有点绿色的,它就是收集底层的信息形成一个中央的。当然这张图中间没有,其实来说越来越多的大家在开发基于这个模块的抽象存到这个中间去。第三个,大家看到红色的一点,你把它抽象出来放在这个中间去。所以来说这三个抽象,都已经反映出来了。而且通过这张图大家可以看到,整个的架构是什么呢?它是基于数据抽象为基础的整个的体系结构。那么不只有这一点,大家可以看到另外做的比较好的系统。这张图大家可以看到,它会有几个基本的概念也都表达出来了,可以看到它也是关键的一个抽象的设计,中间你有各种各样的数据,所以大家如果对它比较熟悉的话,它们是抽象。然后在这个中间有一个上面的需求,然后在这个中间会有一个,是为了支持这个抽象的。基本上来说,这两个现在比较活跃的系统都是基于数据抽象的设计。如果既然有了这两个设计,那么我们现在就在想,现在基于抽象设计的体系结构,我们可以站在比较高的角度上来看,基于这样一种架构,它们有什么共同的特点。这个时候来说,我就有这样的一个,我把它中间存的数据分为了两类,左边一类是什么呢?是刚才说的就是用户的配置。其实这两个存储的数据是不一样的,左边的数据主要是收集的,全局性的。另外是从底层收集来的数据,另外一个是从用户中间收集来的数据。右边大数据来自于生成的,而且一般来说是分布的,右边的是不存在的,这是你系统需要生成的,所以它们非常不同。如果你通过这样宏观的来看,你只要盯着这个图看五分钟,你会意识到一点,我左边需要收集,右边生成。那我怎么从左边生成的数据来到右边的数据?今天我报告的主题是什么呢?当天的架构存在的最大问题,就是从左边到右边的数据怎么生成,而且我今天的报告,从左边的数据生成右边的数据困难,而且来说是不能够用基于数据的抽象来完成的。为什么呢?左边要变换成右边的数据,变换需要有步骤,步骤需要有算法。所以从这个角度来说的话,当前的架构来说,怎么样从左边到右边去。而且尤其这个变换非常的难,具体的说一点为什么它难,总的来说,大家说你说难,为什么难?我说两点。刚才说了,底层的数据非常底层,其实非常有限。这个可以理解,为什么?这右边的是为了硬件来实现的,硬件实现的东西应该简单,就是所有的C语言很简单,要做硬件实现。这是第一点,而且是非常有限的。

还有一点,它的底层的东西,右边的东西不断地变换,而且我认为越变越复杂。三个礼拜以前来说,在这个中间一开始引爆特别关键的人物都发表了这样的观点,意思是什么呢?它不断地变化。当然我不一定同意它的观点,但是它一定在变化。一旦有变化,就会生成一个环境,一旦有这样的环境来说,就会非常复杂。本身底层有限,而且不断地变化,最后很可能很多各种各样的底层的抽象都会存在。这是它的复杂的原因。当然如果这么来说的话,你还是觉得这个东西太抽象了,所以我要给大家看一点例子。这个是我们的一个特别简单的例子,这个例子很简单,但是我希望大家看一下这个例子。这个SDN的例子很简单,我只有一个网络,大家看上面来说,我假设已经从上层收集了用户的需求了,SSH,这是你上面的用户的需求已经收集了,来自于上面。底层来说的话,你已经做了很好的工作,它已经把网络的信息收集了,全局了。这个时候来说,这两点宏观的描述,它不能够生成第三个抽象,右边的抽象。第三个抽象,像我刚才提到的只能依赖于程序,因为它是一个变换的过程。所以来说的话,这个时候我就给大家一个很简单的,这个程序表述的很简单。拿到一个包,你看到这个包的目的地址,如果是,把这个包扔掉,如果是的话。如果不是的话也很简单,你就找到这个目的地的地址,然后你从这里出去。这是它的转换的过程,对不对?只有这样的话,你才能真正从宏观的东西,全局的东西转换成具体的。但是当前的SDN是不支持这样的东西了,你写了这样的程序你没有生成任何的第三个抽象,你必须把第三个抽象生成它,那么怎么生成呢?你没有生成任何的抽象?你需要生成第三个抽象。同时来说,你当然为了另外一个,你也要生成它相关的抽象,这是一个基本原则。你说终于我可以生成抽象了,任务完成了吗?没有,刚才我举的例子,它底层的抽象是非常底层的,而且是有限的。什么叫有限呢?它不支持逻辑,这必须糟糕。你得有优先级,我要把这个不等于的条件前面加一个出来,来模拟这样一个逻辑,所以怎么做呢?你得算不同的优先级,所以你的程序变成了这样子。如果你用全局的程序让这个程序运行,收集所有的,这个程序是正确的。但假设来说,你不是的,刚才我说一大特点,另外一个来说它的存储有限,你不可能把所有的下传下去。

咱们现在来看一个简单的例子,假设这是我的程序,然后第一个包过来了,这个包来说是比如说它的目的地址是A,这个时候来说它会帮你设置一个路过来,当前的情况下生成一个,然后这个时候第二个包来了,第二个包它的目的地还是A,这个包来了,意味着什么呢?这个流量没有进去,所以这个程序还是不对的。你怎么办呢?你还得接着改这个程序,你得在前面加一个,这样才能对。然后我应该怎么做呢?其实我可以把前面的拷贝过来,所以程序变成了这样子的。这个是当前的,复杂不复杂?这是当前的。这是我要说明的第一个例子。

让我再举第二个例子。第二个例子想要说明的是什么呢?我现在来说我加了一个东西,就是你想想我随时带的是什么呢?我的程序可以写成这个样子。第二个我做了什么事情呢,我怎么做呢?非常简单的一个程序,宏观来表达。来从高层的转化成底层的东西,但可惜这个东西转化,因为我没有生成第三个抽象。所以我们还得回到刚才的上面去。而且这样来说的话,我用SDN做这个。这个时候来说,咱们可以看一点点小东西,我做了一个小小的变换,我不是有四个,我只有三个,刚才的彻底不工作了。为什么呢?事实来说的话,如果你只用1.0的话,你不可能实现这一点,如果你没有的话,假设NFV的话,你可以NFV来实现,到底我有哪些状态,我都把它生成,这个就变成了极其复杂的一件事情。我觉得从这两个例子来看,我们当前整个的编程还有很大的不足的地方,这个问题还极其的复杂,极其的底层。

我今天主要要讲的目的,主要也想说的一点,这样一个目标,这个目标是什么呢?就是中间这个,它不生成任何的第三种的,用户来说怎么做呢?你就写最最高层的程序,但是你怎么做呢?你不生成。而它应该怎么做呢?是SDN生成的。这是我今天讲的主要目的。只有这个程序来说的话极其简单,所有的程序都没有了。从整个来看,变换是什么呢?左边是当前的,右边的是新的一种抽象,这种抽象是什么呢?是一种分解的。分解是什么呢?你来写这个流程,但是你把很多细节的移到了你的DOS里头去,这是比较宏观的。经过这样做了以后,整个系统架构变成了什么样子呢?就变成了这个样子。好的东西我们不扔掉。所以需要去写程序,我们有这样一种方式。然后你解释之后,你生成什么呢?然后你把它生成右边的,这样的编程就变成了什么呢?你这个编程完全和它无关了,刚才我说到了将来的发展趋势是什么呢?我需要说明的是什么呢?你完完全全把底层的东西抽象掉了,这样你的好处在于什么呢?第一,你写的东西和平台无关。咱们早期要写X86的程序,现在来说几乎没有一个程序是跟这个有关系的,它们和底层的某种程度上来说无关,一旦你变成如此之高以后,如果你是华为,你的程序员的能力会极大的提高。如果你是一个IT人员的话,你的好处就是你敢写程序了。这样来说的话,你就可以参与了,当然一个真正的标准是什么呢?任何人都可以自己做,而不是把别人的拿过来做一个配置,这是一个非常核心的抽象。当然我前面说到很多抽象,大家可能认为这是一个梦想,实现不了,事实上都可以做到的。

我上面说两点,说我们做的工作,一个是我们在2013年做的,这个系统就是刚才我说的写成那种程序。你拿过来,可以自动的生成所有的,这是2013年做到的东西。在过去的一年多来说,因为我不只有1.0,我还有1.2、1.3,比如说符号计算,你就可以自动的生成这个东西,可以生成1.3。我们在6月份的时候会做一个活动,这个时候你看到用户的编程完完全全这个程序跟底层的抽象无关,当然你在设计上,无论是1.3还是怎样的,但是跟程序员完全没有关系。如果有了这一点,其实我今天讲的一大目的是什么呢?我们希望大家能够共同的合作,共同来做这样一种开放的,标准的,这样一个和数据平面无关的这种编程模型。我们需要做什么呢?我们需要做API,我们希望能够有一个标准,而且有不同的形式,是用库呢?我们希望能够共同合作,共同做这样一个东西出来。我们希望最终,就像你写的C程序来说,它可以装在X86的程序上,我们希望你写的程序跟这个无关,跨平台。这样来说,你需要用一个标准的形式完全使得它们可以替换,以最大的程序保护你的投资,你自己的程序。

最后一章,关于技术的。这个是什么呢?如果我们有这样一种编程的模型。我就要问这样一个问题,我们是否有这种可能性来设计一个统一的,包括SDN和NFV一起。大家可以这样想,SDN做的事情是什么呢?就是拿一个包过来,调动它的移动。那么NFV就是调动它在那个地方运行,你只要引入小小的概念,你就很可能能够把这两点结合在一起。像我刚才举的第二个例子,上面已经有了这个例子。以第二个例子作为例子来说的话,整个的系统它会知道,这种东西,这种状况它可以实现。如果没有的话,你可以把它送回去,但是用户不知道,这难道不是一个最好的抽象的地方吗。

这是最后一个,我特别喜欢,它讲的是什么呢?我提到这个抽象,过去来说的话,我们问的问题是怎么样能够使得这个程序做到最最简单。同时我们编辑器就会变得非常容易。谢谢大家。

 
 
 
 

来源:业界供稿

0赞

好文章,需要你的鼓励

2015

05/18

12:09

分享

点赞

邮件订阅
白皮书