SDN网络感知服务与最短路径应用

本文将介绍RYU中的网络感知服务,与基于网络服务的最短路径应用,主要内容包括网络资源感知模块,网络监控模块和基于网络信息的最短路由模块介绍。在一个真实的网络环境下,需掌握网络的实时动态,包括网络的资源以及网络流量状况,其中网络的信息包括交换机,端口,主机的信息,以及基于流的流量统计信息和基于端口的流量统计信息。在掌握这些关键的网络信息后,控制器就可以根据这些信息作出当下最正确的路由决策,完成网络的通信。

网络资源感知 网络资源感知模块用于感知网络资源的实时变化,包括拓扑信息以及主机信息的变化。任何网络应用,可达性都是最基本的要求。SDN网络的集中控制,使得控制器可以根据全局的信息作出最佳决策而无需在交换节点上采用分布式的路由算法。所以感知网络资源是SDN应用最基础的一项服务。网络资源感知模块源码链接:network_aware.

实现该模块的类为Network_Aware类,该类描述如下:

class Network_Aware(app_manager.RyuApp):
  OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
  _NAME = 'network_aware'
  def __init__(self, *args, **kwargs):
      super(Network_Aware, self).__init__(*args, **kwargs)
      self.name = "Network_Aware"
      self.topology_api_app = self
      # links   :(src_dpid,dst_dpid)->(src_port,dst_port)
      self.link_to_port = {}
      # {(sw,port) :[host1_ip,host2_ip,host3_ip,host4_ip]}
      self.access_table = {}
      # ports
      self.switch_port_table = {}  # dpid->port_num
      # dpid->port_num (outer ports)
      self.access_ports = {}
      # dpid->port_num(interior ports)
      self.interior_ports = {}
      self.graph = {}
      self.pre_link_to_port = {}
      self.pre_graph = {}
      self.pre_access_table = {}
      self.discover_thread = hub.spawn(self._discover)

link_to_port字典存储交换机之间链路与端口的映射关系;其中数据结构与其作用关系如下:

  • access_table字典存储主机的接入信息;
  • switch_port_table存储交换机端口列表;
  • access_ports存储外向端口(与终端连接的接口);
  • interior_ports存储内部端口;
  • grap存储网络拓扑图;
  • pre_link_to_port等带有pre前缀的数据结构用于保存上一次获取的信息,用于和当前获取信息做比较。
  • _discover函数是主循环函数

在_discover函数中,周期执行get_topology和是show_topology函数。在get_topology函数中,控制器可以获取到网络中的交换机和端口信息、链路信息、主机接入信息等。此外,控制器通过实时检测网络变化的异步事件来更新网络资源信息。show_topology函数则是将网络信息格式化地展示在终端中。由于前端开发能力有限,目前仅仅简单将后台数据展现在终端。

Note that:可以通过置位IS_UPDATE来控制是否输出信息。此外,若拓扑信息不发生变化,将不打印,即仅打印拓扑一次,直至拓扑更新。可以将判断中的and 修改为or,即可每次都打印。

图1.网络资源信息

网络流量监控 网络的信息除了物理资源信息以外,还包括逻辑链路等信息;获取流表信息可获得对应的逻辑连接信息。此外,获取网络的数据流量的统计情况对防止网络故障,合理优化网络等方面起到了重要的作用。网络流量监控模块实现了对端口流量和流表项流量的监控。应用可周期获取到流量信息,并在终端中输出展示。源码链接:Network_Monitor

实现网络流量监控的类为:Network_Monitor,具体描述如下:

class Network_Monitor(app_manager.RyuApp):
  OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
  _NAME = 'Network_Monitor'
  def __init__(self, *args, **kwargs):
      super(Network_Monitor, self).__init__(*args, **kwargs)
      self.datapaths = {}
      self.port_stats = {}
      self.port_speed = {}
      self.flow_stats = {}
      self.flow_speed = {}
      # {"port":{dpid:{port:body,..},..},"flow":{dpid:body,..}
      self.stats = {}
      self.port_link = {}  # {dpid:{port_no:(config,state,cur),..},..}
      self.monitor_thread = hub.spawn(self._monitor)

其中数据结构的作用如下:

  • datapaths记录与控制器连接的datapath;
  • port_stats保存端口的统计信息;
  • port_speed保存端口的速率信息;
  • flow_stats保存流的统计信息;
  • flow_speed保存流的速率信息;
  • stats保存所有的统计信息;
  • port_link保存link的特性信息;
  • _monitor函数为主循环函数;

在主循环函数中,周期调用了self._request_stats和self.show_stat函数,前者用于下发统计信息请求报文,后者用于展现统计信息。统计信息回复报文处理函数为:_flow_stats_reply_handler和_port_stats_reply_handler,两者分别使用的@set_ev_cls装饰符,注册监听了对应的事件。至此流量统计模块已经完成了闭环,可以作为底层的服务为上层的应用提供实时的流量统计信息。

图2. 端口流量统计信息

图3.-流表项流量统计信息

基于网络资源的最短路径 基于以上的网络资源感知模块与网络流量监控模块提供的数据,我们可以做很多事情,比如负载均衡等流量调度应用,有比如安全接入等安全应用。本小节介绍基于网络资源的最短路径应用。衡量最短路径的参考系是跳数,稍加修改可以变为剩余带宽,延时或者多参考系加权的方案。源代码链接:shortest_route

最短路径应用流程图如下:

图4, 最短路由流程图

首先,查询主机表,若查找成功,则查询主机位置表,之后直接由控制器将ARP数据包发送给对应的端口,此时控制器并不做ARP的代理。当目标主机回复ARP时,将数据包直接发送到源主机的接入端口。从而完成了ARP的学习过程。由于此时已经掌握了主机的接入信息以及网络信息,当ICMP或其他数据包出发packet_in事件时,则可根据源目两个IP查询到接入交换机,再依据拓扑信息,计算最短路径,从而完成最短路由。若希望使用其他的参考标准来计算最短路径,只需修改计算最短路径的算法即可。

在网络初始化时,控制器并没有办法发现沉默的主机,原因在于我们没有进行DHCP分配,导致控制器没有掌握主机的IP/MAC信息。所以第一步我们需要处理的数据包是ARP。处理流程具体如下所示:

图5. ARP处理流程图

Note that:本应用假设主机发起通信时需先发起ARP,不可通过其他途径获取到ARP的信息,否则控制器无法获得目的端主机接入信息,则无法完成路由。对于域外的主机,只需在找不到目的端时,将其送给出口网关即可。此时需使用到子网掩码,网段,路由等概念。本应用仅针对简单局域网计算路径。

图6. 流表项流量统计信息

总结 网络感知服务对于SDN网络而言非常重要,是一切网络应用的基础。充分利用网络资源的信息,可以对网络进行优化,提高网络的安全性。以上的Network_aware和monitor模块均可以直接做为APP的service app(在RYU中需在_CONTEXTS添加)提供数据服务,希望可以给有需要的读者提供一些帮助。

原文发布于微信公众号 - SDNLAB(SDNLAB)

原文发表时间:2015-07-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏分布式系统和大数据处理

C#网络编程(基本概念和操作) - Part.1

C#网络编程系列文章计划简单地讲述网络编程方面的基础知识,由于本人在这方面功力有限,所以只能提供一些初步的入门知识,希望能对刚开始学习的朋友提供一些帮助。如果想...

12830
来自专栏散尽浮华

Linux下绑定网卡的操作记录

公司采购的服务器安装了双网卡,并进行bond网卡绑定设置,网卡绑定mode共有七种(0~6) bond0、bond1、bond2、bond3、bond4、bon...

49080
来自专栏Android群英传

从 Linux 进程调度到 Android 线程管理

35720
来自专栏腾讯云实验室

腾讯云实验室的正确投稿姿势

腾讯云实验室上线了在线投稿能力,现在除了官方推出的实验室之外,允许有能力的开发者把自己的技术和经验通过在实验室投稿的方式来进行分享和传播。

54220
来自专栏吉浦迅科技

DAY14:阅读CUDA C runtime之错误检查和Call stack

23830
来自专栏zingpLiu

【实战小项目】python开发自动化运维工具--批量操作主机

有很多开源自动化运维工具都很好用如ansible/salt stack等,完全不用重复造轮子。只不过,很多运维同学学习Python之后,苦于没小项目训练,本篇演...

29720
来自专栏区块链

CVE 2017-0199漏洞利用的新姿势

*本文作者:kczwa1,本文属 FreeBuf 原创奖励计划,未经许可禁止转载 近日从客户处捕获一枚邮件附件中的可疑word样本,以下是扫描结果,检测率貌似不...

23370
来自专栏H2Cloud

RedRabbit——基于BrokerPattern服务器框架

RedRabbit 经典网游服务器架构 ? 该图省略了专门用途的dbserver、guildserver等用于专门功能的server,该架构的优点有: l Lo...

32060
来自专栏Petrichor的专栏

git:git commit 书写格式

  正如 git add 的作用是将文件放入暂存区, git commit 的作用是将修改提交到分支上。

48520
来自专栏机器之心

代码优化指南:人生苦短,我用Python

选自pythonfiles 机器之心编译 参与:Panda 前段时间,Python Files 博客发布了几篇主题为「Hunting Performance i...

365130

扫码关注云+社区

领取腾讯云代金券