Friday, February 25, 2011

如何让你的“水果”更值钱?

apple

有个很经典的营销学故事,具体细节已经不记得了,下面是我个人演绎的版本。

----------------------------------故事开始------------------------------------

说课堂上,大牌教授掏出一个普通的苹果,问大家,如何卖1块钱?10块钱呢?100块……甚至100万!

卖1块钱,很简单,洗得干干净净的摆在超市,自然会有人买。

10块钱?也不难,例如,我们可以做成水果拼盘或者榨成果汁,在餐厅里也会有人购买。

100块开始就有点难度了。同学们仍然纷纷提出各种主意,例如宣称“这是一个转基因苹果,营养十分的丰富”、“这个苹果曾被带到太空中中”、“这个苹果上有明星的签名”……

100万呢?热闹的课堂一下子鸦雀无声。这太疯狂了,一个本来只值1块钱的苹果,怎么能卖出100万倍呢?

教授等了几分钟后,还是没人回答。缓缓说道:“这是当年砸到牛顿的那个苹果,将由英国女王亲自主持拍卖,筹集到款项将用于拯救饥饿中的非洲儿童,拍到者将被授予爵士勋章……全球仅此一个,底价100万!”

一下子,课堂有热闹起来了,同学们纷纷嚷道“100万?太便宜了!起码能值1000万!”

----------------------------------故事结束------------------------------------

这个故事自然夸张荒诞,相信看到的同学都会一笑了之。然而,类似的故事却在每天不断上演。

几乎同样的配置,IBM当年ThinkPad系列的笔记本要比其他品牌的贵出30%,甚至更多。

凛冽的寒风中,长长的队伍,只是为了一款成本价只有售价1/N的手机;

普通域名注册一年仅需要十几块钱,而某域名去年年底被卖出1300万美金的天价;

就在几年前,一只明朝青花瓷瓶被拍出上亿元的天价;

房子、石油、黄金……

类似的事例在生活中几乎随处可见。

一般情况下,物品的价格由价值决定。那么,到底是什么造成了升值?是需求?是品牌?是炒作?还是大家真的都疯了?

在原始社会,人都是通过打猎为生,相互之间的交换基本上以成本(很大程度上是重量,体型大的动物不仅可以提供更多的热量,也往往意味着更多的平均捕获时间)作为唯一衡量标准。在吃饱饭是第一要务的情况下,几乎没有人愿意花费时间去做除了努力生存下去的其他事情,更没有可能有其他复杂的交易理念。

很快,随着生产力提高,社会分工自然出现,事情就变得有趣起来。一方面,个人不必再把大量事件花费在维持生存上,自然就有了更多更高的需求,例如吃饱了饭之余,还希望能吃点水果帮助消化;另一方面,同样的工种之间开始出现了竞争。同样都是种苹果的水果商,我家的苹果个大还好吃,大家就愿意拿出更多的钱来买(在这里,先不讨论充满了欺诈和无耻的西方金融骗局)。于是,第一个影响价格的重要因素就出现了,那就是质量。质量好的,就更值钱!

社会的发展是飞速的。人的需求发展也是飞速的。有聪明的人发现,把苹果轧成果汁更好喝,而且还省时省力。还有人发现,人们不但喜欢吃苹果,还希望有机会尝尝其他口味的水果,特别是比较少见的稀有的水果。聪明的水果商于是宣布,提供更高级的水果产品,不仅包括洗干净、包装好的完整水果,还提供水果汁、水果酱……等一系列产品。并且,为了满足大家的口味需求,还将从遥远的国度运来大家从未听说过的水果品种,购买者还能得到去皮去核的服务。当然,这个价格嘛,要适当的涨涨。对此,大家也都选择了接受。虽然不喜欢花钱,但为了更好的服务享受,多花点钱也是值得的。因此,服务可以提升价格

交通的发展极大促进了商业的发展。聪明的水果商人们发现不同地区的人们对于水果的需求是不同的,愿意为之掏的钱也是不一样的。为了赚到更多的钱,我们不能光呆在一个地方。水果商们唱着小曲开开心心地四处拓宽市场。一个新的问题出现了。到了一个新的地方,水果商需要付出大量时间和代价让人们认识自己的产品。但过些年再回来,可能新的人们就不知道自己了。反反复复,水果商伤透了脑筋。于是有聪明人想出了个点子,我们每家水果商都起个代号吧。毕竟,人们记住代号要比记住水果商本身简单一些。于是,品牌出现了。优秀水果商的品牌被人们牢记,并被四处宣传,他们的水果也就容易卖出。新出现的水果商要想卖出水果,需要花出更多的代价。于是,各个水果商为了提升自己的品牌影响力,纷纷使出各路神通,明星代言、慈善活动、各种广告……可见,品牌是提升价格的重要因素

人的欲望是没有限制的,商人赚取利润的天性也是没有极限的。大的水果生产商每天都在琢磨怎么才能赚取更多的钱。他们通过观察发现,小水果商因为成本有限,往往无力去运输极远地区的稀有水果。于是,大水果商决定联合起来,成立一个“保护稀有水果维持公平竞争联盟”。联盟内部成员统一运输和贩卖稀有水果,联盟外成员不允许贩卖,否则将被处以重罚。小水果商要想加入联盟,很简单,需要每年缴纳“会员费”。小水果商打掉牙往肚里咽,缴纳了会员费的拣点边缘利润,缴纳不起的只好宣布破产或转行了。到了这一步,大水果商终于可以高枕无忧了。实际上,垄断是自由定价的唯一先决

好了,分析到这里,已经可以回答大部分的问题了。IBM、Apple之类的大生产商,东西比别家贵,无他,质量、服务是很重要的因素,品牌跟垄断也是不可忽视的。同样的道理,其实也适用于各行各业。一般来说,质量是实在的,也是难以短期内体会或比较到的。形成垄断,对于普通企业来说,更是难以实现的。因此,服务跟品牌这两大虚拟价值,就成了信息时代里相互竞争十分关键的因素。而这两者的根本都在于用户体验。当我们点开一家公司的网页,惊奇地发现页面设计毫无美感,技术毫无规范(例如仅支持IE、gb2312编码等),我们就知道,这家公司其实并不在乎它的服务跟品牌,并不在乎它的用户(特别表现在用户体验);同样的,当我们拿到一个申请人的简历,发现布局混乱、信息极难获取的时候,我们也会不自觉的认为这个人不尊重这个申请,甚至将其直接忽略。如果你还有所怀疑的话,可以去留心成功企业的宣传和所作所为。

是的,这就是让水果增值的所有秘密。如果阅读后你觉得自己懂得了点什么,那么无论是不是一个企业家,每天睡觉前都可以尝试问问自己——

今天,你的水果更值钱了么?

NOX -- 现代网络操作系统

[注]本系列前面的三篇文章中,介绍了软件定义网络(SDN)的基本概念和相关平台。按照SDN的观点,网络的智能/管理实际上是通过控制器来实现的。本篇将介绍一个代表性的控制器实现——NOX。
现代大规模的网络环境十分复杂,给管理带来较大的难度。特别对于企业网络来说,管控需求繁多,应用、资源多样化,安全性、扩展性要求都特别高。因此,网络管理始终是研究的热点问题。

从操作系统到网络操作系统

早期的计算机程序开发者直接用机器语言编程。因为没有各种抽象的接口来管理底层的物理资源(内存、磁盘、通信),使得程序的开发、移植、调试等费时费力。而现代的操作系统提供更高的抽象层来管理底层的各种资源,极大的改善了软件程序开发的效率。
同样的情况出现在现代的网络管理中,管理者的各种操作需要跟底层的物理资源直接打交道。例如通过ACL规则来管理用户,需要获取用户的实际IP地址。更复杂的管理操作甚至需要管理者事先获取网络拓扑结构、用户实际位置等。随着网络规模的增加和需求的提高,管理任务实际上变成巨大的挑战。
而NOX则试图从建立网络操作系统的层面来改变这一困境。网络操作系统(Network Operating System)这个术语早已经被不少厂家提出,例如Cisco的IOS、Novell的NetWare等。这些操作系统实际上提供的是用户跟某些部件(例如交换机、路由器)的交互,因此称为交换机/路由器操作系统可能更贴切。而从整个网络的角度来看,网络操作系统应该是抽象网络中的各种资源,为网络管理提供易用的接口。

实现技术探讨

模型

NOX的模型主要包括两个部分。
一是集中的编程模型。开发者不需要关心网络的实际架构,在开发者看来整个网络就好像一台单独的机器一样,有统一的资源管理和接口。
二是抽象的开发模型。应用程序开发需要面向的是NOX提供的高层接口,而不是底层。例如,应用面向的是用户、机器名,但不面向IP地址、MAC地址等。

通用性

正如计算机操作系统本身并不实现复杂的各种软件功能,NOX本身并不完成对网络管理任务,而是通过在其上运行的各种“应用”(Application)来实现具体的管理任务。管理者和开发者可以专注到这些应用的开发上,而无需花费时间在对底层细节的分析上。为了实现这一目的,NOX需要提供尽可能通用(General)的接口,来满足各种不同的管理需求。

架构

组件

下图给出了使用NOX管理网络环境的主要组件。包括交换机和控制(服务)器(其上运行NOX和相应的多个管理应用,以及1个Network View),其中Network View提供了对网络物理资源的不同观测和抽象解析。注意到NOX通过对交换机操作来管理流量,因此,交换机需要支持相应的管理功能。此处采用支持OpenFlow的交换机。
nox

操作

流量经过交换机时,如果发现没有对应的匹配表项,则转发到运行NOX的控制器,NOX上的应用通过流量信息来建立Network View和决策流量的行为。同样的,NOX也可以控制哪些流量需要转发给控制器。

多粒度处理

NOX对网络中不同粒度的事件提供不同的处理。包括网包、网流和Network View等。

应用实现

NOX上的开发支持Python、C++语言,NOX核心架构跟关键部分都是使用C++实现以保证性能。代码可以从http://www.noxrepo.org获取,并遵循GPL许可。

系统库

提供基本的高效系统库,包括路由、包分类、标准的网络服务(DHCP、DNS)、协议过滤器等。

相关工作

NOX项目主页在http://noxrepo.org
类似的项目包括SANE、Ethane、Maestro、onix、difane等,有兴趣的同学可以进一步研究参考。

Sunday, February 20, 2011

欢迎大家参加HostView计划

帮别人宣传一下。
项目主页http://cmon.lip6.fr/EMD/Home.html
项目介绍:HostView是法国CNRS and UPMC巴黎大学LIP6实验室的Renata Teixeira及其学生发起的项目,通过在线采集用户的网络状态信息跟用户反馈的部分体验信息来找出网络中影响性能的因素。所有收集到的信息均会被匿名化处理,保护用户隐私。
目前,HostView提供Mac版本跟Linux版本。此外,前100个参与1个月的用户将有机会获得50$的amazon购物卡。
下载地址http://cmon.lip6.fr/EMD/Download.html
用户手册http://cmon.lip6.fr/EMD/Download_files/user-manual_Linux.pdf

Linux用户在下载源代码并解压后,可以通过下面的步骤安装
1 检查依赖
执行 ./checkreqs.pl
如果不满足安装依赖,会提示安装缺少的包
2 配置编译
./configure;
make
3 设置权限
./SetPermissions
4 运行程序
./HostView

Thursday, February 17, 2011

RSA2011会展观记

相信IT安全领域的人对于RSA大会都不陌生。自1991年首次举行以来,RSA大会影响越来越大,规模也越来越大,现在已经成为IT安全领域名副其实的最吸引人的大会。近几年RSA会议的举办地点都是在旧金山湾区,吸引了大批来自世界各地的安全提供商、学者、爱好者参加。今年的举办地点是旧金山的Moscone中心,恰逢其20周年,会议长达5天(2.14~2.18)。感兴趣的读者可以从RSA网站上了解到具体的日程信息。

自1995年开始,RSA大会每年都有一个主题,今年的主题是“The Adventure of Alice&Bob”,安全的味道颇为浓厚。包括Cisco、Juniper、Palo Alto Networks等数百家知名企业均参与了会展。尤为值得一提的是,国内的NSFocus(绿盟)、TopSec(天融信)和新兴的HillStone(山石)等公司也分别携产品参展,吸引了不少目光(这才是民族的骄傲,年轻人的榜样)。总体来看,云计算的痕迹到处可见,Facebook跟Twitter很受安全厂商重视。另外,网关类安全产品在提到性能时基本上都是100G以上。

除了在大厅中进行的会展之外,还有几十个专门的技术类讲座。几乎设计所有安全热点问题,包括云、P2P、加密等等。

下面是在展会现场拍到的一些场面。

一直忙忙碌碌的Registration Desk。

 

IMG_0009

IMG_0015

Cisco跟Juniper今年看起来十分低调,位置极佳,但不是那么热闹。

 

IMG_0011

IMG_0004

Paloalto Networks位置也不错,关于NGFW的讲解十分风趣,吸引了大量的人气。

 

IMG_0023

绿盟准备很充分。

 

IMG_0010

山石团队,干劲十足的小伙子们。

 

IMG_0017

别具一格的中关村联盟。中国人走的很不容易啊。

 

IMG_0012

IMG_0021

EMC跟VMware“心有灵犀”地大炒云跟虚拟化。

 

IMG_0024

CVM也吸引了大批眼光。

 

IMG_0029

IMG_0032

美女助阵是大多数展台的统一伎俩。

 

IMG_0031

IMG_0036

吸引眼光的另一伎俩是抽奖——奖品不约而同的都是IPad。

 

IMG_0034

电视台现场搭了直播棚。

 

下面是部分其他参展企业的情形。

IMG_0016IMG_0018IMG_0019IMG_0026IMG_0027IMG_0030

IMG_0035IMG_0037

IMG_0013IMG_0014

IMG_0008IMG_0020

Tuesday, February 15, 2011

操作系统革命·代码



对于每个吃计算机这碗饭的人来说,有两个词必定耳熟能详——GNU跟Linux。这两个早已被铭刻进现代计算机技术发展史的词语,直接改写了软件技术的演变历程,让我们今天能享有这么多计算机技术带来的好处。作为记载那段传奇历史的两部纪录片:《操作系统革命》跟《代码》,一直在圈子里默默流传。前几天断断续续看了这两部短片,写点东西出来也算宣传宣传。
软件大爆炸
众IT民工传说,在那个不算遥远的年代里,计算机开始走下神坛,工艺的提高使得小型计算机的出现有了可能,从而具备了初步进入家庭个人使用的条件。现在已经成为IT巨头的IBM,那个时候并没有出太多的风头。或许是因为卖打卡机起家的缘故,蓝色巨人对于硬件好卖钱这个道理坚信不疑。在牢牢霸住电子计算机的硬件生产之余,并没在意几家当时还不太起眼的小公司。
1975年,微软诞生;1976年,苹果诞生*……短短几十年时间,软件产业的大爆炸,不仅催生了大批的IT巨头,更让计算机的概念有了天翻地覆的变化。原来,计算机不仅仅能用来做数学计算,它甚至能唱歌、能绘画、能上网……时至今日,计算机已经成为现代人生活不可或缺的一部分。
回顾这段历史,无数高深莫测的学者纷纷指出,软件,是计算机的灵魂所在。
微软梦
在软件产业里,有个比较特殊的成员,那就是操作系统。它负责为运行其上的众软件分配硬件资源,并将它们的请求和行为解释给硬件。简单地说,操作系统是个热心的大管家,有了它,其他软件的设计可以得到大大的简化。也正因此,操作系统成为现代计算机不可或缺的重要部件。操作系统,已经远远超越了普通软件的意义。
大名鼎鼎的微软,凭借其windows系列操作系统已经从个人用户手中圈走了几千亿美金,直到今天在部分国家中还在继续。如果一切如gates同学(微软主要创始人)当初所料,今天每一位个人用户都需要在自己的电脑上安装一份windows(正版),并需要购买在其上使用的每一份软件。为了能运行那些臃肿庞大的代码,我们不得不频繁购买最新的硬件,却始终难以获得令人满意的性能。Wintel帝国联手将软件产业变成完全封闭垄断,Google、Facebook,这些依赖互联网的新兴企业压根不要想出现,因为Wintel垄断下的互联网必定举步维艰,可能要到22世纪才能有足以支持BBS出现的软硬件环境(夸张了吧,你们懂得)。
GNU与Linux
事情到了1984年,开始出现变化。Richard Stallman,这个有着一脸大胡子的MIT AI实验室学生,启动了GNU计划。GNU计划的初衷是自由软件(Free Software),即鼓励GNU社区内分享软件的源代码,试图通过大规模的合作来创造出优秀的软件。GNU的目的是打造一个完善的GNU操作系统,以取代Unix(Unix并不开源)。这一计划一提出就引起了工程师们浓厚的兴趣,短短几年时间,大量优秀的软件被快速开发出来,bug总能被很快发现并得到纠正。很快,除了系统内核,其他一切都有了。这个时候,人们开始注意到一个有趣的项目,那就是后来光芒四射的Linux。
1991年,芬兰首都赫尔辛基大学学生Linus,基于Minix系统,试图开发一个简单的操作系统。或许他的初衷只是为了满足个人的兴趣,但Linus将代码公开在网络上发布了,并欢迎大家反馈。很快,再次借助合作的力量,Linux成长为了一个成熟的系统内核,并被GNU项目选定。从这个意义上说,我们今天所说的Linux操作系统,确实应该叫做GNU操作系统。值得一提的是,有人估计,时至今日,Linux内核中Linus所写的代码已经占不到2%,足可见GNU软件运作方式的强大。在这里,推荐大家阅读《大教堂和市集》一文,对这种开发方式有比较全面的分析。
因为在英文里,自由软件这个词,经常被人误认为是免费软件,后来GNU的一帮人商定采用开源软件(Open Source)的说法,虽然后来略有争议,但已经被大部分人认可。
盈利模式
对于传统软件提供商例如微软来说,盈利是一件简单而自然的事情,一份软件光盘,则拿到一份销售的价钱。而且,占据操作系统的天时地利,可以任意制定其他软件的生死。比如当年的netscape公司,因为微软在自己销售的windows中绑定IE,最终被淘汰。这其中虽然有多方面原因,但毫无疑问,确实无人敢也无人能挑战微软老大。试想,哪天微软开发出来一个软件,捆绑进windows,然后一旦检测有同类其他公司开发的软件存在,就弹出对话框提示
“尊敬的windows用户,很遗憾的告诉您,因为在您的系统中检测到有xx软件存在,为了您的系统安全,我们很艰难的做出决定,在您卸载xx软件之前,windows将无法正常进入。另外我们推荐您用windows自带的MS xx软件,系统更安全,用着更放心……”
那所有搞软件的人还不都吐血身亡。
对于开源软件来说,盈利则要复杂一些。比较成功的例子是redhat,redhat的操作系统代码可以免费获取,但他通过技术支持跟服务来收取费用。因为不是每个人都愿意碰到问题自己去看代码或者写代码的。特别对于企业来说,支付一些费用,获得有保障的操作系统支持是值得的。更何况,代码都是公开的,也不怕嵌入什么后门或者有什么漏洞。用着啥软件不爽了甚至可以随意自己改一个自定义的出来。
后记
对于开源或者闭源,我并不特别倾向于哪一家。在我看来,开源的好处在于合作,在于分享,任何人都能免费拿到代码,都能进行修改,可以实现高质量的代码。闭源则在于能集中力量完成特定目标,例如对于某些少数人用的专业软件,相信没有大批程序员愿意或有能力去创造出来,这个时候闭源就可以派上用场了。从某种意义上说,闭源销售的其实也是服务,是针对某些特殊目的订制软件的服务。而开源,则解决的是大众需求。其实无论开源还是闭源,两者也各有各的问题,例如开源往往重视的是群体,比如软件的性能,而容易忽略UI细节,闭源则存在难以满足个性化需求、bug解决不及时的问题。因此,我们需要的应该是一个重视普通用户体验的开源社区,或是一家有良心、负责人并愿意不垄断的闭源公司。听起来好像前者更容易实现一些。
从更高层次来说,开源的精神是分享,闭源的精神是自私,当然,分享似乎是要更美好一些。但在“生产力”没有达到较高水平的时候,两者的共存也并不稀奇,反过来正因为有了对手,才能催化着软件产业飞速向前,让我们的计算机越来越强大。
*就在写作这篇文章的时候,苹果公司市值已经超过3000亿,约是微软公司的1.5倍。

Saturday, February 12, 2011

How to give an academic presentation

A book on how to give an academic presentation. 
(CN, updated on 06/11/2010, alpha version).


Download.

Mininet – “懒惰”网络研究者的福音

注:本文的一个精简版本2011/01/08发表于弯曲评论

【摘要】在本系列前两篇文章里,我们分别介绍了软件定义网络的两大利器——OpenFlow和Open vSwitch。不少研究者可能很有兴趣尝试一下,却拿不出太多的时间。本文将介绍一套强大的轻量级网络研究平台——mininet,通过它相信大家可以 很好地感受到软件定义网络的魅力。 

概述篇

作为研究者,你是否想过,在自己的个人笔记本上就可以搭建一套媲美真实硬件环境的复杂网络,并轻松进行各项实验?无论是用专业级的硬件实验平台,还 是用传统的虚拟机,都显得太过昂贵,且十分不方便进行操作。如果你有类似的需求,不妨试试mininet,绝对是“懒惰”却又追求效率的研究人员的福音。
Stanford大学Nick McKeown的研究小组基于Linux Container架构,开发出了这套进程虚拟化的平台。在mininet的帮助下,你可以轻易的在自己的笔记本上测试一个软件定义网络 (software-defined Networks),对基于Openflow、Open vSwitch的各种协议等进行开发验证,或者验证自己的想法。最令人振奋的是,所有的代码几乎可以无缝迁移到真实的硬件环境中,学术界跟产业界再也不是 那么难以沟通了。想想吧,在实验室里,一行命令就可以创建一个支持SDN的任意拓扑的网络结构,并可以灵活的进行相关测试,验证了设计的正确后,又可以轻 松部署到真实的硬件环境中。
mininet作为一个轻量级软定义网络研发和测试平台,其主要特性包括
  • 支持Openflow、OpenvSwitch等软定义网络部件
  • 方便多人协同开发
  • 支持系统级的还原测试
  • 支持复杂拓扑、自定义拓扑
  • 提供python API
  • 很好的硬件移植性(Linux兼容),结果有更好的说服力
  • 高扩展性,支持超过4096台主机的网络结构

实战篇

获取镜像

官方网站已经提供了配置好相关环境的基于Debian Lenny的虚拟机镜像,下载地址为http://openflowswitch.org/downloads/OpenFlowTutorial-081910.vmware.zip, 压缩包大小为700M左右,解压后大小为2.1G左右。虚拟机镜像格式为vmware的vmdk,可以直接使用vmware workstation或者virtualbox等软件打开。如果使用QEMU和KVM则需要先进行格式转换。后面我们就以这个虚拟os环境为例,介绍 mininet的相关功能。
如果使用virtualbox进行加载,需要注意
  • 尽量使用最新版本
  • host操作系统需要支持pae,并在virtualbox中打开pae支持。

登录镜像

默认用户名密码均为openflow,建议通过本地利用ssh登录到虚拟机上使用(可以设置自动登录并将X重定向到本地),比较方便操作。
注意事项:
  • 建议将guest主机采用bridge方式联网,以获取host可见的独立IP;也可采用为guest配置两块网卡方式,一块采用NAT,一块采用host-only,但host-only的网卡可能无法自动dhcp到地址,需要手动配置(ifconfig eth1 ip/mask)
  • 将host机.ssh目录下id_rsa.pub复制到guest机的.ssh目录下,并写入authorized_keys,实现自动认证

简单测试

创建网络

mininet的操作十分简单,启动一个小型测试网络只需要下面几个步骤。
  1. 登录到虚拟机命令行界面,打开wireshark,使其后台运行, 命令为sudo wireshark &
  2. 启动mininet,命令为sudo mn,则默认创建如下图所示的网络拓扑
  3. 经过短暂的等待即可进入以mininet>引导的命令行界面

好了,从现在开始,我们就拥有了一个1台控制节点(controller)、一台交换(switch)、两台主机(host)的网络,并且用wireshark进行观测。下面进行几项简单的测试。
注意:使用wireshark检测lo网卡,并通过过滤of协议可以看到OpenFlow的网包。

查看信息

查看全部节点:
mininet> nodes
available nodes are:
c0 h2 h3 s1
查看链路信息:
mininet> net
s1 <-> h2-eth0 h3-eth0
输出各节点的信息:
mininet> dump
c0: IP=127.0.0.1 intfs= pid=1679
s1: IP=None intfs=s1-eth1,s1-eth2 pid=1682
h2: IP=10.0.0.2 intfs=h2-eth0 pid=1680
h3: IP=10.0.0.3 intfs=h3-eth0 pid=1681

对节点进行单独操作

如果想要对某个节点的虚拟机单独进行命令操作,也十分简单,格式为 node cmd。例如查看交换机s1上的网络信息,我们只需要在执行的ifconfig命令前加上s1主机标志即可,即 s1 ifconfig,同样,如果我们想用ping 3个包的方法来测试h2跟h3之间连通情况,只需要执行 h2 ping -c 3 h3 即可。得到的结果为
mininet> h2 ping -c 3 h3
PING 10.0.0.3 (10.0.0.3) 56(84) bytes of data.
64 bytes from 10.0.0.3: icmp_seq=1 ttl=64 time=7.19 ms
64 bytes from 10.0.0.3: icmp_seq=2 ttl=64 time=0.239 ms
64 bytes from 10.0.0.3: icmp_seq=3 ttl=64 time=0.136 ms
— 10.0.0.3 ping statistics —
3 packets transmitted, 3 received, 0% packet loss, time 2006ms
rtt min/avg/max/mdev = 0.136/2.523/7.194/3.303 ms
在本操作执行后,可以通过wireshark记录查看到创建新的流表项的过程,这也是造成第一个ping得到的结果偏大的原因。更简单的全网络互ping测试命令是pingall,会自动所有主机节点逐对进行ping连通测试。

常用功能

快捷测试

除了cli的交互方式之外,mininet还提供了更方便的自动执行的快捷测试方式,其格式为sudo mn --test cmd,即可自动启动并执行cmd操作,完成后自动退出。
例如 sudo mn --test pingpair,可以直接对主机连通性进行测试,sudo mn --test iperf启动后直接进行性能测试。用这种方式很方便直接得到实验结果。

自定义拓扑

mininet提供了python api,可以用来方便的自定义拓扑结构,在mininet/custom目录下给出了几个例子。例如在topo-2sw-2host.py文件中定义了一个mytopo,则可以通过--topo选项来指定使用这一拓扑,命令为
sudo mn --custom ~/mininet/custom/topo-2sw-2host.py --topo mytopo --test pingall
同样的,我们可以通过下面的python脚本来完成对一个2层tree拓扑网络的测试
from mininet.net import Mininet
from mininet.topolib import TreeTopo
tree4 = TreeTopo(depth=2,fanout=2)
net = Mininet(topo=tree4)
net.start()
h1, h4  = net.hosts[0], net.hosts[3]
print h1.cmd('ping -c1 %s' % h4.IP())
net.stop()

使用友好的mac编号

默认情况下,主机跟交换机启动后分配的MAC地址是随机的,这在某些情况下不方便查找问题。可以使用--mac选项,这样主机跟交换机分配到的MAC地址跟他们的ID是一致的,容易通过MAC地址较快找到对应的节点。

使用XTerm

通过使用-x参数,mn在启动后会在每个节点上自动打开一个XTerm,方便某些情况下的对多个节点分别进行操作。命令为
sudo mn -x
在进入mn cli之后,也可以使用 xterm node 命令指定启动某些节点上的xterm,例如分别启用s1跟h2上的xterm,可以用
xterm s1 h2

链路操作

在mn cli中,使用link命令,禁用或启用某条链路,格式为 link node1 node2 up/down,例如临时禁用s1跟h2之间的链路,可以用
link s1 h2 down

指定交换机跟控制器类型

通过--switch 选项跟--controller选项可以分别指定采用哪种类型的交换机跟控制器,例如使用用户态的交换
sudo mn --switch user
使用OpenvSwitch
sudo mn --switch ovsk
使用NOX pyswitch
1)首先确保nox运行
cd $NOX_CORE_DIR
./nox_core -v -i ptcp:
然后ctrl-c 杀死nox进程
2)然后指定nox交换机
sudo -E mn --controller nox_pysw
注意:通过-E选项来保持预定义的环境变量(此处为NOX_CORE_DIR)。

名字空间

默认情况下,主机节点有用独立的名字空间(namespace),而控制节点跟交换节点都在根名字空间(root namespace)中。如果想要让所有节点拥有各自的名字空间,需要添加 --innamespace 参数,即启动方式为 sudo mn --innamespace
注意:为了方便测试,在默认情况下,所有节点使用同一进程空间,因此,在h2跟h3或者s1上使用ps查看进程得到的结果是一致的,都是根名字空间中的进程信息。

启动参数总结

-h, --help            show this help message and exit
--switch=SWITCH       [kernel user ovsk]
--host=HOST           [process]
--controller=CONTROLLER [nox_dump none ref remote nox_pysw]
--topo=TOPO           [tree reversed single linear minimal],arg1,arg2,...argN
-c, --clean           clean and exit
--custom=CUSTOM       read custom topo and node params from .py file
--test=TEST           [cli build pingall pingpair iperf all iperfudp none]
-x, --xterms          spawn xterms for each node
--mac                 set MACs equal to DPIDs
--arp                 set all-pairs ARP entries
-v VERBOSITY, --verbosity=VERBOSITY [info warning critical error debug output]
--ip=IP               [ip address as a dotted decimal string for aremote controller]
--port=PORT           [port integer for a listening remote controller]
--innamespace         sw and ctrl in namespace?
--listenport=LISTENPORT [base port for passive switch listening controller]
--nolistenport        don't use passive listening port
--pre=PRE             [CLI script to run before tests]
--post=POST           [CLI script to run after tests]

常用命令总结

help     默认列出所有命令文档,后面加命令名将介绍该命令用法
dump    打印节点信息
gterm    给定节点上开启gnome-terminal。注:可能导致mn崩溃
xterm    给定节点上开启xterm
intfs    列出所有的网络接口
iperf    两个节点之间进行简单的iperf TCP测试
iperfudp     两个节点之间用制定带宽udp进行测试
net    显示网络链接情况
noecho    运行交互式窗口,关闭回应(echoing)
pingpair    在前两个主机之间互ping测试
source    从外部文件中读入命令
dpctl    在所有交换机上用dptcl执行相关命令,本地为tcp 127.0.0.1:6634
link    禁用或启用两个节点之间的链路
nodes    列出所有的节点信息
pingall    所有host节点之间互ping
py    执行python表达式
sh    运行外部shell命令
quit/exit    退出

其他操作

执行sudo mn -c会进行清理配置操作,适合故障后恢复。
执行exit会退出mininet的cli,同时给出运行时间统计。
py cmd 使用python来执行cmd。
测试mininet启动后立刻关闭的时间可以用 sudo mn --test none

高级篇

下面我们通过一个具体管理of switch的例子来介绍一些比较高级的命令。
首先,启动vm,然后执行
sudo mn --topo single,3 --mac --switch ovsk --controller remote
生成一个小的网络,三台主机连到一台交换机上,交换机为ovs交换机,指定remote控制器(默认为本地)。
dpctl
执行
dpctl show tcp:127.0.0.1:6634
可以查看到交换机的端口等基本情况,其中tcp端口6634是默认的交换机监听端口。
执行
dpctl dump-flows tcp:127.0.0.1:6634
可以看到更详细的流表信息。
此时,流表为空,执行h2 ping h3无法得到响应。因此我们需要通过dpctl手动添加流表项,实现转发。
命令为
dpctl add-flow tcp:127.0.0.1:6634 in_port=1,actions=output:2
dpctl add-flow tcp:127.0.0.1:6634 in_port=2,actions=output:1
此时查看流表可以看到新的转发信息,同时可以在h2和h3之间ping通。

控制器
通过执行
controller ptcp:
我们可以启动一个简单的控制器,默认没有任何流表项,仅仅作为一台带学习功能的交换机。控制器默认监听端口是6633。以下控制器与交换机之间的消息交互过程,可以通过wireshark,配置of过滤器观察到。

MessageTypeDescription
HelloController->Switchfollowing the TCP handshake, the controller sends its version number to the switch.
HelloSwitch->Controllerthe switch replies with its supported version number.
Features RequestController->Switchthe controller asks to see which ports are available.
Set ConfigController->Switchin this case, the controller asks the switch to send flow expirations.
Features ReplySwitch->Controllerthe switch replies with a list of ports, port speeds, and supported tables and actions.
Port StatusSwitch->Controllerenables the switch to inform that controller of changes to port speeds or connectivity. Ignore this one, it appears to be a bug.

同样,我们可以用wireshark观察到当第一次有ping包从h2发到h3时,控制器如何自动添加相应的表项到交换机。wireshark相应的过滤器为
of && (of.type != 3) && (of.type != 2)
相关的消息过程为

MessageTypeDescription
Packet-InSwitch->Controllera packet was received and it didn't match any entry in the switch's flow table, causing the packet to be sent to the controller.
Packet-OutController->Switchcontroller send a packet out one or more switch ports.
Flow-ModController->Switchinstructs a switch to add a particular flow to its flow table.
Flow-ExpiredSwitch->Controllera flow timed out after a period of inactivity.

使用NOX
首先确定没有其他控制器在运行(占据6633端口)
sudo killall controller
同样的,启动mininet
sudo mn --topo single,3 --mac --switch ovsk --controller remote
然后启动nox,默认路径为~/noxcore/build/src,重新打开一个ssh终端执行
./nox_core -v -i ptcp: pytutorial
会自动打开运行tutorial应用的nox,打印出详细的调试信息,并监听6633端口。
直到打印出类似如下信息,说明交换机已经成功连接到nox。
00039|nox|DBG:Registering switch with DPID = 1
通过互ping测试,各个主机连通,此时switch等同于一个hub。

然后通过修改~/noxcore/src/nox/coreapps/tutorial/pytutorial.py中代码,让nox工作成一个带学习功能的交换机。相关命令参考ofinclude代码,以及nox对各个包的解析代码目录:
~/noxcore/src/nox/lib/packet/
通过编写nox程序,我们可以让交换机的行为更加智能化、复杂化。为了测试我们编写的nox程序,我们可以使用cbench来进行测试。

多条配置命令
可以写到一个文件中,用mn直接调用。例如脚本文件名为my_cli_script
则可以
mininet> source my_cli_script
或者
# mn --pre my_cli_script

总结篇

除了使用mn命令进行交互式操作以外,mininet最为强大之处是提供api可以直接通过python编程进行灵活的网络实验。在 mininet/example目录下给出了几个python程序的例子,包括使用gui方式创建拓扑、运行多个测试,在节点上运行sshd,创建多个节 点的tree结构网络等等。运行这些程序就可以得到令人信服的结果,而且这些程序大都十分短小,体现了mininet平台的强大易用性。
对mininet感兴趣可以在主页上找到更多的内容。
参考
<1> A Network in a Laptop : Rapid Prototyping for Software-Defined Networks, Bob Lantz,  Brandon Heller, Nick Mckeown, ACM Hotnets 2010;

Open vSwitch - 开放虚拟交换标准

注:本文原始版本于2010/12/20发表于弯曲评论
从虚拟机到虚拟交换
提到虚拟化,大家第一印象往往是虚拟机(Virtual Machine),VMwareVirtualbox,这些大名鼎鼎的虚拟机软件不少人都耳熟能详。对企业用户来说,虚拟技术最直接的好处是通过灵活配置资源、程序来高资源的利用率,从而降低应用成本。近些年,随着虚拟化技术、交换技术以及云计算服务的发展,虚拟交换(Virtual Switch)已经越来越多的引起人们的关注。
顾名思义,虚拟交换就是利用虚拟平台,通过软件的方式形成交换机部件。跟传统的物理交换机相比,虚拟交换机同样具备众多优点,一是配置更加灵活。一台普通的服务器可以配置出数十台甚至上百台虚拟交换机,且端口数目可以灵活选择。例如,VMwareESX一台服务器可以仿真出248台虚拟交换机,且每台交换机预设虚拟端口即可达56个;二是成本更加低廉,通过虚拟交换往往可以获得昂贵的普通交换机才能达到的性能,例如微软的Hyper-V平台,虚拟机与虚拟交换机之间的联机速度轻易可达10Gbps
虚拟交换与Open vSwitch
2008年底,思科发布了针对VMWareNexus 1000V虚拟交换机,一时之间在业界掀起不小的风头,并被评为当年虚拟世界大会的最佳新产品。或许思科已经习惯了“群星捧月”,此后很长一段时间里并没有见到正式的虚拟交换标准形成。除了惠普一年多以后提出了VEPA(虚拟以太网端口聚合器),其他厂家关注的多,做事的少。随着云计算跟虚拟技术的紧密融合,以及云安全的角度考虑,技术市场曲线已经到了拐点,业界已经迫切需要一套开放的VS标准,众多门派蠢蠢欲动。
烽烟即燃之际,Open vSwitch横空出世,以开源技术作为基础(遵循Apache2.0许可),由Nicira Networks开发,主要实现代码为可移植的C代码。它的诞生从一开始就得到了虚拟界大佬——Citrix System的关注。可能有读者对Citrix不熟,但说到Xen恐怕就是妇孺皆知了,没错,Citrix正是Xen的东家。OVS20105月才发布1.0版本。而早在1月初Citrix就在其最新版本的开放云平台(ref[2])中宣布将Open vSwitch作为其默认组件,并在XenServer5.6 FP1中集成,作为其商用的Xen管理器(hypervisor)。除了XenXen Cloud PlatformXenServer之外,支持的其他虚拟平台包括KVMVirtualBox等。
OVS官方的定位是要做一个产品级质量的多层虚拟交换机,通过支持可编程扩展来实现大规模的网络自动化。设计目标是方便管理和配置虚拟机网络,检测多物理主机在动态虚拟环境中的流量情况。针对这一目标,OVS具备很强的灵活性。可以在管理程序中作为软件switch运行,也可以直接部署到硬件设备上作为控制层。同时在Linux上支持内核态(性能高)、用户态(灵活)。此外OVS还支持多种标准的管理接口,如NetlowsFlowRSPAN,ERSPAN, CLI。对于其他的虚拟交换机设备如VMwarevNetwork分布式交换机跟思科Nexus 1000V虚拟交换机等它也提供了较好的支持。
目前OVS的官方版本为1.1.0pre2,主要特性包括
  • 虚拟机间互联的可视性;
  • 支持trunking的标准802.1Q VLAN模块;
  • 细粒度的QoS
  • 每虚拟机端口的流量策略;
  • 负载均衡支持OpenFlow (参考openflow–打造弹性化的可控互联网)
  • 远程配置兼容Linux 桥接模块代码
OVS获取
由于是开源项目,代码获取十分简单,最新代码可以利用git从官方网站下载。此外官方网站还提供了比较清晰的文档资料和应用例程,其部署十分轻松。当前最新代码包主要包括以下模块和特性:
  • ovs-vswitchd 主要模块,实现switchdaemon,包括一个支持流交换的Linux内核模块;
  • ovsdb-server 轻量级数据库服务器,提供ovs-vswitchd获取配置信息;
  • ovs-brcompatd ovs-vswitch替换Linux bridge,包括获取bridge ioctlsLinux内核模块;
  • ovs-dpctl 用来配置switch内核模块;
  • 一些Scripts and specs 辅助OVS安装在Citrix XenServer上,作为默认switch
  • ovs-vsctl 查询和更新ovs-vswitchd的配置;
  • ovs-appctl 发送命令消息,运行相关daemon
  • ovsdbmonitor GUI工具,可以远程获取OVS数据库和OpenFlow的流表。
此外,OVS也提供了支持OpenFlow的特性实现,包括
  • ovs-openflowd 一个简单的OpenFlow交换机;
  • ovs-controller 一个简单的OpenFlow控制器;
  • ovs-ofctl 查询和控制OpenFlow交换机和控制器;
  • ovs-pki OpenFlow交换机创建和管理公钥框架;
  • tcpdump的补丁,解析OpenFlow的消息;
结语
IT领域可以称得上是人类历史上最开放创新,也是最容易垄断的行业。PC行业,wintel帝国曾塑造了不朽的神话,证明谁控制了cpuos,谁就控制了话语权,只要PC的软硬件模式不发生革命性变化,wintel帝国的地位将是无人能撼的。后起之秀ARM借助重视能耗的东风,再加上智能终端技术的大发展才展露头角。而在互联网界,思科更是首先把握住了最核心的交换市场,早早登上至尊之位,即使是步后尘的juniperhuawei也只能是虎口夺食,各凭绝技分天下。现在虚拟交换技术的提出将给这一领域带来新的契机,究竟鹿死谁手,更待后人评说。
参考:
<1> http://openvswitch.org/
<2> http://xen.org/products/cloudxen.html

OpenFlow – 打造弹性化的可控互联网

注:本文原始版本于2010/11/07发表于弯曲评论
2012的故事
2012年的某天,你跟往常一样起床,打开电脑,却发现无法登录到邮箱、无法连接到公司的VPN网络、无法订购任何东西……,你会发现一切都简直跟世界末日一样,离开了网络,现代社会根本无法正常运行。这并不是可笑的无根据的幻想,如果世界末日真的来临,摧毁互联网无疑是最直接有效的办法,而现代互联网并没有我们想象的那样鲁棒。
从上个世纪70年代初,互联网在短短不到40年时间里已经发展成为这个星球上不可或缺的基础设施。然而由于一开始的设计并没有考虑到后来互联网的规模会如此庞大、承载的应用会如此复杂、地位会变得如此重要,现代的互联网在过重的压力下已经凸显出太多亟待解决的问题。互联网太危险,恶意攻击、病毒、木马每年造成上千亿刀的损失;互联网太脆弱,无标度(Scale-free)的特性让整个网络可以在精心设计的少数攻击下即告崩溃;互联网太随意,p2p等应用的出现一度造成各大ISP网络堵塞,严重影响传统正常的访问;互联网太迟钝,现代臃肿的路由机制不能支持快速的更新,即便发现问题也无法快速反应;互联网太局促,IPv4的分配地址已经捉襟见肘……
这一切的问题都隐隐的指向了互联网这个庞然大物最关键的软肋——可控性。缺乏有效的控制措施让互联网这个为服务人类而设计的机器,正在逐渐演变成一头臃肿而暴躁的凶兽,挣扎着要摆脱人类所施加的脆弱枷锁。
下一代互联网和GENI
为了解决当前互联网的问题,不少国家都纷纷提出了下一代互联网计划,代表性计划有美国的FIND(Future Internet Network Design,未来互联网网络设计)和GENI (Global Environment for Network Innovations,全球网络创新环境),欧洲的FIRE (Future Internet Research and Experimentation,未来互联网研究和实验),中国的CNGI-CERNET(China Next Generation Internet)。所有这些计划参与者大都是各个国家产、学、研顶尖的机构。
这三大计划中,CNGI-CERNET主要是研究在IPv6体系下的新一代网络;而NSF支持的FIND计划计划在不受当前互联网的制约下提出未来互联网的需求,从2006年到2014年分三个阶段主要致力于五个问题:是否继续采用分组交换、是否要改变端对端原理、是否要分开路由和包转发、拥塞控制跟资源管理、身份认证和路由问题。FIND计划最主要的成果之一就是GENI——一套网络研究的基础平台,同时FIRE计划跟GENI项目合作也非常密切。GENI计划的两大任务是为最前沿的网络科学工程领域革命性研究开路;刺激和促进重大社会经济影响的奠基性创新的出现;围绕这两大任务,GENI致力于打造下一代互联网的虚拟实验室,为研究者提供验证创新的架构、协议的灵活、可扩展、可配置的实验平台,并促进学术界和业界的相互合作。长期以来,缺乏合适的实验平台让各界的专家学者们伤透了脑筋,PlanetLab的种种局限已经不能满足广大researcher越来越令人fz的需求了。
毫无疑问,GENI的目标将让每个网络研究者为之着迷和激动,一套完全可控、可定制、大规模的网络试验床,对学术界将意味着大批的顶级paper,对业界意味着大量的新标准、新协议。
OpenFlow的前世今生
GENI的好处虽多,但要部署这个平台无疑是一件太过昂贵的事情,于是一个自然的事情就是在目前现有的网络下,能否省时省力的干好这个事情?
很自然的想法,如果我能控制整个Internet就好了,而网络中最关键的节点就是交换设备。控制了交换设备就如同控制了城市交通系统中的红绿灯一样,所有的流量就可以乖乖听话,为我所用。然而现代的交换设备被几家巨头垄断,开放的接口十分有限,能做的事情也十分有限。如果能有一套开放接口、支持控制的交换标准该多好?OpenFlow应运而生。
最初的想法其实十分简单,无论是交换机还是路由器,最核心的信息都存放在所谓的flow table里面,用来实现各种各样的功能,诸如转发、统计、过滤等。flow table结构的设计很大程度上体现了各个厂家的独特风格。OpenFlow就是试图提出这样一个通用的flow table设计,能够满足大家不同的需求,同时这个flow table支持远程的访问和控制,从而达到控制流量的目的。
具体来说,OpenFlow的flow table中每一个entry支持3个部分:规则,操作跟状态。规则无非是用来定义flow,OpenFlow里flow定义十分宽泛,支持10个域(除了传统的7元组之外增加了交换端口、 以太网类型、Vlan ID);操作就是转发、丢弃等行为,状态部分则是主要用来做流量的统计。在此基础上最关键的特性就是支持远端的控制,试想,如果我要改变entry就必须跑到交换机前重新编程写入得多麻烦,而且如果我想获知网络的实时状态咋办,有了统一的控制机制,我们的网络才变得真正智能可控起来。OpenFlow的控制机制也十分灵活,感兴趣的同仁可以参考NOX。
好了,有了这个标准,只要大家以后生产的交换设备都支持,那么学术界以后能做的事情就太多了,以前YY无数次的梦想终于开始变成了现实。比如我们可以在正常运行的网络中自己在定义一些特殊的规则,让符合规则的流量按照我们的需求走任意的路径,就仿佛将一张物理网络切成了若干不同的虚拟网络一样,同时运行而又各不干扰,我们可以轻而易举的测试各种新的协议;以前要做什么处理,需要考虑到具体的拓扑结构,考虑到box的先后顺序,现在好了,通过定义不同的flow entry就可以任意改变流量的运行策略,这也很好的为解决移动性问题提供了便利(一个著名的demo是笔记本在不同交换机之间切换,虚拟机在两地之间切换,运行的游戏不受影响)。从这个意义上说,OpenFlow将传统的物理固定的硬件定义互联网改造成为了动态可变的软件定义互联网(software defined networking)。而一个软件定义的可控的互联网,除了更加灵活以外,毫无疑问,通过恰当的控制算法,将大大提高网络自身的鲁棒性、运行效率以及安全性。
目前学术界OpenFlow主要是stanford、berkeley、MIT等牵头的研究组在推动,而业界据说包括Google在内的几大巨头已经纷纷参与其中,最新的版本1.0协议已经发布。牵头人Nick Mckeown曾在Sigcomm08上做过专题的demo,后续这几年仍有不少的相关工作在高水平的会议上发表。国内据说清华大学已经有研究机构参与进去。
Nick Mckeown这个人十分有意思(主页在http://yuba.stanford.edu/~nickm),现任standford的AP,从他本人提供的简历就可以看出,Nick同学跟业界关系十分紧密,phd毕业两年就创办了公司,还参与了Cisco的项目,后来新公司卖给Cisco(Cisco这种模式很不错,有兴趣的同仁可以搜索过往案例)。笔者有幸在某次国际会议上碰到真人,给人感觉是十分的humorous且energetic的。Nick同学在推OpenFlow的时候明显十分重视跟业界结合,基本上是一边做,一边拉生产商的支持,很重视做demo,很早就在stanford的校园网中部署了OpenFlow,做的差不多了再提标准,再做宣传就事半功倍了。他的这种发展模式也十分为笔者所推崇。
最后的战役
OpenFlow的出现无疑给现有的交换市场带来了新的巨大的商机。网络行业发展到今天,垄断已经十分的严重,许多年来,交换机制造商已经麻木于每天忙碌提高性能的目标,偶尔做点小工作,支持下出现的新的需求。而OpenFlow创造了一块前所未有的大蛋糕,能否抓住这一机遇,不夸张的说是重新瓜分市场的生死之战。目前Cisco、HP、Juniper、NEC等巨头已经纷纷推出了支持OpenFlow的交换设备,不仅有固网的,移动互联网领域也相关产品开始试水。从另外一个角度看,市场的重新瓜分,新需求的出现,也会给小规模的生产商带来一线生机,对于新出现的厂家来说,这也许是能争得一席之地最后的战役。
相关资料
官方网站见http://www.openflowswitch.org,目前有软件版本、netfpga版本可供使用,支持的交换设备相信很快就可以能够买到。