OpenDaylight与Mininet应用实战之OpenFlow1.0协议分析二
1 打开wireshark并创建拓扑
按照章节一搭建平台,启动ODL,并打开wireshark。进入装有Mininet的VM,通过mn命令指定网络拓扑及指定此ODL控制器。 Mininet创建网络拓扑命令:
sudo mn --topo linear,2 --switch ovsk --controller=remote,ip=192.168.5.203,port=6633
此命令通过Mininet模拟创建一个含有两个交换机(Open vSwitch,以下简写为OVS)和两个主机的网络拓扑,其中192.168.5.203为ODL的IP,6633为ODL的默认端口,网络拓扑如下图所示:
2 查看网络
在Mininet中通过操作网络命令,可以查看OVS间及OVS与主机间的连接关系,也可以查看Mininet是否远程连接控制器。
例如,通过nodes命令可以查看网络中所有的节点。
通过net命令可以查看并确认网络连接关系是否与预期一致以及节点信息,且可以了解具体的连接端口信息。
通过下面的dump命令可以看出,交换机通过远程方式连接到控制器,且能看到控制器的IP和PORT。
3 抓包并分析协议
通过wireshark抓包可以直接看到控制器与OVS交换机的通信过程,下面分析该流程中的OF消息。此专题应用的是直接支持OpenFlow协议的wireshark官网Stable Release (1.12.1)版本。
3.1建立连接
控制器与交换机之间的OpenFlow协议是应用于TCP传输层上,所以解析应用层。他们首先发送hello消息,建立初始化连接,协商使用的OpenFlow协议版本。由下图可知,ODL与Mininet之间应用的是OpenFlow1.0版本协议(其他1.2、1.3协议会在协议OpenFlow后面标识)。
3.2 能力请求响应
该消息主要响应能力请求feature request消息,回复连接此控制器的交换机的一些基本设置信息,包括交换机的能力以及它的一些端口的信息等。
3.3 config请求回应
get config reply消息用于回应get config request消息,交换机通过该消息回应配置信息,一般是交换机的接口配置等信息。
3.4 stats状态信息
stats reply消息用于回应stats request信息,主要是交换机回应给控制器的状态信息。
3.5 flow mod消息
flow mod消息涉及到流表项的匹配信息等,下图显示的flow mod匹配项的类型信息。
3.6 packet_in、packet_out消息
在这部分流程中,当交换机收到数据包后查找流表无匹配项时,将数据包封装在packet_in消息发给controller,由controller通过packet_out消息下发决策,使发送和接收数据包的两主机间进行通信。
以上几种消息类型,可以参照OpenFlow标准协议中的类型,如下图:
我们可以用 wireshark 观察到当第一次有 ping 包从h1发到h2时,控制器如何自动添加相应的表项到交换机。
同时,可以进入ODL的web界面查看发现设备的拓扑,如图所示:
4 总结
本文基于本专题前一篇文章介绍的实验平台,通过Mininet搭建拓扑结构熟悉其基本操作,同时通过支持OpenFlow协议的wireshark抓包工具熟悉并分析相关的OpenFlow协议。
- Android学习第五弹之Matrix的用法
- 推荐一款超强大的基于Angularjs的自动完成(Autocomplete)标签及标签组插件–ngTagsInput
- Android新组件RecyclerView介绍,其效率更好
- android wheelview实现三级城市选择
- 算法之冒泡排序
- 数据结构之链表
- Spring Cloud实战小贴士:Zuul统一异常处理(三)【Dalston版】
- 算法之红黑树
- MIDlet工作原理
- 第五章 正则表达式的拆分【修订】
- 仿今天头条加载环境文字闪动效果
- Myexclipse创建Junit测试
- 基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度
- 第五章 正则表达式的拆分
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 玩树莓派(raspberry pi) 2/3 raspbian的遇到的一些问题
- Dnsmasq加速本地DNS请求
- swoole深入学习 2. tcp Server和tcp Client
- 一切皆Socket
- Go代码重构:23倍的性能爆增
- 分布式系统的一致性协议之 2PC 和 3PC
- Docker快速搭建WordPress博客网站
- Elasticsearch入门,这一篇就够了
- 玩转 lua in Redis
- 用docker快速搭建wordpress博客
- 生产环境优雅的重启基于Nginx、Tornado的Web服务进程
- nginx记录post body/payload数据 日志用打印出结果
- nginx的location、rewrite玩法详解
- Redis Lua脚本调试
- 安装elasticsearch 5.x, 6.x 常见问题(坑)的解决