## sdn - 初步分析基于OpenFlow的SDN网络控制功能


题目要求:
1、下发流表项实现 h1 和 h2,h2 和 h3 不能互通、h1 和 h3 可互通。
2、结合捕获的 SDN 相关协议(例如 OpenFlow 协议)报文,分析其报文结构, 并简要描述该类报文的作用。(一种即可,限 500 字)
3、说明在相同的网络拓扑中传统分布式网络如何实现要求 1,并分析与 SDN 实 现之间的差别。

### 第一题
#### 分析
题目已经说的很明白了,现在问题是怎么样去实现。
基于我现在所了解的sdn的知识,在sdn网络中,有一个网络拓扑,里面有各种路由器和主机,同时还有控制器连接着路由。在说控制器之前,先说一下路由。
在路由中, 有着流表,其中的作用就是当网络中的包经过路由,路由就会根据流表进行匹配,从而进行对应的操纵。
现在就有问题了,当一个包出现不匹配任何流表,路由应该怎么办呢。
这时,路由器就会找到控制器,控制器会就可以根据情况下发对应的流表,告诉路由器怎么处理。
以上是简单的对sdn的理解,所以要处理这题就是要给路由添加一条流表,把进入h2或从h2出来的包丢弃就好了。
#### 实现
因为内容比较简单,可以不考虑控制器下发流表的做法,直接使用mininet控制台使用ovs命令进行控制。
另外要求的是ping通h2。
ping是应用层直接使用icmp的回送请求与回送回答报文,就意味着,h1 ping h2 时,h1发送请求后,h2要回报给h1。所以只要限制了h2的发送,外界就无法ping通h2,并且h2也无法ping通其他主机了。

#### 代码
##### topo结构如下:

<code>
class MyTopo(Topo):

def __init(self):
Topo.__init__(self)

h1 = self.addHost('h1')
h2 = self.addHost('h2')
h3 = self.addHost('h3')
s1 = self.addSwitch('s1')
s2 = self.addSwitch('s2')

self.addLink(h1, s1)
self.addLink(h2, s1)
self.addLink(h3, s2)
self.addLink(s1, s1)

topos = { 'mytopo' : (lambad:MyTopo() ) }
<code/>

##### 启动mininet

<code>
sudo mn --custom mytopo.py --topo mytopo --mac
<code/>

##### 手动添加流表

<code>
sh ovs-ofctl add-flow s1 priority=12,in_port=2,action=drop
<code/>

##### 上一条作用就是把从口2进入的包给丢弃,并且这条流表的优先级为12
##### 关于流表的一些简单的知识,来源<a href="http://blog.csdn.net/zhongbeida_xue/article/details/54945496">这里</a>
每条流规则由一系列字段组成,分为基本字段、条件字段和动作字段三部分
1.基本字段包括生效时间duration_sec、所属表项table_id、优先级priority、处理的数据包数n_packets,空闲超时时间idle_timeout等,空闲超时时间idle_timeout以秒为单位,超过设置的空闲超时时间后该流规则将被自动删除,空闲超时时间设置为0表示该流规则永不过期,idle_timeout将不包含于ovs-ofctl dump-flows brname的输出中。
2.条件字段包括输入端口号in_port、源目的mac地址dl_src/dl_dst、源目的ip地址nw_src/nw_dst、数据包类型dl_type、网络层协议类型nw_proto等,可以为这些字段的任意组合,但在网络分层结构中底层的字段未给出确定值时上层的字段不允许给确定值,即一条流规则中允许底层协议字段指定为确定值,高层协议字段指定为通配符(不指定即为匹配任何值),而不允许高层协议字段指定为确定值,而底层协议字段却为通配符(不指定即为匹配任何值),否则,ovs-vswitchd 中的流规则将全部丢失,网络无法连接。
3.动作字段包括正常转发normal、定向到某交换机端口output:port、丢弃drop、更改源目的mac地址mod_dl_src/mod_dl_dst等,一条流规则可有多个动作,动作执行按指定的先后顺序依次完成。

##### 结果

### 第二题

##### 分析具体的openflow1.0协议

#### 1.Hello


##### 控制器与交换机之间的OpenFlow协议是应用于TCP传输层上,所以解析应用层。他们首先发送hello消息,建立初始化连接
##### 1.Version:OpenFlow版本,低位为版本号
##### 2.Type:OpenFlow消息类型
##### 3.Length:消息总长度,包含头部
##### 4.Xid:事件ID,同一件事件的ID号一致。如feature_request和对应的feature_reply就使用同一个Transaction id,但是两个hello消息的Transaction id并不相同,不过据两个id一般是两个相邻的数字。并且packet_in的transaction id都为0。

#### 2.Feature

##### 会话一建立,控制器就会向交换机发送一个ofpt_feature_request消息,该消息只有of包头,如下所示。交换机会回复一条ofpt_feature_reply消息
##### ofpt_feature_request如图:


##### ofpt_feature_replyt如图:


##### 1.datapath_id : 数据通道独一无二的标识符,低48位是一个MAC地址,而高16位是自定义的。例如,用高16位代表VLAN ID区别一个物理交换机中的多个虚拟交换机
##### 2.n_buffers : 一次最多缓存的数据包数量
##### 3.n_tables : 表示交换机支持的流表数量。而每个流表可以设置不同的通配符和不同数量的流表项。控制器和交换机第一次通信的时候,控制器会从feature_reply消息中找出交换机支持多少流表,如果控制器还想了解大小、类型和流表查询的顺序,就发送一个ofpst_table stats请求,交换机必须按照数据包遍历流表的顺序把这些流表回复给控制器,并且精确匹配流表排在通配流表前
##### 4.capabilities : 所支持的功能
##### 5.actions : 该bitmask表示交换机所支持的actions,“required”action必须支持,vendor action不应该通过该bitmask显示,actions根据ofp_action_type的值决定需要左移几位。
##### 6.ports[] : 以数组的形式罗列出该系统中支持OpenFlow的物理端口。数据长度可以根据OpenFlow头部中的length推测出来

#### 3.Packet_in
当交换机碰到新数据包不知道如何处理,或者action要求发送给控制器,那么交换机就会用packet_in消息发送给控制器。一般将数据包缓存在交换机中,将有效的数据包信息(默认的128字节,如果原因是 “send to controller” action,那么长度由action_out的max_len决定;如果是原因table miss,那么长度由set_config消息中的miss_send_len决定。)和缓存id发送给控制器,不过,如果交换机不支持缓存或者内存用光了,那么就把整个数据包放在数据部分发给控制器,并且缓存id为-1

##### packet_in消息如下

##### total_len : 整个数据帧的长度
##### in_port : 接收数据帧的端口
##### reason : 将数据包发送给控制器的原因,一般有俩原因,一是没有匹配到流表项,二是动作要求发给控制器

#### 4.Packet_out

##### Packet_out如图:


当控制器希望交换机发送某个数据包,就使用packet_out消息

#### 参考链接
#### 1.流表相关 - <a href = 'http://www.sdnlab.com/15119.html'>http://www.sdnlab.com/15119.html<a/>
#### 2.openflow协议分析 - <a href = 'http://www.jianshu.com/p/e660508f1c5d'>http://www.jianshu.com/p/e660508f1c5d<a/>

Sdn - 基础题试水的更多相关文章

  1. nyist oj 79 拦截导弹 (动态规划基础题)

    拦截导弹 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述 某国为了防御敌国的导弹突击.发展中一种导弹拦截系统.可是这样的导弹拦截系统有一个缺陷:尽管它的第一发炮弹可以 ...

  2. 第一回:Scrapy的试水

    前言:今天算是见到Scrapy的第二天,之前只是偶尔查了查,对于这个框架的各种解释,我-----都-----看------不------懂----,没办法,见面就是刚. 目的:如题,试水 目标:< ...

  3. 九度OJ 1015:还是A+B (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6773 解决:4031 题目描述: 读入两个小于10000的正整数A和B,计算A+B.需要注意的是:如果A和B的末尾K(不超过8)位数字相同 ...

  4. 微博试水卖车社交电商怎样令4S“颤抖”?

        微博对社交电商的探索一直在深入,年初.微博上线了"支付"产品.从而使社交产业链实现了闭环,随后,微博又尝试售卖多种商品,不断扩大移动电商的试水范围,近期微博大规模汽车销售收 ...

  5. Android测试基础题(三)

    今天接着给大家带来的是Android测试基础题(三).    需求:定义一个排序的方法,根据用户传入的double类型数组进行排序,并返回排序后的数组 俗话说的好:温故而知新,可以为师矣 packag ...

  6. 小试牛刀3之JavaScript基础题

    JavaScript基础题 1.让用户输入两个数字,然后输出相加的结果. *prompt() 方法用于显示可提示用户进行输入的对话框. 语法: prompt(text,defaultText) 说明: ...

  7. 小试牛刀2:JavaScript基础题

    JavaScript基础题 1.网页中有个字符串“我有一个梦想”,使用JavaScript获取该字符串的长度,同时输出字符串最后两个字. 答案: <!DOCTYPE html PUBLIC &q ...

  8. POJ 2502 - Subway Dijkstra堆优化试水

    做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...

  9. HDU 1301 Jungle Roads (最小生成树,基础题,模版解释)——同 poj 1251 Jungle Roads

    双向边,基础题,最小生成树   题目 同题目     #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include<stri ...

随机推荐

  1. 各国货币json文件

    [ {"countryname":"","name":"请选择","currency":" ...

  2. mybatis第二天_拓展——与spring整合以及逆向工程

    一.整合思路 1.SqlSessionFactory对象应该放到spring容器中作为单例存在. 2.传统dao的开发方式中,应该从spring容器中获得sqlsession对象. 3.Mapper代 ...

  3. [2016北京集训试题15]项链-[FFT]

    Description Solution 设y[i+k]=y[i]+n. 由于我们要最优解,则假如将x[i]和y[σ[i]]连线的话,线是一定不会交叉的. 所以,$ans=\sum (x_{i}-y_ ...

  4. 【转载】COM 组件设计与应用(十一)—— IDispatch 及双接口的调用

    原文:http://vckbase.com/index.php/wv/1236.html 一.前言 前段时间,由于工作比较忙,没有能及时地写作.其间收到了很多网友的来信询问和鼓励,在此一并表示感谢.咳 ...

  5. keras 修仙笔记二(ResNet算法例子)

    对于牛逼的程序员,人家都喜欢叫他大神:因为大神很牛逼,人家需要一个小时完成的技术问题,他就20分钟就搞定.Keras框架是一个高度集成的框架,学好它,就犹如掌握一个法宝,可以呼风唤雨.所以学keras ...

  6. h5 和之前版本的区别

    html5和之前版本的区别就是:以前版本多采用<tr><td>等标签,对于webapp的开发不是很好把控.H5采用<div>等标签直接进行布局(且多了许多标签功能很 ...

  7. Core - Provide an easy way to store administrator and user model differences in a custom store (e.g., in a database)

    https://www.devexpress.com/Support/Center/Question/Details/S32444/core-provide-an-easy-way-to-store- ...

  8. python log封装

    # _*_ coding:utf-8 _*_ import logging import os import sys import time log_path = os.path.dirname(sy ...

  9. Memached、Redis、Mongodb的区别

    性能 ​ • 性能都很高,redis和memached差不多 > Mongodb 操作 ​ • Memached:数据结构单一,只有key/value数据结构 ​ • Redis有五种数据类型 ...

  10. 最近遇到的几个问题,关于Unity脚本在Inspector视图中前面没有勾选框的问题

    1.为什么在Inspector视图中有的脚本前面有勾选框,有的脚本前面没有? 当我想要禁用一个脚本时,发现脚本前面没有勾选框,有的却有. 解决办法:在脚本中添加start方法,然后就有勾选框了. 原因 ...