RYU控制器的学习笔记(二)
楔子: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控制器的学习笔记(二)相关推荐
- RYU控制器的学习笔记(一) ryu.app.rest_router的分析
参考链接:https://www.cnblogs.com/goldsunshine/p/11720310.html 1.默认的流表 当你启动任何一个ryu app之后,交换机的流表就被设置为默认的下面 ...
- RYU控制器的学习笔记(三) 利用观察者模式通知app处理报文
当一个流量包通过tcp报文发送到6633端口的时候,会发生什么? def _recv_loop(self):........msg = ofproto_parser.msg(self, version ...
- Ethernet/IP 学习笔记二
Ethernet/IP 学习笔记二 原文链接:http://wiki.mbalib.com/wiki/Ethernet/IP 1.通信模式 不同于源/目的通信模式,EtherNet/IP 采用生产/消 ...
- 深度强化学习笔记(二)——Q-learning学习与二维寻路demo实现
深度强化学习笔记(二)--Q-learning学习与二维寻路demo实现 文章目录 深度强化学习笔记(二)--Q-learning学习与二维寻路demo实现 前言 理论 什么是Q-Learning 算 ...
- wxpython应用程序对象与顶级窗口_wxPython学习笔记(二)
如何创建和使用一个应用程序对象? 任何wxPython应用程序都需要一个应用程序对象.这个应用程序对象必须是类wx.App或其定制的子类的一个实例.应用程序对象的主要目的是管理幕后的主事件循环. 父类 ...
- qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)
原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...
- [转载]dorado学习笔记(二)
原文地址:dorado学习笔记(二)作者:傻掛 ·isFirst, isLast在什么情况下使用?在遍历dataset的时候会用到 ·dorado执行的顺序,首先由jsp发送请求,调用相关的ViewM ...
- PyTorch学习笔记(二)——回归
PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...
- tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数
tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报 分类: tensorflow(4) 目录(?)[+] 本笔记目的 ...
最新文章
- DeepFashion︱衣物时尚元素关键点定位+时尚元素对齐技术
- MongoDB 基本操作增删改查
- spring4-3-AOP-面向切面编程
- java 克隆的作用_关于java中克隆的学习(一)
- 第12天,HTML基础
- python3 ftp模块_python3利用pyftpdlib模块启动ftp服务
- SAP gateway处理multiple key的逻辑
- 《我们应该怎样做需求分析》阅读笔记
- pytorch学习 入门篇(一)
- tensorflow错误记录:tf.concat
- 千行代码入门python-要学 Python 需要怎样的基础?
- 机顶盒文件服务器,智能网络机顶盒常见的六大玩法,别浪费了资源!
- VS2008 安装时 出现 “加载安装组件时出现问题,取消安装” 的解决方法
- 《超越对手-大项目售前售后的30种实战技巧》读书心得
- 一行代码回显 LayUI表单数据回显 下拉列表select回显
- 极验系列文章一:极验三代 极验验证码整体流程分析
- R z-score 方法检测异常值
- 【HCIA 03】华为静态路由配置
- 稳定性全系列(一)——如何做好系统稳定性建设
- html橙光游戏制作工具,橙光游戏制作工具全部视频教程