SDN技术实践.docx
《SDN技术实践.docx》由会员分享,可在线阅读,更多相关《SDN技术实践.docx(32页珍藏版)》请在冰点文库上搜索。
SDN技术实践
SDN技术实践部分
SDN全名为(SoftwareDefinedNetwork)即软件定义网络,是现互联网中一种新型的网络创新架构,其核心技术OpenFlow通过网络设备控制面与数据面分离开来,从而实现网络流量的灵活控制,为网络及应用提供了良好的平台。
而Mininet是一个轻量级软件定义网络和测试平台;它采用轻量级的虚拟化技术使一个单一的系统看起来像一个完整的网络运行想过的内核系统和用户代码,也可简单理解为SDN网络系统中的一种基于进程虚拟化平台,它支持OpenFlow、OpenvSwith等各种协议,Mininet也可以模拟一个完整的网络主机、链接和交换机在同一台计算机上且有助于互动开发、测试和演示,尤其是那些使用OpenFlow和SDN技术;同时也可将此进程虚拟化的平台下代码迁移到真实的环境中。
Mininet是轻量级的软件定义网络系统平台,同时提供了对OpenFlow协议的支持。
本文主要介绍了Mininet的相关概念与特性,并列举的Mininet自定义网络及参数网络拓扑示例,以及相关重要执行文件的分析,帮助用户更好的理解与使用Mininet技术。
Mininet实现的特性
◆支持OpenFlow、OpenvSwitch等软定义网路部件
◆支持系统级的还原测试,支持复杂拓扑,自定义拓扑等
◆提供PythonAPI,方便多人协作开发
◆很好的硬件移植性与高扩展性
◆支持数千台主机的网络结构
v研究环境搭建
硬件支持:
PC*1台
操作系统:
windows7、Ubuntu
软件配置:
VMWareWorkstation11、Mininet、Openflow
本实验基于Ubuntu平台完成。
ØUbuntu安装与配置
1.打开虚拟主界面后,选择“创建新的虚拟机(Ctrl+N)”,出现如图所示界面,在这里我们选择“自定义”选项,然后单击下一步按钮。
图1
2.在这一步,我们选择默认设置,然后单击下一步按钮。
图2
3.如图所示,这一步要求选择安装客户机操作系统来源。
安装来源可以是在安装程序光盘上,也可以通过镜像文件安装,也可以选择在虚拟机创建完成后再行安装操纵系统。
在这我选择的是直接通过本地镜像文件安装。
图3
4.设置用户信息。
图3
5.选择虚拟机存储的路径。
图4
6.处理器配置。
图5
7.虚拟机的内存设置,一般选择默认设置即可。
图6
8.虚拟机的网络接入方式。
图7
9.选择I/O控制器类型。
图8
10.选择磁盘类型。
图9
11.磁盘选择。
图10
12.磁盘容量设置,一般选择默认设置即可。
图11
13.磁盘文件存储路径设置。
图20
14.虚拟机配置完成,单击“完成”准备开始创建。
图21
15.创建完成。
图22
ØMininet安装与测试
Mininet的安装方式比较简单通过Git源码和自带的安装脚本方式即可安装在Linux系统中,这里我采用了默认安装所有Mininet相关的相关套件,如:
OpenFlow、POX等工具会默认保存在当前用户的家目录。
具体安装过程如下图所示(标注部分为安装的具体命令):
1)正常启动虚拟机后,检测网络连接是否正常,如果正常,则继续操作,否则,重新检查网络配置,使其正常连通网络。
2)新建终端(Ctrl+Alt+N),然后输入“gitclonegit:
//
3)待上述下载安装完成后输入“cdmininet/util/”命令后回车,转到mininet下的util文件夹下。
4)输入“./install.sh-a”命令回车执行安装。
图23
5)下载安装完成后如下图所示,可以输入“ls”命令查看安装完成后安装目录下的文件。
图24
6)运行测试,输入“sudomn”命令执行测试过程。
图25
这个命令自带创建了一个OpenFlow交换机(S1),两台主机(h1、h2)。
ØFloodLight安装与配置
1)新建终端(Ctrl+Alt+N),然后输入“sudoapt-getinstallfloodlight”命令后回车,等待下载安装。
图26
2)待安装完成后,打开浏览器在地址栏输入“http:
//localhost:
8080/ui/index.html”登录FloodLight的WEB界面查看,如果正常进入FloodLight的WEB界面(图27),则说明FloodLight安装成功,否则,则需要重新安装。
图27
Ø拓扑结构分析
1.创建网络
Mininet支持自定义网络,在Mininet网络系统中直接输入sudomn命令,可以在此系统中创建单层的拓扑网络,从中默认创建了两台host和一个交换机,并且激活了控制器和交换机。
同时也可以通过命令net查看到链路情况。
示例:
zss@ubuntu:
~$sudomn
[sudo]passwordforzss:
***Creatingnetwork
***Addingcontroller
***Addinghosts:
h1h2
***Addingswitches:
s1
***Addinglinks:
(h1,s1)(h2,s1)
***Configuringhosts
h1h2
***Startingcontroller
***Starting1switches
s1
***StartingCLI:
mininet>
图28
参数配置:
图29
2.启用与关闭Web服务
在Mininet环境中可方便建立
一个Web服务器,从下面示例中可以看到从host1建立了一个Web服务器,并从另外一台Host主机想Web服务器获取HTTP请求。
mininet>h1python-mSimpleHTTPServer80&
mininet>h2wget-O-h1
--2015-04-3004:
59:
43--http:
//10.0.0.1/
Connectingto10.0.0.1:
80...connected.
HTTPrequestsent,awaitingresponse...200OK
Length:
1472(1.4K)[text/html]
Savingto:
‘STDOUT’
············
2015-04-3004:
59:
43(187MB/s)-writtentostdout[1472/1472]
mininet>h1kill%python
ServingHTTPon0.0.0.0port80...
10.0.0.2--[30/Apr/201504:
59:
43]"GET/HTTP/1.1"200-
图30
3.在Mininet网络系统上实现两主机上互连测试。
mininet>h1ping-c4h2
PING10.0.0.2(10.0.0.2)56(84)bytesofdata.
64bytesfrom10.0.0.2:
icmp_seq=1ttl=64time=53.2ms
64bytesfrom10.0.0.2:
icmp_seq=2ttl=64time=0.221ms
64bytesfrom10.0.0.2:
icmp_seq=3ttl=64time=0.143ms
64bytesfrom10.0.0.2:
icmp_seq=4ttl=64time=0.072ms
---10.0.0.2pingstatistics---
4packetstransmitted,4received,0%packetloss,time3001ms
rttmin/avg/max/mdev=0.072/13.425/53.266/23.002ms
4.查看节点连接信息。
mininet>net
h1h1-eth0:
s1-eth1
h2h2-eth0:
s1-eth2
s1lo:
s1-eth1:
h1-eth0s1-eth2:
h2-eth0
c0
mininet>h1ifconfig
h1-eth0Linkencap:
EthernetHWaddrde:
ca:
e0:
31:
fa:
aa
inetaddr:
10.0.0.1Bcast:
10.255.255.255Mask:
255.0.0.0
inet6addr:
fe80:
:
dcca:
e0ff:
fe31:
faaa/64Scope:
Link
UPBROADCASTRUNNINGMULTICASTMTU:
1500Metric:
1
RXpackets:
210errors:
0dropped:
24overruns:
0frame:
0
TXpackets:
14errors:
0dropped:
0overruns:
0carrier:
0
collisions:
0txqueuelen:
1000
RXbytes:
33576(33.5KB)TXbytes:
1124(1.1KB)
loLinkencap:
LocalLoopback
inetaddr:
127.0.0.1Mask:
255.0.0.0
inet6addr:
:
:
1/128Scope:
Host
UPLOOPBACKRUNNINGMTU:
65536Metric:
1
RXpackets:
0errors:
0dropped:
0overruns:
0frame:
0
TXpackets:
0errors:
0dropped:
0overruns:
0carrier:
0
collisions:
0txqueuelen:
0
RXbytes:
0(0.0B)TXbytes:
0(0.0B)
mininet>h2ifconfig
h2-eth0Linkencap:
EthernetHWaddre2:
2f:
9b:
d5:
6c:
bb
inetaddr:
10.0.0.2Bcast:
10.255.255.255Mask:
255.0.0.0
inet6addr:
fe80:
:
e02f:
9bff:
fed5:
6cbb/64Scope:
Link
UPBROADCASTRUNNINGMULTICASTMTU:
1500Metric:
1
RXpackets:
215errors:
0dropped:
26overruns:
0frame:
0
TXpackets:
14errors:
0dropped:
0overruns:
0carrier:
0
collisions:
0txqueuelen:
1000
RXbytes:
34701(34.7KB)TXbytes:
1124(1.1KB)
loLinkencap:
LocalLoopback
inetaddr:
127.0.0.1Mask:
255.0.0.0
inet6addr:
:
:
1/128Scope:
Host
UPLOOPBACKRUNNINGMTU:
65536Metric:
1
RXpackets:
0errors:
0dropped:
0overruns:
0frame:
0
TXpackets:
0errors:
0dropped:
0overruns:
0carrier:
0
collisions:
0txqueuelen:
0
RXbytes:
0(0.0B)TXbytes:
0(0.0B)
mininet>s1ifconfig
eth0Linkencap:
EthernetHWaddr00:
0c:
29:
dd:
97:
48
inetaddr:
192.168.176.129Bcast:
192.168.176.255Mask:
255.255.255.0
inet6addr:
fe80:
:
20c:
29ff:
fedd:
9748/64Scope:
Link
UPBROADCASTRUNNINGMULTICASTMTU:
1500Metric:
1
RXpackets:
912errors:
0dropped:
0overruns:
0frame:
0
TXpackets:
973errors:
0dropped:
0overruns:
0carrier:
0
collisions:
0txqueuelen:
1000
RXbytes:
183953(183.9KB)TXbytes:
79447(79.4KB)
loLinkencap:
LocalLoopback
inetaddr:
127.0.0.1Mask:
255.0.0.0
inet6addr:
:
:
1/128Scope:
Host
UPLOOPBACKRUNNINGMTU:
65536Metric:
1
RXpackets:
5282errors:
0dropped:
0overruns:
0frame:
0
TXpackets:
5282errors:
0dropped:
0overruns:
0carrier:
0
collisions:
0txqueuelen:
0
RXbytes:
532771(532.7KB)TXbytes:
532771(532.7KB)
s1Linkencap:
EthernetHWaddr32:
76:
61:
28:
b9:
4d
inet6addr:
fe80:
:
7021:
ecff:
fee8:
a3bf/64Scope:
Link
UPBROADCASTRUNNINGMTU:
1500Metric:
1
RXpackets:
15errors:
0dropped:
0overruns:
0frame:
0
TXpackets:
8errors:
0dropped:
0overruns:
0carrier:
0
collisions:
0txqueuelen:
0
RXbytes:
1158(1.1KB)TXbytes:
648(648.0B)
s1-eth1Linkencap:
EthernetHWaddrbe:
79:
24:
c4:
44:
b3
inet6addr:
fe80:
:
bc79:
24ff:
fec4:
44b3/64Scope:
Link
UPBROADCASTRUNNINGMULTICASTMTU:
1500Metric:
1
RXpackets:
14errors:
0dropped:
0overruns:
0frame:
0
TXpackets:
218errors:
0dropped:
0overruns:
0carrier:
0
collisions:
0txqueuelen:
1000
RXbytes:
1124(1.1KB)TXbytes:
34734(34.7KB)
s1-eth2Linkencap:
EthernetHWaddr62:
de:
07:
35:
50:
9a
inet6addr:
fe80:
:
60de:
7ff:
fe35:
509a/64Scope:
Link
UPBROADCASTRUNNINGMULTICASTMTU:
1500Metric:
1
RXpackets:
14errors:
0dropped:
0overruns:
0frame:
0
TXpackets:
219errors:
0dropped:
0overruns:
0carrier:
0
collisions:
0txqueuelen:
1000
RXbytes:
1124(1.1KB)TXbytes:
35280(35.2KB)
5.自定义拓扑结构。
Mininet支持自定义拓扑结构。
Mininet安装完成后,在mininet/custom目录下给出了一个软件自带的实例,在topo-2sw-2host.py文件中定义了一个mytopo,我们可以通过--topo选项来指定使用这一拓扑。
由于Mininet也支持参数化拓扑,通过Python代码也可以创建一个灵活的拓扑结构,也可根据自定义传递进去的参数进行配置,并且可重用到多个环境中,下面简短列出其代码的大致结构及含义。
"""Customtopologyexample
Twodirectlyconnectedswitchesplusahostforeachswitch:
host---switch---switch---host
Addingthe'topos'dictwithakey/valuepairtogenerateournewlydefined
topologyenablesonetopassin'--topo=mytopo'fromthecommandline.
"""
frommininet.topoimportTopo
classMyTopo(Topo):
"Simpletopologyexample."
def__init__(self):
"Createcustomtopo."//自定义拓扑结构
#Initializetopology
Topo.__init__(self)
#Addhostsandswitches
leftHost=self.addHost('h1')
rightHost=self.addHost('h2')
leftSwitch=self.addSwitch('s3')
rightSwitch=self.addSwitch('s4')
#Addlinks
self.addLink(leftHost,leftSwitch)
self.addLink(leftSwitch,rightSwitch)
self.addLink(rightSwitch,rightHost)
topos={'mytopo':
(lambda:
MyTopo())}
6.命名空间(NameSpace)
通常情况下,主机界面有用独立的名字空间namespace,而控制节点跟交换节点都在根名字空间(rootnamespace)中。
如果想要让所有节点拥有各自的名字空间,需要添加--innamespace参数,即执行:
mn--innamespace。
zss@ubuntu:
~$sudomn--innamespace--switchuser
***Creatingnetwork
***Addingcontroller
***Addinghosts:
h1h2
***Addingswitches:
s1
***Addinglinks:
(h1,s1)(h2,s1)
c0<->s1
***Testingcontrolnetwork
s1->c0
c0->s1
***Results:
0%dropped(2/2received)
***Configuringhosts
h1h2
***Startingcontroller
c0
***Starting1switches
s1
***StartingCLI:
7.dpctl命令实践
dpctl程序是一个命令行工具用来检测和管理OpenFlow数据通路,它能够显示当前的状态数据通路,包括功能配置和表中的条目,以及合适使用OpenFlow的内核模块,可以用来添加,删除,修改和监视datapaths。
具体示例如下:
1)查看交换机端口信息基本情况(TCP端口6634是默认交换机监听端口)。
zss@ubuntu:
~$sudodpctlshowtcp:
127.0.0.1:
6634
features_reply(xid=0x97dfb336):
ver:
0x1,dpid:
1
n_tables:
254,n_buffers:
256
features:
capabilities:
0xc7,actions:
0xfff
1(s1-eth1):
addr:
62:
23:
67:
e9:
f1:
9a,config:
0,state:
0
current:
10GB-FDCOPPER
2(s1-eth2):
addr:
6e:
16:
94:
6c:
29:
d4,config:
0,state:
0
current:
10GB-FDCOPPER
LOCAL(s1):
addr:
8e:
5d:
71:
f9:
da:
44,config:
0,state:
0
get_config_reply(xid=0xd9df1b45):
miss_send_len=0
2)查看流表信息:
zss@ubuntu:
~$dpctldump-flowstcp:
127.0.0.1:
6634
stats_reply(xid=0x3c7e94de):
flags=nonetype=1(flow)
不难看出,此时流表为空,执行h1pingh2无法得到响应。
因此我们需要通过dpctl手动添加流表项,实现转发。
手动添加流表项:
zss@ubuntu:
~$dpctladd-flowtcp:
127.0.0.1:
6634in_port=1,actions=output:
2
zss@ubuntu:
~$dpctladd-flowtcp:
127.0.0.1:
6634in_port=2,actions=output:
1
此时查看流表可以看到新的转发信息,同时可以在h1和h2之间可以相互连通。
zss@ubuntu:
~$dpctldump-flowstcp:
127.0.0.1:
6634
stats_reply(xid=0xd697e96b):
flags=nonetype=1(flow)
cookie=0,duration_sec=43s,duration_nsec=395000000s,table_id=0,priority=32768,n_packets=0,n_bytes=0,idle_timeout=60,hard_timeout=0,in_port=1,actions=output:
2
cookie=0,duration_sec=15s,duration_nsec=321000000s,table_id=0,priority=32768,n_packets=0,