关于ONOS中HOP-BY-HOP转发机制的学习研究

前言

笔者在之前学习ONOS的过程当中,对SDN的流表进行了学习。但是对于流表的下发机制没有学习透彻,最近在ONOS的fwd模块时,才突然发现到SDN网络的精妙。

在阅读本文的时候,默认读者对SDN网络的背景知识以及ONOS控制器的架构有一定程度的熟悉。

包预处理

ONOS的fwd模块在收到Packet_In之后,会根据判断来选择处理还是丢弃。如果是选择处理该包,则会调用包处理的程序模块将包的内容进行传递,直到传递至Ethernet格式后获取到该包对应的源host id以及目标host id。拥有了两个节点的id之后,ONOS就可以调用主机服务定位到两个主机在网络当中的具体位置了,其大概的流程如下图所示。
图1-1

流表处理

在定位到两个节点的位置之后,可以调用ONOS的拓扑服务模块轻松找到当前网络当中的可行通信路径。在使用Set保存好路径之后,就需要在特定的端口下发流表。那么,每一个特定端口的流表是怎么来的呢?这就需要分析fwd的核心方法installRule.该方法在接受到Packet_In报文之后,会创建一个流处理器,然后对当前网络的数据流进行过滤。大致的流程是先定位到两台主机,到两台主机的MAC,到ip,再到qos相关字段,再到tcp/udp…经过多次的流量筛选,最终要处理的数据流就会是我们想要的。其流程图如下图示:
流程图2

流表下发

在对流表进行好处理之后,流表又是怎样下发到每一个特定端口的呢?关于这一个问题笔者之前也没有想明白,后面看官方wiki对这个模块的介绍后才恍然大悟。这是hop-by-hop的转发机制,也就是说路径是一跳一跳的铺设过去的。
在installRule方法当中,新建一个流表builder,然后调用ONOS的API,获取全路径中第一台转发设备的链路端口。如下图,h1要跟h2进行通信,转发路径如图黑线所示,首先就是定位到s1的e0端口,然后在e0端口下发流表。下发流表的时候,除了指定下发端口用以包的转发之外,还可以设置流表的优先级,持续时间等属性.
在这里插入图片描述

在第二次铺路的过程当中,S1已经把包转发给了S2,但是S2不知道如何处理,于是就会发送Packet_In报文给控制器,控制器又会重复刚才的过程,在S2的e2口下发流表。铺路的思想有种迭代的意味。在路径所有的转发端口都设置好流表之后,就能进行通信了。由于该流表是直接定义了转发的端口是哪一个,并且fwd的流表处理方法也定义好了ipv6的处理方法,因此ipv4跟ipv6地址的主机理论上是能够互相Ping通的。下面放一张笔者测试ipv4跟ipv6连通性的测试图:在这里插入图片描述

发布了4 篇原创文章 · 获赞 0 · 访问量 159
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览