楔子:openflow1.3的状态转移图

0.SDN交换机的TCP主动连接 8s一个包,

同样的,tcp连接成功后,马上发送hello包

之后8s一个Hello包

如果没收到hello的回复包,是不会进入下一状态的,会一直重传hello包

1.ryu控制器是如何发现SDN交换机的?

    def serve(self):send_thr = hub.spawn(self._send_loop)# send hello message immediatelyhello = self.ofproto_parser.OFPHello(self)self.send_msg(hello) // 这一行是最重要的~~echo_thr = hub.spawn(self._echo_request_loop)try:self._recv_loop() // 处理TCP连接发送过来的报文finally:hub.kill(send_thr)hub.kill(echo_thr)hub.joinall([send_thr, echo_thr])self.is_active = False

可以试试把self.ofproto_parser.OFPHello(self) 这一行注释掉,

然后你会发现找不到SDN交换机了(笑)因为没有hello的回复包,无法进入下一状态,

发送了hello包之后,才会进入recv_loop协程,这个时候调用

    @set_ev_handler(ofp_event.EventOFPHello, HANDSHAKE_DISPATCHER)def hello_handler(self, ev):............features_request = datapath.ofproto_parser.OFPFeaturesRequest(datapath)datapath.send_msg(features_request)

2.RYU控制器如何处理SDN交换机发送过来的TCP报文?

上面的recv_loop 就是,注意看源码

    @_deactivatedef _recv_loop(self):buf = bytearray()count = 0min_read_len = remaining_read_len = ofproto_common.OFP_HEADER_SIZEwhile self.state != DEAD_DISPATCHER:try:read_len = min_read_lenif remaining_read_len > min_read_len:read_len = remaining_read_lenret = self.socket.recv(read_len) # 先读报文头except SocketTimeout:continueexcept ssl.SSLError:# eventlet throws SSLError (which is a subclass of IOError)# on SSL socket read timeout; re-try the loop in this case.continueexcept (EOFError, IOError):breakif not ret:breakbuf += ret # 读到的字节buf_len = len(buf)while buf_len >= min_read_len:(version, msg_type, msg_len, xid) = ofproto_parser.header(buf) # 解析报文头if msg_len < min_read_len:  # msg是包括报文头的# Someone isn't playing nicely; log it, and try something sane.LOG.debug("Message with invalid length %s received from switch at address %s",msg_len, self.address)msg_len = min_read_lenif buf_len < msg_len: # 有可能开始读的只是报文头,
# 但是msg_len是真实的报文长度,这个时候需要退出并继续读remaining_read_len = (msg_len - buf_len)breakmsg = ofproto_parser.msg(self, version, msg_type, msg_len, xid, buf[:msg_len]) # 消息长度才有意义# LOG.debug('queue msg %s cls %s', msg, msg.__class__)if msg:ev = ofp_event.ofp_msg_to_ev(msg)# print "in _recv_loop. ev_cls is %s" % ev.__class__self.ofp_brick.send_event_to_observers(ev, self.state)def dispatchers(x):return x.callers[ev.__class__].dispatchershandlers = [handler for handler inself.ofp_brick.get_handlers(ev) ifself.state in dispatchers(handler)]for handler in handlers:# print "in _recv_loop, handler %s executed\n" % handlerhandler(ev)buf = buf[msg_len:]  # 可能会有粘包的现象buf_len = len(buf)remaining_read_len = min_read_len# We need to schedule other greenlets. Otherwise, ryu# can't accept new switches or handle the existing# switches. The limit is arbitrary. We need the better# approach in the future.count += 1if count > 2048:count = 0hub.sleep(0)

3.一个完整的过程

4.OFPT_PACKET_IN报文 (无动作)

5.OFPT_PACKET_OUT响应报文

具体的报文

6.OFPT_FLOW_MOD报文

RYU控制器的学习笔记(二)相关推荐

  1. RYU控制器的学习笔记(一) ryu.app.rest_router的分析

    参考链接:https://www.cnblogs.com/goldsunshine/p/11720310.html 1.默认的流表 当你启动任何一个ryu app之后,交换机的流表就被设置为默认的下面 ...

  2. RYU控制器的学习笔记(三) 利用观察者模式通知app处理报文

    当一个流量包通过tcp报文发送到6633端口的时候,会发生什么? def _recv_loop(self):........msg = ofproto_parser.msg(self, version ...

  3. Ethernet/IP 学习笔记二

    Ethernet/IP 学习笔记二 原文链接:http://wiki.mbalib.com/wiki/Ethernet/IP 1.通信模式 不同于源/目的通信模式,EtherNet/IP 采用生产/消 ...

  4. 深度强化学习笔记(二)——Q-learning学习与二维寻路demo实现

    深度强化学习笔记(二)--Q-learning学习与二维寻路demo实现 文章目录 深度强化学习笔记(二)--Q-learning学习与二维寻路demo实现 前言 理论 什么是Q-Learning 算 ...

  5. wxpython应用程序对象与顶级窗口_wxPython学习笔记(二)

    如何创建和使用一个应用程序对象? 任何wxPython应用程序都需要一个应用程序对象.这个应用程序对象必须是类wx.App或其定制的子类的一个实例.应用程序对象的主要目的是管理幕后的主事件循环. 父类 ...

  6. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...

  7. [转载]dorado学习笔记(二)

    原文地址:dorado学习笔记(二)作者:傻掛 ·isFirst, isLast在什么情况下使用?在遍历dataset的时候会用到 ·dorado执行的顺序,首先由jsp发送请求,调用相关的ViewM ...

  8. PyTorch学习笔记(二)——回归

    PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...

  9. tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数

    tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报  分类: tensorflow(4)  目录(?)[+] 本笔记目的 ...

最新文章

  1. DeepFashion︱衣物时尚元素关键点定位+时尚元素对齐技术
  2. MongoDB 基本操作增删改查
  3. spring4-3-AOP-面向切面编程
  4. java 克隆的作用_关于java中克隆的学习(一)
  5. 第12天,HTML基础
  6. python3 ftp模块_python3利用pyftpdlib模块启动ftp服务
  7. SAP gateway处理multiple key的逻辑
  8. 《我们应该怎样做需求分析》阅读笔记
  9. pytorch学习 入门篇(一)
  10. tensorflow错误记录:tf.concat
  11. 千行代码入门python-要学 Python 需要怎样的基础?
  12. 机顶盒文件服务器,智能网络机顶盒常见的六大玩法,别浪费了资源!
  13. VS2008 安装时 出现 “加载安装组件时出现问题,取消安装” 的解决方法
  14. 《超越对手-大项目售前售后的30种实战技巧》读书心得
  15. 一行代码回显 LayUI表单数据回显 下拉列表select回显
  16. 极验系列文章一:极验三代 极验验证码整体流程分析
  17. R z-score 方法检测异常值
  18. 【HCIA 03】华为静态路由配置
  19. 稳定性全系列(一)——如何做好系统稳定性建设
  20. html橙光游戏制作工具,橙光游戏制作工具全部视频教程

热门文章

  1. sendmail(一)
  2. JS数据结构与算法_链表
  3. 文件上传--Smartupload上传组件【上】
  4. linux shell 判断文件 修改时间和系统时间差
  5. python3 实现 php serialize 函数
  6. python3 sys.stdin.readline input 区别
  7. linux c 重定向流后的恢复 freopen后的恢复
  8. linux gdb调试问题汇总
  9. joomla3.6.5 nginx下 前台页面404错误
  10. linux shell 2 /dev/null的解释