首页 > 代码库 > openflow之pof(原创,转载请注明)

openflow之pof(原创,转载请注明)

最近看pof代码看的头疼,不过庆幸的是搞定了,剩下就是将pof的思想看能否融合到EPC的代码里,咱也为将来的5G提出点意见不是?先来说说pof是啥吧。

pof简介

pof的全称(Protocol Oblivious Forwarding)即协议无感知转发,华为提出的一种在OpenFlow上改进的转发方式,这种方式再不需要知道包用的协议是什么的时候就可以转发出去。它能够提高SDN的可编程性,可以在不更改转发设备代码的基础上支持新的协议。仅仅需要做的就是由控制器配置好相应的流表,下发到转发设备上即可。pof可以帮运营商方便迅速的部署基于新协议的服务。基于OpenFlow的SDN网络虽然是有可编程特性的,但是仅仅限于已有的协议,并不能支持新的协议。

pof的基本原则

看着上面的介绍觉得pof很玄,其实核心思想就一个,那就是{length,offset},它将所有的数据域都以{length,offset}来表示

field {      type;     offset;    length};   

拿mac协议头来作为例子:

有三个区域:

dst{0,0,48}   src{0,48,48} type{0,96,16}其中type来表示字段类型,0表示这是个数据包。那么所以已存在协议和新协议都可以以这种方式来表示。

 

例子

假设有个IPVX协议为下图所示:、

在pof中,数据包的头是层层解析的,并且一个协议的偏移是相对于其协议头来说的,例如,Src_Addr相对于IPVX头来说就有64bit的偏移。

熟悉OpenFlow的人就知道gototable这个命令,下图就表示了IPVX包怎么被这个命令处理的。

 

在流表0中MAC头的“Destination address”和“type”作为匹配域,流表0中有已经被控制器配置好的流表项,用来将包转发到流表1进行进一步的处理。在流表1中Src_Addr作为匹配域。

当包进入到流表0时会匹配其中的一条流表项,流表项中的goto—table命令先会将数据处理指针前移14bit。然后根据指针再偏移64bit提取Src_Addr,最后,提取的Src_Addr将会作为匹配关键字来搜寻流表1中的流表项,从而发现匹配项(这和OpenFlow的流水线处理不一样,添加了lookup功能)

还有其他命令不多解释,上面得命令仅作为理解用。

此外,pof还添加了metadata,group(action的集合),独立出counter等等。不得不说pof给SDN带来了很大的希望和前景啊!

openflow之pof(原创,转载请注明)