Sunday, August 25, 2013

控制科学的机遇和前路

控制科学在上个世纪七八十年代经历了黄金时期,控制理论在包括化工类生产等方面得到了极大的应用。
然而,此后,理论方面的研究停滞不前,也没有太多的新应用场景,导致控制科学发展进入了相对平稳的阶段。
到了今天,众多新型产业快速发展起来,从中也可以看出一些机遇涌现。

第一个还是机器人方面。
机器人产业的需求也来越大,特别是带有一定简单AI功能的机器,比如无人机,智能运输设备。必将在未来得到极大的发展和应用。这块是其他学科很难介入的地方,正需要新一代的控制科学。

另外就是现在的数据中心管理。信息技术的发展使得各种IT资源都集中起来,以数据中心的模式进行运营。而数据中心中诸多的资源,几乎时时刻刻都需要进行管控,比如服务器、网络,如何进行合理的调度优化,这恰好也是控制科学可以大放异彩的地方。

最后一个就是生物科学。生物科学是特别复杂的系统学科,方方面面都需要进行智能的优化技术。

Friday, August 09, 2013

SDN国内利好

SDN已经炒了有几年了,随着云等产业的成熟,SDN也开始逐渐落地。
这方面china仍然要落后一些。
昨天(2013年8月8日)的新闻联播播出了两条消息,让人感觉国内要开始有些实际动作了。

一个是未来网络小规模试验设施开通,虽然介绍很短,但从几个闪现的画面还是看出来不少信息的。
牵头人应该是刘韵洁院士,落地在江苏南京的未来网络谷(大把的投资,好多空机房)。画面中有中科院的sofia系统,所以估计是类似geni计划的一个试验床,其中利用了sdn和ccn/ndn的一些手段,可以进行一些新协议的验证。另外,之所以叫未来网络而不是下一代网络是因为下一代网络在国内一直被认为是基于IPv6的网络。但v6这些年亚洲炒的热,拥有大块地址域的美帝等国家根本不care。SDN虽然并非是要解决地址的问题,但是新的管控手段上来后可以大量使用映射、封装来缓和一些。从消息上看,研究机构里面中科院占了大头,清华等院校在早期是领先者,但这个机会没能很好抓住。总结来看,跟企业的紧密合作很重要,不然业界难以接受新的概念。可以关注笔者在SDN刚露头的时候(09、10年)撰写的材料(https://github.com/yeasy/tech_writing/tree/master/SDN)。

另外一个是全球首款可编程网络交换机研制成功。这个其实是有夸张了,估计是第一台自主知识产权的。从图片上推测,应该是华为做的(但似乎在之前国内就有一些类似产品出来,可能还有缺陷)。可编程网络交换机是SDN的基础技术,有了交换机的可编程性,才有对网络的灵活配置和动态控制。软件的实现上ovs已经是十分成熟,足以满足产品级的应用,但放到硬件上会有一系列问题,包括表的大小、处理流程等。SDN的场景下对交换机的压力是很大的,需要很多新的考虑。现在全球范围内看能满足产品级应用的,也只有IBM的BNT系列、NEC的(Cisco老喜欢自己加封闭的东西,所以不谈也罢)。这次对华为是个不错的机会,华为走到现在很不容易,要想成功转型,在既有领域站住脚,还能开拓新的用户业务,会面临不少挑战。

ref: 新闻完整内容在:http://news.cntv.cn/2013/08/08/VIDE1375962603760867.shtml

btw,跟主题无关,才知道8月8日已经定为“全民健身日”,但好像不见丝毫举动。比较有诚意的举措是全民放假,体育场馆免费开放。话说现在搞锻炼的成本真是高啊。

Thursday, August 08, 2013

RFC中的奇葩(1) - Discard Protocol

RFC见证了互联网的发展历史。
一群技术人在一起,总会产生很多让人忍俊不禁的故事,包括几个著名的愚人节发布的RFC。
本系列将关注RFC中一些“卓尔不群”的经典提案。

本文提到的RFC其实还真是一个挺有用的RFC,发表于1983年,全文就1页,在http://tools.ietf.org/html/rfc863。主要用处就是定义了Discard Protocol,即丢弃服务。

简单的说,该RFC干的事情就是定义了啥都不干。

该RFC煞有其事地分了TCP和UDP两种情况进行讨论,定义了端口号9。

让人对当年神往不已。

Open Daylight Controller 简易入门

You can find the latest version here: https://github.com/yeasy/tech_writing/tree/master/SDN

Many contents are referenced from
www.openflow.org/wk/index.php?title=OpenDayLight_Tutorial

Friday, August 02, 2013

Open Daylight Controller代码分析 - SAL

 SAL是Open Daylight Controller最关键的一个模块。
主要包括下面的一些包。

1.1.1      org.opendaylight.controller.sal.action

1.1.1.1              Action

抽象类。
定义控制器对流的可能的抽象行动,各个具体的行动(包括AllowOutputFlood等等)都是继承自此类。
主要方法包括获取类型、id、检查值等。

1.1.1.2              Allow

继承自Action类。
类型为ActionType.ALLOW。表示允许行动。

1.1.1.3              Controller

继承自Action类。
类型为ActionType. CONTROLLER。表示发送到控制器行动。

1.1.1.4              Drop

继承自Action类。
类型为ActionType. DROP。表示丢弃行动。

1.1.1.5              Flood

继承自Action类。
类型为ActionType. FLOOD。表示洪泛行动。

1.1.1.6              FloodAll

继承自Action类。
类型为ActionType. FLOOD_ALL。表示除了入口,从所有物理口发出。

1.1.1.7              HwPath

继承自Action类。
类型为ActionType. HW_PATH。表示将网包交给本地的硬件path进行处理。

1.1.1.8              Loopback

继承自Action类。
类型为ActionType. LOOPBACK。表示将网包回送到入口。

1.1.1.9              Output

继承自Action类。
类型为ActionType. OUTPUT。表示将网包从某个物理口发出。
给定参数为物理口,为NodeConnector类型。

1.1.1.10         PopVlan

继承自Action类。
类型为ActionType. POP_VLAN。表示去掉最外层的802.1q头。

1.1.1.11         PushVlan

继承自Action类。
类型为ActionType. PUSH_VLAN。表示在最外层添加一个802.1q的头。
其中,802.1q = [TPID(16) + TCI(16)]TCI = [PCP(3) + CFI(1) + VID(12)]

1.1.1.12         SetDlDst

继承自Action类。
类型为ActionType. SET_DL_DST。表示设置数据层(即mac层)目标地址。

1.1.1.13         SetDlSrc

继承自Action类。
类型为ActionType. SET_DL_SRC。表示设置数据层(即mac层)源地址。

1.1.1.14         SetDlType

继承自Action类。
类型为ActionType. SET_DL_TYPE。表示设置以太类型和长度域。

1.1.1.15         SetNwDst

继承自Action类。
类型为ActionType. SET_NW_DST。表示设置网络层(即IP层)的目标地址。

1.1.1.16         SetNwSrc

继承自Action类。
类型为ActionType. SET_NW_SRC。表示设置网络层(即IP层)的源地址。

1.1.1.17         SetNwTos

继承自Action类。
类型为ActionType. SET_NW_TOS。表示设置网络的TOS域的值。

1.1.1.18         SetTpDst

继承自Action类。
类型为ActionType. SET_TP_DST。表示设置传输层的目标端口。

1.1.1.19         SetTpSrc

继承自Action类。
类型为ActionType. SET_TP_SRC。表示设置传输层的源端口。

1.1.1.20         SetVlanCfi

继承自Action类。
类型为ActionType. SET_VLAN_CFI。表示设置vlanCIF域。

1.1.1.21         SetVlanId

继承自Action类。
类型为ActionType. SET_VLAN_ID。表示设置vlan id域。

1.1.1.22         SetVlanPcp

继承自Action类。
类型为ActionType. SET_VLAN_PCP。表示设置vlanpcp域。

1.1.1.23         SwPath

继承自Action类。
类型为ActionType. SW_PATH。表示将网包发送给本地的软件path进行处理。

1.1.1.24         ActionType

枚举类型,定义控制支持的流行动的类型。每个类型除了一个字符串的id,还包括一个最小值和最大值,代表合法值的范围。

1.1.2      org.opendaylight.controller.sal.authorization

1.1.2.1              IResourceAuthorization

维护鉴权相关的资源数据信息的接口。相关的应用可以从此接口获取鉴权信息。
主要方法包括创建/删除角色、获取应用角色、创建/删除资源组、获取鉴权组等。

1.1.2.2              AppRole

实现了Serializable接口。表示在应用空间中的用户角色信息。
主要属性包括一个角色名称和一个角色层级。

1.1.2.3              AppRoleLevel

实现了Serializable接口。表示在应用空间中的用户角色层级。

1.1.2.4              Resource

实现了Serializable接口。表示基础资源和相关的访问权限。
主要方法包括获取资源和获取权限。

1.1.2.5              ResourceGroup

实现了Serializable接口。表示一组资源和相关的访问权限。
主要方法包括获取资源组名称和获取权限。

1.1.2.6              AuthResultEnum

枚举类型,实现了Serializable接口。
表示鉴权的可能结果,包括NONEREJECTTIMEOUT等等。

1.1.2.7              Privilege

枚举类型,定义了组和资源的访问权限。
包括NONEREADUSEWRITE

1.1.2.8              UserLevel

枚举类型,定义在控制器空间中的用户角色层级。包括SYSTEMADMINNETWORKADMINAPPUSER

1.1.3      org.opendaylight.controller.sal.core

1.1.3.1              IContainer

用于获取给定Container的状态,声明的主要方法包括获取container flow、获取tag、获取NodeConnector等。

1.1.3.2              IContainerAware

用于创建和删除Container
定义了下面两个方法,定义新建和删除容器时候执行的操作。
public void containerCreate(String containerName);
public void containerDestroy(String containerName);

1.1.3.3              IContainerListener

获取给定Container的状态信息。
主要方法包括更新tag、更新flow、更新NodeConnector等。

1.1.3.4              Action

继承自Property类,定义了Action类,属性主要包括一个actionValue和一个枚举类型的ActionType
public enum ActionType {
        OUTPUT_PORT_ACTION(1<<0),
        VLAN_VID_ACTION(1<<1),
        VLAN_PCP_ACTION(1<<2),
        VLAN_STRIP_ACTION(1<<3),
        DLSRC_ACTION(1<<4),
        DLDST_ACTION(1<<5),
        NWSRC_ACTION(1<<6),
        NWDST_ACTION(1<<7),
        NWTOS_ACTION(1<<8),
        TPTSRC_ACTION(1<<9),
        TPTDST_ACTION(1<<10),
        ENQUEUE_ACTION(1<<11),
        VENDOR_ACTION(0xffff);
        private final int at;
        ActionType(int val) {
               this.at = val;
        }
        public int getValue() {
               return at;
        }
}

1.1.3.5              AdvertisedBandwidth

继承自Bandwidth类,,定义了AdvertisedBandwidth类。

1.1.3.6              Bandwidth

继承自Property类,定义了Bandwidth类,定义一些常见的带宽值。

1.1.3.7              Buffers

继承自Property类,定义了Buffers类,表示包的buffer,主要包括bufferValue属性。

1.1.3.8              Capabilities

继承自Property类,定义了Capabilities类,主要包括capabilitiesValue属性和CapabilitiesType枚举属性。
public enum CapabilitiesType {
        FLOW_STATS_CAPABILITY(1<<0),
        TABLE_STATS_CAPABILITY(1<<1),
        PORT_STATS_CAPABILITY(1<<2),
        STP_CAPABILITY(1<<3),
        RSVD_CAPABILITY(1<<4),
        IP_REASSEM_CAPABILITY(1<<5),
        QUEUE_STATS_CAPABILITY(1<<6),
        ARP_MATCH_IP_CAPABILITY(1<<7);
        private final int ct;
        CapabilitiesType(int val) {
               this.ct = val;
        }
        public int getValue() {
               return ct;
        }
    }

1.1.3.9              ComponentActivatorAbstractBase

抽象类。
实现了BundleActivatorosgi框架中定义), IContainerAware两个接口。主要用于扩展osgi框架中定义的BundleActivator类,完成跟osgi框架打交道的一些功能,主要包括initdestroystartstopconfigureInstance方法等。
init方法是抽象方法,在容器中激活bundle时调用。
destroy方法,在容器中停止激活bundle时调用。
start方法在bundle被启动时候调用,实现两个功能:通过调用框架中BundleContext类的registerService方法,注册自身到osgi框架,告诉框架自身属于IContainerAware服务的提供者之一,从而保证在启动容器的时候被调用;创建一个数据结构(dbGlobalInstances)来跟踪所有在每个容器中创建的实例。最后,调用init()方法。
stop方法在bundle被停止的时候调用,将所有的实例停止并执行相应的清除工作,同时osgi框架会自动将bundle解除注册。
configureInstance方法仅声明而并没有实现,需要继承类自己实现。主要是对容器中的实例进行配置依赖。
getGlobalImplementations方法仅声明而并没有实现。获取bundle支持的所有的实现。
getImplementations方法仅声明而并没有实现。统计容器中的实现的个数。

1.1.3.10         Config

继承自Property类,定义了Config类,主要属性包括configValue和几个管理状态。

1.1.3.11         ConstructionException

继承自Exception类,定义了ConstructionException类,表示创建时异常。

1.1.3.12         ContainerFlow

定义了ContainerFlow类,实现了java.lang.Cloneablejava.io. Serializable接口,表示容器流。

1.1.3.13         ContainerServiceDependency

定义了ContainerServiceDependency类,实现了org.apache.felix.dm.ServiceDependencyorg.apache.felix.dm.DependencyActivation接口,表示一个容器依赖的服务。
用户可以设置服务,获取属性等。

1.1.3.14         Description

继承自Property类,定义了Description类,表示一个元素的名称属性。

1.1.3.15         Edge

实现了Serializable接口,表示连接两个NodeConector的边。注意是有方向的,包括一个头NodeConector和一个尾NodeConector
Edge的方向是由尾部指向头部。

1.1.3.16         Host

实现了Serializable接口。
表示一台终端主机。属性包括数据层和网络层的地址。

1.1.3.17         Latency

继承自Property,定义一些常见的latency值。

1.1.3.18         MacAddress

继承自Property,包括一个控制器的mac地址和节点的mac地址。

1.1.3.19         Name

继承自Property,定义元素的名称属性。

1.1.3.20         Node

实现了Serializable接口。
定义一个普通的网络元素,属性包括类型和id

1.1.3.21         NodeConnector

实现了Serializable接口。
定义一个通用的网络元素的挂载点,一般绑定到一个Node上。属性包括类型、id和节点。

1.1.3.22         Path

实现了Serializable接口。
一条路径由一系列的边(Edge)组成,从头结点依次指向尾节点。

1.1.3.23         PeerBandwidth

继承自Bandwidth类。
表示peer元素的带宽。

1.1.3.24         Property

抽象基础类,实现了java.io.Serializable接口,是sal中元素属性的基础。
提供了获取名称、比较、生成hash代码等基本操作。

1.1.3.25         State

继承自Property类。
定义一个Edge的状态,比如DOWNUP等。

1.1.3.26         SupportedBandwidth

继承自Bandwidth类。
表示某条link所支持的带宽信息。

1.1.3.27         Tables

继承自Property类。
主要维护支持的datapath表的个数。

1.1.3.28         Tier

继承自Property类。
表示一个node的层级属性。

1.1.3.29         TimeStamp

继承自Property类。
按照java.util.Date规则定义的时间戳信息。

1.1.3.30         UpdateType

定义发生更新的具体类型,包括ADDEDREMOVEDCHANGED

1.1.4      org.opendaylight.controller.sal.discovery

1.1.4.1              IDiscoveryService

主要定义了如下方法,当一条边发生变化时候产生通知。
public void notifyEdge(Edge edge, UpdateType type, Set<Property> props);

1.1.5      org.opendaylight.controller.sal.flowprogrammer

1.1.5.1              IFlowProgrammerService

流编程器的接口,声明了在一个网络节点上添加、删除、修改流的方法。

1.1.5.2              IPluginInFlowProgrammerService

流编程器的接口,需要协议插件具体实现。
方法包括添加、删除、修改流等。

1.1.5.3              Flow

实现了CloneableSerializable接口。
表示一条流。属性包括match、行动和附加属性(优先级、超时)等。

1.1.6      org.opendaylight.controller.sal.inventory

1.1.6.1              IInventoryService

声明了可以被应用发起面向SAL的方法。
包括:
getNodeProps获取所有存在的节点和相关的属性。
getNodeConnectorProps获取所有存在的NodeConnector和相关的属性。

1.1.6.2              IListenInventoryUpdates

声明了通知上层应用的方法。
包括:
updateNode当节点相关的属性发生更新。
updateNodeConnectorNodeConnector相关的属性发生更新。

1.1.6.3              IPluginInInventoryService

SAL调用,面向协议相关的插件。
包括:
getNodeProps获取所有存在的节点和相关的属性。
getNodeConnectorProps获取所有存在的NodeConnector和相关的属性。

1.1.6.4              IPluginOutInventoryService

描述了Iventory更新的方法,需要协议插件来进行实现。
包括:
updateNode当节点相关的属性发生更新。
updateNodeConnectorNodeConnector相关的属性发生更新。

1.1.7      org.opendaylight.controller.sal.match

1.1.7.1              Match

实现了CloneableSerializable接口。
描述了通用匹配网包和消息的规范。定义了一系列可以匹配的域。

1.1.7.2              MatchField

实现了CloneableSerializable接口。
代表一个通用的匹配域。主要属性包括类型、值和掩码。

1.1.7.3              MatchType

定义了一系列的匹配类型,包括id、值、掩码类型和范围值等。
包括IN_PORTDL_SRCDL_DSTTP_DST等多个成员。

1.1.8      org.opendaylight.controller.sal.packet

1.1.8.1              IDataPacketService

SAL提供给北端组件的数据包服务,需要SAL自己实现,该服务在osgi中注册。
定义了三个方法:
l         transmitDataPacket将原始包通过某个OutgoingNodeConnector发出;
l         decodeDataPacket从接收到的原始包中解析一个数据包出来;
l         encodeDataPacket将数据包编码为原始包。

1.1.8.2              IListenDataPacket

所有希望处理数据包的北端模块(比如ArpHandler)均要实现该接口。不同模块的处理可以是串行或者并行。
该接口定义了方法为
receiveDataPacket,对原始包的处理,返回SAL的是处理结果。

1.1.8.3              IPluginInDataPacketService

南端插件提供给SAL使用的数据包服务。该服务保证SAL仅使用一个协议插件。不同协议插件在注册时需要用不同的protocoloPluginType来进行区分。
定义方法为
transmitDataPacket将原始包发送到网络上。

1.1.8.4              IPluginOutDataPacketService

SAL用于拦截所有从南端协议插件传输上来的原始包。SAL可以通知南端插件数据包是否被处理或需要进一步处理。一般经过SAL处理后过程结束。南端插件通过一个IncomingNodeConnector发送网包。
定义方法为
receiveDataPacket接收原始包并进行处理。

1.1.8.5              ARP

继承自Packet类,表示一个ARP包。

1.1.8.6              BitBufferHelper

提供一些对bits流进行操作的方法,包括获取某些特定位、转化特定位的值为某类型、存储等。

1.1.8.7              Ethernet

继承自Packet类,表示一个以太网包。

1.1.8.8              ICMP

继承自Packet类,表示一个ICMP包。

1.1.8.9              IPv4

继承自Packet类,表示一个IPv4包。

1.1.8.10         LLDP

继承自Packet类,表示一个LLDP包。

1.1.8.11         LLDPTLV

继承自Packet类,表示一个LLDPTLV包。

1.1.8.12         Packet

抽象类。
表示一个通用的网包格式。提供了对网包进行操作的常见方法,包括获取/设置载荷、处理头部域等。

1.1.8.13         PacketResult

网包处理的模块处理的可能结果。
包括:
CONSUME表示网包已经被处理过,后续模块不需要再处理。
KEEP_PROCESSING表示网包已经被处理过,后续模块仍可以进行处理。
IGNORED表示网包被忽略了,后续模块应该进行处理。

1.1.8.14         RawPacket

表示一个原始包,从网络接收或即将发出的包的格式。

1.1.8.15         TCP

继承自Packet类,表示一个TCP包。

1.1.8.16         UDP

继承自Packet类,表示一个UDP包。

1.1.8.17         LinkEncap

枚举类型,网包的数据链路格式,比如ETHERNET

1.1.9      org.opendaylight.controller.sal.packet.address

1.1.9.1              DataLinkAddress

抽象类。
实现了Serializable接口。用于表示一个数据链路层的地址。主要属性包括一个字符串的name

1.1.9.2              EthernetAddress

继承自DataLinkAddress类,表示一个以太网地址。主要属性包括一个字节数组的macAddress

1.1.10              org.opendaylight.controller.sal.reader

1.1.10.1         IPluginInReadService

硬件的查看接口,需要协议插件具体实现。
声明方法包括读取流、描述、NodeConnector等信息。

1.1.10.2         IReadService

获取网络节点的流、端口、队列等硬件信息的接口。

1.1.10.3         FlowOnNode

表示一个安装在网络节点上的流,主要属性包括table位置、匹配次数、统计信息等。

1.1.10.4         NodeConnectorStatistics

一个NodeConnector上的统计信息,包括网包、字节、错误等统计。

1.1.10.5         NodeDescription

网络节点的描述信息,包括制造商、硬件、软件、序列号等。

1.1.11              org.opendaylight.controller.sal.routing

1.1.11.1         IListenRoutingUpdates

如果一个模块希望知道路由引擎发布的事件,则需要实现该接口。
主要声明了recalculateDone方法,当所有的最短路径树的计算完成时候回被调用。

1.1.11.2         IRouting

声明了一些路由相关的方法。
包括获取两个节点之间的路由、获取最大吞吐的路径等。

1.1.12              org.opendaylight.controller.sal.statistics

1.1.12.1         IListenStatisticsUpdate

SAL提供,面向应用的统计信息通知接口。

1.1.12.2         IPluginOutStatisticsService

协议插件提供,面向SAL的统计信息的更新方法。

1.1.13              org.opendaylight.controller.sal.topology

1.1.13.1         IListenTopoUpdates

SAL提供,面向应用,拓扑相关的通知。

1.1.13.2         IPluginInTopologyService

SAL调用,面向协议插件请求拓扑更新的服务。

1.1.13.3         IPluginOutTopologyService

协议插件调用,面向SAL的服务。

1.1.13.4         ITopologyService

SAL为上层应用提供的拓扑相关的服务

1.1.14              org.opendaylight.controller.sal.utils

1.1.14.1         ConfigurationObject

1.1.14.2         IObjectReader

定义了从流中读取并重建对象的方法。

1.1.14.3         HexEncode

对十六进制的编码串进行操作。包括字节和hexString之间的转换等。

1.1.14.4         NetUtils

抽象类。
声明了操作网络数据结构常见的一些方法,包括获取Inet地址、获取子网掩码长度等。

1.1.14.5         NodeConnectorCreator

抽象类。
声明了创建一个NodeConnector相关的方法。

1.1.14.6         NodeCreator

抽象类。
声明了创建一个Node相关的方法。

1.1.14.7         ObjectReader

从文件系统中读取对象。

1.1.14.8         ObjectWriter

写一个对象到文件系统中。

1.1.14.9         ReadFromFile

从文件中读取内容。

1.1.14.10   ServiceHelper

辅助在OSGi框架中进行注册和取消注册。

1.1.14.11   Status

表示OSGi的服务接口函数调用的返回状态。主要属性包括一个状态码和一个描述字符串。

1.1.14.12   TierHelper

辅助管理Tier相关的信息。

1.1.14.13   WriteToFile

写到文件。

1.1.14.14   Direction

实现了Serializable接口的枚举,定义方向,包括forwardreverse

1.1.14.15   EtherTypes

常见的802.3以太网类型、802.2+SNAP协议id

1.1.14.16   GlobalConstants

全局的一些常量,包括:
DEFAULT("default"),
    CONTAINERMANAGER("containermanager"),
    CONTAINERNAME("name"),
    STATICVLAN("staticvlan"),
    CLUSTERINGSERVICES("clusteringservices"),
STARTUPHOME("configuration/startup/");

1.1.14.17   GUIField

GUI一些域的常量,包括用户、密码域等。

1.1.14.18   IPProtocols

常见的IP协议号。

1.1.14.19   StatusCode

状态码。通常用于表示成功或者错误状态。