作业链接:实验3:OpenFlow协议分析实践

一、实验目的

  1. 能够运用 wireshark 对 OpenFlow 协议数据交互过程进行抓包;
  2. 能够借助包解析工具,分析与解释 OpenFlow协议的数据包交互过程与机制。

二、实验环境

  1. 下载虚拟机软件Oracle VisualBox;
  2. 在虚拟机中安装Ubuntu 20.04 Desktop amd64,并完整安装Mininet;

三、实验要求

(一)基本要求

1.搭建下图所示拓扑,完成相关 IP 配置,并实现主机与主机之间的 IP 通信。用抓包软件获取控制器与交换机之间的通信数据包。

主机 IP地址
h1 192.168.0.101/24
h2 192.168.0.102/24
h3 192.168.0.103/24
h4 192.168.0.104/24
  • 构建拓扑

  • 配置子网掩码和ip地址(只给出h1和h2的ip配置,其他是一样的)





  • 检查

2.查看抓包结果,分析OpenFlow协议中交换机与控制器的消息交互过程,画出相关交互图或流程图。

  • 在构建拓扑之前打开wireshark(选择any),然后运行文件并pingall。

  • 查看抓的包

    1.OFPT_HELLO

    从6633端口到43820端口,openflow1.0协议



从43820端口到6633端口,openflow1.5协议



2.OFPT_FEATURES_REQUEST 从6633端口到43820端口

3.OFPT_SET_CONFIG 从6633端口到43820端口

4.OFPT_PORT_STATUS 从43820端口到6633端口

5.OFPT_FEATURES_REPLY 从43820端口到6633端口

6.OFPT_PACKET_IN 从43820端口到6633端口

7.OFPT_PACKET_OUT 从6633端口到43820端口

8.OFPT_FLOW_MOD 从6633端口到43820端口

  • 对应流程图如下:

3.回答问题:交换机与控制器建立通信时是使用TCP协议还是UDP协议?

Transmission Control Protocol即TCP协议

(二)进阶要求

将抓包结果对照OpenFlow源码,了解OpenFlow主要消息类型对应的数据结构定义。

1.HELLO

  1. struct ofp_header {
  2. uint8_t version; /* OFP_VERSION. */
  3. uint8_t type; /* One of the OFPT_ constants. */
  4. uint16_t length; /* Length including this ofp_header. */
  5. uint32_t xid; /* Transaction id associated with this packet.
  6. Replies use the same id as was in the request
  7. to facilitate pairing. */
  8. };
  9. struct ofp_hello {
  10. struct ofp_header header;
  11. };

2.OFPT_FEATURES_REQUEST

源码与HELLO类似

3.OFPT_SET_CONFIG

  1. /* Switch configuration. */
  2. struct ofp_switch_config {
  3. struct ofp_header header;
  4. uint16_t flags; /* OFPC_* flags. */
  5. uint16_t miss_send_len; /* Max bytes of new flow that datapath should
  6. send to the controller. */
  7. };

4.OFPT_PORT_STATUS

  1. /* A physical port has changed in the datapath */
  2. struct ofp_port_status {
  3. struct ofp_header header;
  4. uint8_t reason; /* One of OFPPR_*. */
  5. uint8_t pad[7]; /* Align to 64-bits. */
  6. struct ofp_phy_port desc;
  7. };

5.OFPT_FEATURES_REPLY

  1. struct ofp_switch_features {
  2. struct ofp_header header;
  3. uint64_t datapath_id; /* Datapath unique ID. The lower 48-bits are for
  4. a MAC address, while the upper 16-bits are
  5. implementer-defined. */
  6. uint32_t n_buffers; /* Max packets buffered at once. */
  7. uint8_t n_tables; /* Number of tables supported by datapath. */
  8. uint8_t pad[3]; /* Align to 64-bits. */
  9. /* Features. */
  10. uint32_t capabilities; /* Bitmap of support "ofp_capabilities". */
  11. uint32_t actions; /* Bitmap of supported "ofp_action_type"s. */
  12. /* Port info.*/
  13. struct ofp_phy_port ports[0]; /* Port definitions. The number of ports
  14. is inferred from the length field in
  15. the header. */
  16. };
  17. /* Description of a physical port */
  18. struct ofp_phy_port {
  19. uint16_t port_no;
  20. uint8_t hw_addr[OFP_ETH_ALEN];
  21. char name[OFP_MAX_PORT_NAME_LEN]; /* Null-terminated */
  22. uint32_t config; /* Bitmap of OFPPC_* flags. */
  23. uint32_t state; /* Bitmap of OFPPS_* flags. */
  24. /* Bitmaps of OFPPF_* that describe features. All bits zeroed if
  25. * unsupported or unavailable. */
  26. uint32_t curr; /* Current features. */
  27. uint32_t advertised; /* Features being advertised by the port. */
  28. uint32_t supported; /* Features supported by the port. */
  29. uint32_t peer; /* Features advertised by peer. */
  30. };

6.OFPT_PACKET_IN

  1. struct ofp_packet_in {
  2. struct ofp_header header;
  3. uint32_t buffer_id; /* ID assigned by datapath. */
  4. uint16_t total_len; /* Full length of frame. */
  5. uint16_t in_port; /* Port on which frame was received. */
  6. uint8_t reason; /* Reason packet is being sent (one of OFPR_*) */
  7. uint8_t pad;
  8. uint8_t data[0]; /* Ethernet frame, halfway through 32-bit word,
  9. so the IP header is 32-bit aligned. The
  10. amount of data is inferred from the length
  11. field in the header. Because of padding,
  12. offsetof(struct ofp_packet_in, data) ==
  13. sizeof(struct ofp_packet_in) - 2. */
  14. };

7.OFPT_PACKET_OUT

  1. struct ofp_packet_out {
  2. struct ofp_header header;
  3. uint32_t buffer_id; /* ID assigned by datapath (-1 if none). */
  4. uint16_t in_port; /* Packet's input port (OFPP_NONE if none). */
  5. uint16_t actions_len; /* Size of action array in bytes. */
  6. struct ofp_action_header actions[0]; /* Actions. */
  7. /* uint8_t data[0]; */ /* Packet data. The length is inferred
  8. from the length field in the header.
  9. (Only meaningful if buffer_id == -1.) */
  10. };

8.OFPT_FLOW_MOD

  1. struct ofp_flow_mod {
  2. struct ofp_header header;
  3. struct ofp_match match; /* Fields to match */
  4. uint64_t cookie; /* Opaque controller-issued identifier. */
  5. /* Flow actions. */
  6. uint16_t command; /* One of OFPFC_*. */
  7. uint16_t idle_timeout; /* Idle time before discarding (seconds). */
  8. uint16_t hard_timeout; /* Max time before discarding (seconds). */
  9. uint16_t priority; /* Priority level of flow entry. */
  10. uint32_t buffer_id; /* Buffered packet to apply to (or -1).
  11. Not meaningful for OFPFC_DELETE*. */
  12. uint16_t out_port; /* For OFPFC_DELETE* commands, require
  13. matching entries to include this as an
  14. output port. A value of OFPP_NONE
  15. indicates no restriction. */
  16. uint16_t flags; /* One of OFPFF_*. */
  17. struct ofp_action_header actions[0]; /* The action length is inferred
  18. from the length field in the
  19. header. */
  20. };
  21. struct ofp_action_header {
  22. uint16_t type; /* One of OFPAT_*. */
  23. uint16_t len; /* Length of action, including this
  24. header. This is the length of action,
  25. including any padding to make it
  26. 64-bit aligned. */
  27. uint8_t pad[4];
  28. };

四、个人总结

实验难度

本次实验大部分为验证性实验,相对于之前几次实验来说比较简单。主要是验证各个包传递的信息以及从哪里传到哪里。在实验过程中需要不断查阅资料,询问同学,难度算是很正常的。

实验过程遇到的困难及解决办法

  • 主要遇到的问题是:经常没办法一次抓包就抓到所需要的全部包,总因为步骤不是很规范导致缺少某个包。

    解决方法:最好在建立拓扑之前就打开wireshark,然后拓扑构建完成之后pingall,即可获取到所有的包。

个人感想

这次试验进一步学习了wireshark的使用,对wireshark的各项功能有了更加深刻的理解。其次也认识到了拓扑建立过程中所用到的协议,以及OpenFlow协议的数据交互的机制。有了这些理论知识的铺垫,我认为我能够在接下来的实践过程中游刃有余地完成任务。

实验3:OpenFlow协议分析实践的更多相关文章

  1. 软件定义网络实验记录⑤--OpenFlow 协议分析和 OpenDaylight 安装

    一.实验目的 回顾 JDK 安装配置,了解 OpenDaylight 控制的安装,以及 Mininet 如何连接: 通过抓包获取 OpenFlow 协议,验证 OpenFlow 协议和版本,了解协议内 ...

  2. 实验 5:OpenFlow 协议分析和 OpenDaylight 安装

    一.实验目的 回顾 JDK 安装配置,了解 OpenDaylight 控制的安装,以及 Mininet 如何连接;通过抓包获取 OpenFlow 协议,验证 OpenFlow 协议和版本,了解协议内容 ...

  3. 实验 5 :OpenFlow 协议分析和 OpenDaylight 安装

    实验 5 :OpenFlow 协议分析和 OpenDaylight 安装 一.实验目的 回顾 JDK 安装配置,了解 OpenDaylight 控制的安装,以及 Mininet 如何连接: 通过抓包获 ...

  4. OpenFlow协议分析

    OpenFlow协议分析实验手册 启动虚拟机mininet 和 控制器 ODL 启动wireshark,在控制器的ens32 网卡抓包 使用mininet创建简单拓扑,并连接控制器,指定交换机为ovs ...

  5. 实验 5:OpenFlow 协议分析和 OpenDaylight 安装

    一.实验目的 回顾 JDK 安装配置,了解 OpenDaylight 控制的安装,以及 Mininet 如何连接:通过抓包获取 OpenFlow 协议,验证 OpenFlow 协议和版本,了解协议内容 ...

  6. SDN学习之OpenFlow协议分析

    学习SDN相关的学习也已经有快半年了,期间从一无所知到懵懵懂懂,再到现在的有所熟悉,经历了许多,也走了不少弯路,其中,最为忌讳的便是,我在学习过程中,尚未搞明白OpenFlow协议的情况下,便开始对S ...

  7. 实战录 | 基于openflow协议的抓包分析

    <实战录>导语 云端卫士<实战录>栏目定期会向粉丝朋友们分享一些在开发运维中的经验和技巧,希望对于关注我们的朋友有所裨益.本期分享人为云端卫士安全SDN工程师宋飞虎,将带来基于 ...

  8. OpenFlow协议1.0及1.3版本分析

    OpenFlow是SDN控制器和交换之间交流的协议,在SDN领域有着十分重要的地位. OpenFlow协议发展到现在已经经过了1.0.1.3.1.4等版本.其中1.0和1.3版本使用的是最为广泛的. ...

  9. 实验八 应用层协议Ⅱ-FTP协议分析

    实验八 应用层协议Ⅱ-FTP协议分析 一.实验目的 1.掌握FTP协议的实现原理. 2.了解控制通道和数据通道. 二.实验内容 用WareShark追踪ftp连接. 1.三次握手 2.ftp服务器回发 ...

随机推荐

  1. cmd关闭端口占用

    netstat -nao |findStr "8080" taskkill /pid 15406  /f

  2. Linux压缩解压 tar.gz格式的文件.查看tomcat是否运行

    tar命令详解 -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用 ...

  3. C# .NetCore简单实现无限递归的功能

    1:在实际开发中,我们会经常使用到无限递归的情况,如菜单,父子级等的情况 2:Code 1 using System; 2 using System.Collections.Generic; 3 us ...

  4. leaflet加载离线OSM(OpenStreetMap)

    本文为博主原创,如需转载需要署名出处. leaflet作为广为应用的开源地图操作的API,是非常受欢迎,轻量级的代码让使用者更容易操作. 废话不多说,下面直接给出范例. 首先在这个网站下载leafle ...

  5. idea快速搭建Tomcat服务器

    创建Web项目 新建Classes和lib文件夹 配置输出路径和资源路径 快捷键ctr+shift+alt+S打开项目配置 在modules下修改输出路径 修改依赖目录 修改war包输出路径 新建to ...

  6. Typora代码块配色和标题自带序号的实现代码

    Typora代码块配色和标题自带序号的实现代码 先打开主题文件夹 文件>偏好设置>外观>打开主题文件夹 然后编辑base.user.css(如果没有就新建一个)文件 /*标题自动添加 ...

  7. string类型数据的操作指令

    1. 2. 3. 4. 5. 6. 7. 8. 9. 从右到左是索引从-1开始 10. 11. 12. 13. 14. 15.

  8. C# Dapper基本三层架构使用 (三、DAL)

    数据访问层(DAL),主要是存放对数据类的访问,即对数据库的添加.删除.修改.更新等基本操作 首先需要在UI层App.Config配置文件中增加连接字符串,如下所示 <connectionStr ...

  9. node.js一头雾水

    开始学习node.js,一头雾水,谁可以告诉我怎么学......欢迎评论留言怎么学node.js的,谢谢 node,node,node,给自己加油 放一张自己设计的日历图鼓励一下:):):),加油.. ...

  10. etcd学习(10)-etcd对比Consul和zooKeeper如何选型

    etcd选型对比 前言 基本架构和原理 etcd Consul ZooKeeper 选型对比 总结 参考 etcd选型对比 前言 对比 Consul, ZooKeeper.选型etcd有那些好处呢? ...