标题：OpenFlow
起源
随着互联网的发展，今天的互联网业务对互联网提出了越来越高的传输质量要求，如何修改互联网以满足新业务的需求，出现了改良派和改革派两种不同的做法。改良派认为可以在原有的基础设施上添加新的协议来解决问题，改革派则认为必须推到一切重来。改革派向自己提出这样的两个问题：“就自己目前掌握的知识，如果我从一个全新的开始设计互联网，我会怎么做”和“15年后的互联网应该是什么样子”。为此，改革派们开始了一系列新的设计方案，OpenFlow就是改革派提出的一种新型网络交换模型，与此相应的，他们还成立了0penFlow交换机论坛(The OpenFlow Switch Consorlium，后文简称0penFlow论坛)。
与那些动辄成立多年的论坛相比，0penFlow论坛只是于2008年刚刚成立的新兴组织。0penFlow论坛起源于斯坦福大学的“Clean slate”计划(斯坦福大学的“Clean slate ”计划是一个致力于研究重新设计互联网的项目，这个计划目前支持了大约10个不同方向致力于重新设计互联网的项目)，最早的成员只有斯坦福大学的高性能网络研究组(The High Perfomance Networking Group)。随着论坛的发展，目前0penFlow论坛已经变成一个由大学的研究者和网络管理者共同组成的开放论坛，吸引了来自麻省理工学院、加州理工学院等著名高校的教授以及Deutsche Telekom这样的大型电信公司的网络一线工程师加盟。论坛欢迎任何希望对网络进行革新的人加入，但有一个前提是加入者不能为任何网络设备制造商工作。作为未来互联网的设计者之一，0penFlow论坛希望防止制造商的利益冲突被引入论坛。
0penFlow论坛主要解决的是重新设计互联网的实验环境问题。在纯的实验网上总难以有足够多的实际用户或者足够大的网络拓扑来测试新协议的性能和功能，最好的方法是将运行新协议的实验网络嵌入实际运营的网络，利用实际的网络环境来检验新协议的可行性和存在的问题。
传统的解决方案有两种，要求设备制造商完全开放平台接口或实验者自行制造设备。设备制造商完全开放平台接口让研究者可以使用商用网络设备进行二次开发，寻找实验协议与传统协议并存的方法。但是，直接开放网络设备的开发接口对设备提供商而言是一场噩梦，一方面与商用平台的封闭性相冲突，开放开发的二次接口无疑会有暴露自身技术细节的风险，为竞争对手提供了机会，或者为新兴厂家提供了进入行业的门槛。
OpenFlow的特点
开发者自行制造设备的方法一般是使用PC服务器或专用硬件搭建自己的交换路由设备，受限于主机能装备的网卡数量， 这种方法不能获得足够大密度的端口(一般交换机很容易达到48或者更多的端口，而主机即使插上多块网卡也很难有这么多的端口)，而且研究设备的交换性能一般也远不如同价格的商用设备。在这种情况下，0penFlow论坛提出新的交换设备解决方案必须具有以下四点性质：
第一，设备必须具有商用设备的高性能和低价格的特点；
第二，设备必须能支持各种不同的研究范围；
第三，设备必须能隔绝实验流量和运行流量；
第四，设备必须满足设备制造商封闭平台的要求。
发展
由于OpenFlow对网络的创新发展起到了巨大的推动作用，因此受到了广泛的关注和支持。由美国科学基金会（NSF）支持的Global Environment for Network Investigations （GENI）计划对OpenFlow进行了资金支持并已开始实施“GENI Enterprise”计划
从07年提出到现在，OpenFlow已经在硬件和软件支持方面取得了长足的发展。从OpenFlow推出开始，日本NEC就对OpenFlow的相关硬件进行了跟进性的研发，NEC的IP8800/S3640-24T2XW和IP8800/S3640-48T2XW两款交换机是支持OpenFlow的最成熟的交换机之一。CISCO，Junifer，Toroki，pronto也相继推出了支持OpenFlow的交换机、路由器、无线网络接入点（AP）等网络设备。此外，具有OpenFlow功能的AP也已在斯坦福大学进行了部署，标志着OpenFlow已不再局限于固网。2009年12月，OpenFlow规范发布了具有里程碑意义的可用于商业化产品的1.0版本，而且支持规范1.0的软件indigo也已发布了Beta版本。OpenFlow相应的支持软件，如OpenFlow在Wireshark抓包分析工具上的支持插件、OpenFlow的调试工具（liboftrace ）、“OpenFlow虚拟计算机仿真”（OpenFlowVMS）等也已日趋成熟。 
OpenFlow分别于2008年和2009年连续两年获得了SIGCOMM的最佳演示奖，并且享有声望的MIT Technology Review杂志把OpenFlow选为十大未来技术，认为其具有实力改变未来的日常生活。此外，乔治亚工学院、哥伦比亚大学、多伦多大学以及汉城国立大学分别以讲座和工程实践的方式开设了OpenFlow。 目前，OpenFlow已经在美国斯坦福大学、Internet2、日本的JGN2plus以及其他的10-15个科研机构中部署，并将在国家科研骨干网以及其他科研和生产中应用。OpenFlow的国际覆盖已经包括日本、葡萄牙、意大利、西班牙、波兰和瑞典等。
影响
OpenFlow对网络创新的影响
由于现在的网络暴露出了越来越多的弊病以及人们对网络性能需求的提高，于是研究人员不得不把很多复杂功能加入到路由器的体系结构当中，例如OSPF，BGP，组播，区分服务，流量工程，NAT，防火墙，MPLS等等。这就使得路由器等交换设备越来越臃肿而且性能提升的空间越来越小。
然而与网络领域的困境截然不同的是，计算机领域实现了日新月异的发展。仔细回顾计算机领域的发展，不难发现其关键在于计算机领域找到了一个简单可用的硬件底层(x86指令集)。由于有了这样一个公用的硬件底层，所以在软件方面，不论是应用程序还是操作系统都取得了飞速的发展。现在很多主张重新设计计算机网络体系结构的人士认为：网络可以复制计算机领域的成功来解决现在网络所遇到的所有问题。在这种思想的指导下，将来的网络必将是这样的：底层的数据通路（交换机、路由器）是“哑的、简单的、最小的”，并定义一个对外开放的关于流表的公用的API，同时采用控制器来控制整个网络。未来的研究人员就可以在控制器上自由的调用底层的API来编程，从而实现网络的创新。
OpenFlow正是这种网络创新思想的强有力的推动者。OpenFlow交换机将原来完全由交换机/路由器控制的报文转发过程转化为由OpenFlow交换机（OpenFlow Switch）和控制服务器（Controller）来共同完成，从而实现了数据转发和路由控制的分离。控制器可以通过事先规定好的接口操作来控制OpenFlow交换机中的流表，从而达到控制数据转发的目的。 
因此，OpenFlow开启了一条网络创新的道路。如果OpenFlow得到广泛的应用和推广，则未来的网络将如曾经的计算机一样取得日新月异的发展。
流表由很多个流表项组成，每个流表项就是一个转发规则。进入交换机的数据包通过查询流表来获得转发的目的端口。流表项由头域、计数器和操作组成；其中头域是个十元组，是流表项的标识；计数器用来计数流表项的统计数据；操作标明了与该流表项匹配的数据包应该执行的操作。
相关应用
OpenFlow的应用是很广泛的，这里我们只是列举五个比较典型的应用。
OpenFlow在校园网络中的应用。如果我们可以让校园网具有OpenFlow特征，则可以为学生和科研人员实现新协议和新算法提供一个试验平台。OpenFlow网络试验平台不仅更接近真实网络的复杂度，实验效果更好，而且可以节约实验费用。现在已经有包括斯坦福大学在内的几所高校部署了OpenFlow交换机，取得了很好的实验效果。
OpenFlow在广域网和移动网络中的应用。在广域网和移动网络中添加具有OpenFlow特征的节点，将带来众多的好处。例如，可以使得固网和移动网络实现无缝控制、使得VPN的管理更加灵活等。NEC 已经利用OpenFlow控制技术对快速、宽带的移动网络进行高效、灵活的网络管理，并解决了两个课题。首先，在多个移动通信方式实现动态切换。在移动通信混杂时以及通信环境恶化时，动态切换通信方式，将满足通信服务所需的服务品质，提供给终端用户。其次，移动回环网络的节能。在一天当中通信量相对较少的夜晚时段，可以汇集网络路径，关闭多余的中转基站的电源，从而节省能源。
OpenFlow在数据中心网络中的应用。在数据中心网络中使用OpenFlow交换机，可以使得网络和计算资源更加紧密的联系起来并实现有效的控制。数据中心的数据流量很大，如果不能合理分配传输路径很容易造成数据拥塞，从而影响数据中心的高效运行。若在数据中心网络中添加OpenFlow交换机，则可以实现路径优化以及负载均衡，从而使得数据交换更加迅速。
OpenFlow在网络管理和安全控制中的应用。如果网络是基于OpenFlow技术实现的，则经过OpenFlow交换机的每个新的数据流都必须由控制器来做出转发决定。在控制器中可以对这些流按照预先制定的规则进行检查，然后由控制器指定数据流的传输路径以及流的处理策略，从而更好的控制网络。更为重要的是，在内部网络和外网的连接处应用OpenFlow交换机可以通过更改数据流的路径以及拒绝某些数据流来增强企业内网的安全性。
基于OpenFlow实现SDN（Software Defined Network）。在SDN中，交换设备的数据转发层和控制层是分离的，因此网络协议和交换策略的升级只需要改动控制层。OpenFlow在OpenFlow交换机上实现数据转发，而在控制器上实现数据的转发控制，从而实现了数据转发层和控制层的分离。基于OpenFlow实现SDN，则在网络中实现了软硬件的分离以及底层硬件的虚拟化，从而为网络的发展提供了一个良好的发展平台。
网络组成
[1-3]OpenFlow网络由OpenFlow交换机、FlowVisor和Controller三部分组成。OpenFlow交换机进行数据层的转发；FlowVisor对网络进行虚拟化；Controller对网络进行集中控制，实现控制层的功能。OpenFlow网络的结构示意图如下： 
  OpenFlow交换机 
OpenFlow交换机是整个OpenFlow网络的核心部件，主要管理数据层的转发。OpenFlow交换机接收到数据包后，首先在本地的流表上查找转发目标端口，如果没有匹配，则把数据包转发给Controller，由控制层决定转发端口。
OpenFlow交换机的组成 
OpenFlow交换机由流表、安全通道和OpenFlow协议三部分组成。 
  安全通道是连接OpenFlow交换机到控制器的接口。控制器通过这个接口控制和管理交换机，同时控制器接收来自交换机的事件并向交换机发送数据包。交换机和控制器通过安全通道进行通信，而且所有的信息必须按照OpenFlow协议规定的格式来执行。 
OpenFlow协议用来描述控制器和交换机之间交互所用信息的标准，以及控制器和交换机的接口标准。协议的核心部分是用于OpenFlow协议信息结构的集合。 
OpenFlow协议支持三种信息类型：Controller-to-Switch，Asynchronous和Symmetric，每一个类型都有多个子类型。Controller-to-Switch信息由控制器发起并且直接用于检测交换机的状态。Asynchronous信息由交换机发起并通常用于更新控制器的网络事件和改变交换机的状态。Symmetric信息可以在没有请求的情况下由控制器或交换机发起。 
OpenFlow交换机的分类 
按照对OpenFlow的支持程度，OpenFlow交换机可以分为两类：专用的OpenFlow交换机和支持OpenFlow的交换机。 
专用的OpenFlow交换机是专门为支持OpenFlow而设计的。它不支持现有的商用交换机上的正常处理流程，所有经过该交换机的数据都按照OpenFlow的模式进行转发。专用的OpenFlow交换机中不再具有控制逻辑，因此专用的OpenFlow交换机是用来在端口间转发数据包的一个简单的路径部件。 
支持OpenFlow的交换机是在商业交换机的基础上添加流表、安全通道和OpenFlow协议来获得了OpenFlow特性的交换机。其既具有常用的商业交换机的转发模块，又具有OpenFlow的转发逻辑，因此支持OpenFlow的交换机可以采用两种不同的方式处理接收到的数据包。 
按照OpenFlow交换机的发展程度来分，OpenFlow交换机也可以分为两类：“Type0”交换机和“Type1”交换机。 
“Type0”交换机仅仅支持十元组以及以下四个操作：转发这个流的数据包给一个给定的端口（或者几个端口）；压缩并转发这个流的数据包给控制器；丢弃这个流的数据包；通过交换机的正常处理流程来转发这个流的数据包。 
显然“Type0”交换机的这些功能是不能满足复杂试验要求的，因此我们将要定义“Type1”交换机来支持更多的功能，从而支持复杂的网络试验。“Type1”交换机将具有一个新的功能集合。 
支持网络虚拟化的FlowVisor 
类比计算机的虚拟化，FlowVisor就是位于硬件结构元件和软件之间的网络虚拟层。FlowVisor允许多个控制同时控制一台OpenFlow交换机，但是每个控制器仅仅可以控制经过这个OpenFlow交换机的某一个虚拟网络（即slice）。因此通过FlowVisor建立的试验平台可以在不影响商业流的转发速度的情况下，允许多个网络试验在不同的虚拟网络上同时进行。FlowVisor与一般的商用交换机是兼容的，而不需要使用FPGA和网络处理器等可编程硬件。
Controller 
OpenFlow实现了数据层和控制层的分离，其中OpenFlow交换机进行数据层的转发，而Controller实现了控制层的功能。Controller通过OpenFlow协议这个标准接口对OpenFlow交换机中的流表进行控制，从而实现对整个网络进行集中控制。Controller的这一切功能都要通过运行NOX来实现，因此NOX就像是OpenFlow网络的操作系统。此外，在NOX上还可以运行Plug-n-serve、OpenRoads以及OpenPipes等应用程序。
Plug-n-Serve 通过规定数据传输路径来控制网络以及服务器上的负载，从而使得负载均衡并降低响应时间。OpenRoads 是支持OpenFlow无线网络移动性研究的框架。OpenPipes 可以在网络系统中通过移动每个子模块来测试每个子模块，并可以决定如何划分设计单元。