打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
《OpenDaylight》第三章:虚拟客户边界

编者按


《OpenDaylight Coolbook》这本书由云技术社区志愿者翻译组翻译,因为没有出版纸质书的计划,本书的翻译只会翻译重点章节。


翻译的过程是译者和作者思想沟通的过程,也是一个学习的过程,中间充满艰辛,也充满快乐,欢迎大家加入云技术社区翻译小组,一起交流、学习、提高,加入请联系群主(群主微信:xiaolikvm,群穿越使者北极熊微信:hadxiaer),也欢迎大家推荐好的英文技术资料到云技术社区,由社区会组织翻译,一起共同学习。


云技术越来越成熟,但是云计算网络技术目前有好几个流派,OpenDaylight就是其中之一,《OpenDaylight Coolbook》侧重概念及实战,阅读本书可以快读了解OpenDaylight。


以下社区优秀翻译参加了本书的翻译:

云技术社区 金牌翻译 韩卫    第一章

云技术社区 金牌翻译 邓嘉浩  第三章

云技术社区 金牌翻译 路君    第四章

云技术社区 金牌翻译 刘志红  第五章

云技术社区 金牌翻译 罗晶    第六章

云技术社区 金牌翻译 罗莹    第九章

云技术社区 金牌翻译 孟驰    第十章

云技术社区 金牌翻译 文杰    第十一章


校对

云技术社区 金牌翻译 陈海  第一,三,四章

云技术社区 金牌翻译 陈建永 第五,六,九章

云技术社区 金牌翻译 黄继敏 第十,十一章  


在此感谢他们辛苦而卓越的付出!



已经发布章节链接:

《OpenDaylight Cookbook》第一章:OpenDaylight原理(上)

《OpenDaylight》第一章:OpenDaylight原理(中)

《OpenDaylight》第一章:OpenDaylight原理(下)


第三章 虚拟客户边界


在此章节,我们将讲述以下内容:


 利用UNI对端到端的广域网(E2E WAN)连接进行管理

通过MPLS VPN连接多个网络

使用USC安全通道与设备工作

物联网协议

 控制cable modem终端系统


介绍


虚拟客户边界是一种网络实体端点间互连能力,并通过允许的接入策略规则在网内集成这些端点。虚拟客户边界还可以虚拟化那些端点并带来更接近核心平台的功能。通过虚拟化vCPE(客户产权设备,Customer-Premises Equipment),你可根据需要动态添加和运行新设备。


注意:REST APIs 使用 user =admin,and password = admin


利用UNI对端到端的广域网连接进行管理


项目UniMgr能够提供对物理、虚拟组件的配置和连接服务,特别是由MEF(城域以太网论坛,Metro Ethernet Forum)定义的Carrier Etherne(电信级以太网)服务。目前该项目支持在通过两个端点间建立GRE隧道的方式来连接两台虚拟交换机。当前的路线图也允许为NETCONF设备创建连接。


预备条件


此章内容需要两台虚拟交换机。如果没有,你可通过安装OvS来使用Mininet-vm。你可从此处下载:https://github.com/mininer/mininet/wiki/Mininet-VM-Images。任何版本都可使用。


在接下来的章节中会使用两个Mninet-VM版本分别是OvS 2.3.1和OvS 2.4.0。


操作指南


1.通过karaf脚本启动OpenDaylight。使用脚本将进入Karaf命令行:

$ ./bin/karaf

2.安装 user-facing特性,用于拉起所有需要连接OpenFlow交换机的依赖条件:

opendaylight-user@root>feature:install odl-unimgr-ui

这大概会花少许时间去完成安装。

3.使用passive或active模式接OvS实例到OpenDaylight:

· 通过账号密码登录mininet-vm:

o 账号:mininet

o 密码:mininet

· 使用active模式连接OvS:

$sudo ovs-vsctl set-manager

tcp:${CONTROLLER_IP}:6640

${CONTROLLER_IP} 是运行OpenDaylight的主机IP地址

· 现在我们的虚拟交换机已经连接到OpenDaylight

mininet@mininet-vm:~$ sudo ovs-vsctl show

0b8ed0aa-67ac-4405-af13-70249a7e8a96

Manager 'tcp:192.168.0.115:6640'

is_connected: true

ovs_version:'2.4.0'

4.创建第一个UNI(User Network Interface,用户网络接口)

你将需要设备的IP地址和MAC地址,可使用ifconfig命令从Mininet VM获取。


UNI创建是一个对controller的REST调用;确保替换正确的${DEVICE_IP}。配置请求如下:

l type: PUT

l headers: Authorization: Basic YWRtaW46YWRtaW4=

l url:

http://localhost:8181/restconf/config/network-topology:network-topology/topology/unimgr:uni/node/uni:%2F%2F${DEVICE_IP}

l payload:

{

'network-topology:node': [

{

'node-id': 'uni://${DEVICE_IP}',

'speed': {

'speed-10M': 1

},

'uni:mac-layer': 'IEEE 802.3-2005',

'uni:physical-medium': 'UNI TypeFull

Duplex 2 Physical Interface',

'uni:mtu-size': 0,

'uni:type': '',

'uni:mac-address':

'${DEVICE_MAC_ADDRESS}',

'uni:ip-address': '${DEVICE_IP}',

'uni:mode': 'Full Duplex'

} ]

}

你将得到正确的状态码:200 OK。

5.对第二个设备进行之前步骤中相同的操作。

UNI创建会导致在虚拟交换机上创建internal类型的ovsbr0网桥

6.创建EVC(Ethernet Virtual Connection,虚拟以太网连接)

到目前为止,EVC是基于3层来创建,于是你需要两个连接端点的IP地址(上步骤创建的两个UNI)

做为一个Integer,你必须定义一个${EVC_ID},确保替换争取的${DEVICE_1_IP}。创建EVC的请求如下:

l type: PUT

l headers: Authorization: Basic YWRtaW46YWRtaW4=

l url:

http://localhost:8181/restconf/config/network-topology:network-topology/topology/unimgr:evc/link/evc:%2F%2F${EVC_ID}

l payload:

{

'link':[ {

'link-id':'evc://${EVC_ID}',

'source':{

'source-node':'/network-topology/topology/node/uni://${DEVICE_1_IP}'

},

'destination':{

'dest-node':'/network-topology/topology/node/

uni://${DEVICE_2_IP}'

},

'cl-unimgr-mef:uni-source':[

{

'order':'0',

'ip-address':'${DEVICE_1_IP}'

} ],

'cl-unimgr-mef:uni-dest':[

{

'order':'0',

'ip-address':'${DEVICE_2_IP}'

} ],

'cl-unimgr-mef:cos-id':'string',

'cl-unimgr-mef:ingress-bw':{

'speed-10G':{ }

},

'cl-unimgr-mef:egress-bw':{

'speed-10G':{ }

}

} ]

}

你将得到正确的状态码:200 OK。

7.查看我们交换机上的拓扑结构:

l 第一个设备:

mininet@mininet-vm:~$ sudo ovs-vsctl show

1077578e-f495-46a1-a96b-441223e7cc22

Manager 'tcp:192.168.0.115:6640'

is_connected: true

Bridge 'ovsbr0'

Port 'eth1'

Interface 'eth1'

Port 'gre1'

Interface 'gre1'

type: gre

options:

{remote_ip='192.168.0.118'}

Port 'ovsbr0'

Interface 'ovsbr0'

type: internal

ovs_version: '2.3.1'

l 第二个设备:

mininet@mininet-vm:~$ sudo ovs-vsctl show

0b8ed0aa-67ac-4405-af13-70249a7e8a96

Manager 'tcp:192.168.0.115:6640'

is_connected: true

Bridge 'ovsbr0'

Port 'ovsbr0'

Interface 'ovsbr0'

type: internal

Port 'eth1'

Interface 'eth1'

Port 'gre1'

Interface 'gre1'

type: gre

options:

{remote_ip='192.168.0.117'}

ovs_version: '2.4.0'

在已创建的网桥ovsbr0下,我们看到的re1是所创建的GRE隧道的端点,IP地址就是remote_ip的值。 eth1端口是物理设备端口。

8.测试我们创建的端到端的连接。

选择一个mininet VM并且ping另外一个。
工作原理


UniMgr是利用OVSDB,通过OpenFlowPlugin使符合OpenFlow协议的交换机通信。OVSDB提供OpenVSwitch数据库,可让你创建端口、接口、配置服务质量(QoS)。当odl-unimgr-ui安装后,一个listener将连接监听端口6640。当一个连接进来,它会通过OpenFlowJava库创建通信管道,并初始化OvS数据库。创建UNI导致一个OVSDB节点和UNI定义的联合,它创建一个网桥和内部端口给内部通信使用。然后,当创建一个EVC时,它会在之前创建的网桥下创建2个新的端口,一个用于GRE隧道,另外一个用于连接设备。


通过MPLS VPN连接多个网络


为了完成此章节,我们将使用Network Intent Composition和VpnService两个项目。


用例范围是在一个单独的MPLS域中提供客户现场的MPLS VPN连接功能。MPLS标签用于隔离站点之间的堵塞。


PE(Provider Edge,边缘路由器提供商)和P路由器(Provider路由器提供商)由ODL管理。为了创建一个客户现场的端到端VPN连接,ODL应该提供MPLS功能,使在两站点之间分别利用PE和P形成最短的路由。

此外,通过给Intent组件添加约束属性来达到保护和容错机制,我们能确保端到端的连接,减少转发设备的连接失败的风险,不管是单点连接或端口down事件引起的。


l 保护性约束: 要求提供冗余通道来保护端到端的连接。

l 容错性约束: 指定容错实现的类型。

l slow-reroute:使用例如像Suurballe不相交的通道计算法则去提供可选择的端到端路由。

l fast-reroute: 通过OF组表特性(future work)在硬件转发设备使用失败探测的特性。


当用户没有请求任何约束,我们默认提供Dijkstra最短通道来进行端到端的路由。


预备条件


此章节要求一台虚拟交换机。如果没有,你可通过安装OvS来使用Mininet-vm。你可从此处下载:https://github.com/mininer/mininet/wiki/Mininet-VM-Images。任何版本都可使用。

接下来的内容会用OvS 2.3.1版本的Mininet-VM展示。


操作指南


1. 使用karaf脚本启动OpenDaylight。进入Karaf命令行:

$ ./bin/karaf

2. 安装界面友好的用户操作UI组件,使用该组件以配置所有需要Yang UI的依赖条件:

opendaylight-user@root>feature:install odl-vpnservice-intent

这应该花少量时间完成安装。

3.在mininet-VM中创建拓扑:

· 登录mininet-vm:

o 账号:mininet

o 密码:mininet

· 创建客户拓扑

拓扑脚本内容:

$ wget -O shortest_path.py https://gist.githubusercontent.com /adetalhouet/shortest_path.py

$ sudo mn -- controller=remote,ip=${CONTROLLER_IP} -- custom

~/shortest_path.py --topo shortest_path – switch ovsk,protocols=OpenFlow13

${CONTROLLER_IP} 是运行OpenDaylight的主机IP地址。

拓扑如下,其中openflow:1 和openflow:3 是PE交换机,openflow42/43/44是P交换机。在两个PE交换机之间有两个不相交的通道:

4. 创建满足约束(slow-reroute或fast-reroute)的VPN。此次案例使用slow-reroute

· type: POST

· headers: Authorization: Basic YWRtaW46YWRtaW4=

· url:

http://localhost:8181/restconf/operations/vpnintent:vpn

s/

· payload:

{ 'vpn-intents': [ {

'vpn-name': 'VPN #1'

'path-protection': 'true',

'failover-type': 'slow-reroute' } ]

}


5.在VPN中添加第一个成员

· type: POST

· headers: Authorization: Basic YWRtaW46YWRtaW4=

· url:

http://localhost:8181/restconf/operations/vpnintent:add

-vpn-endpoint

· payload:

'input': {

'vpn-name': 'VPN #1',

'site-name': 'site1',

'ip-prefix': '10.0.0.1/32',

'switch-port-id': 'openflow:1:1'

}

6.在VPN中添加第二个成员:

· type: POST

· headers: Authorization: Basic YWRtaW46YWRtaW4=

· url:

http://localhost:8181/restconf/operations/vpnintent:add

-vpn-endpoint

· payload:

'input': {

'vpn-name': 'VPN #1',

'site-name': 'site2',

'ip-prefix': '10.0.0.3/32',

'switch-port-id': 'openflow:3:1'

}

7. 查看OpenDaylight数据存储的当前配置:

· type: GET

· headers: Authorization: Basic YWRtaW46YWRtaW4=

· url:

http://localhost:8181/restconf/config/vpnintent:vpns/

· Result:

<>

xmlns='urn:opendaylight:params:xml:ns

:yang:vpnintent'>

VPN #1

fast-reroute

type>

true

site1

10.0.0.1/32

openflow:1:1

site3

10.0.0.3/32

openflow:3:1

8.查看安装在OvS实例中的流量:

mininet@mininet-vm:~$ sudo ovs-ofctl -O OpenFlow13

dump-flows s1

OFPST_FLOW reply (OF1.3) (xid=0x2):

cookie=0x2, duration=96.839s, table=0,

n_packets=0, n_bytes=0,

priority=10000,arp actions=CONTROLLER:65535,NORMAL

cookie=0x2, duration=96.827s, table=0,

n_packets=20,

n_bytes=1700, priority=9500,

dl_type=0x88cc actions=CONTROLLER:65535

cookie=0x0, duration=7.739s, table=0, n_packets=0,

n_bytes=0,

priority=9000,ip,nw_src=10.0.0.1,nw_dst=10.0.0.3

actions=push_mpls:0x8847,set_field:494630-

>mpls_label,output:2

cookie=0x0, duration=7.724s, table=0, n_packets=0,

n_bytes=0,

priority=9000,mpls,mpls_label=337082,mpls_bos=1

actions=pop_mpls:0x0800,output:1

mininet@mininet-vm:~$ sudo ovs-ofctl -O OpenFlow13

dump-flows s2a

OFPST_FLOW reply (OF1.3) (xid=0x2):cookie=0x3,

duration=95.968s, table=0, n_packets=0, n_bytes=0,

priority=10000,arp actions=CONTROLLER:65535,NORMAL

cookie=0x3, duration=89.545s, table=0,

n_packets=37,

n_bytes=3145, priority=9500,dl_type=0x88cc

actions=CONTROLLER:65535 cookie=0x0,

duration=7.747s,

table=0, n_packets=0, n_bytes=0,

priority=9000,mpls,mpls_label=494630,mpls_bos=1

actions=output:3 cookie=0x0, duration=7.736s,

table=0,

n_packets=0, n_bytes=0,

priority=9000,mpls,mpls_label=337082,

mpls_bos=1 actions=output:2

mininet@mininet-vm:~$ sudo ovs-ofctl -O OpenFlow13

dump-flows s3

OFPST_FLOW reply (OF1.3) (xid=0x2): cookie=0x1,

duration=97.781s, table=0, n_packets=0, n_bytes=0,

priority=10000,arp actions=CONTROLLER:65535,NORMAL

cookie=0x1, duration=97.778s, table=0,

n_packets=20,

n_bytes=1700, priority=9500,dl_type=0x88cc

actions=CONTROLLER:65535 cookie=0x0,

duration=7.747s,

table=0, n_packets=0, n_bytes=0,

priority=9000,mpls,mpls_label=494630,mpls_bos=1

actions=pop_mpls:0x0800,output:1 cookie=0x0,

duration=7.746s, table=0, n_packets=0, n_bytes=0,

priority=9000,ip,nw_src=10.0.0.3,nw_dst=10.0.0.1

actions=push_mpls:0x8847,set_field:337082-

>mpls_label,output:2

注意:最短通道选择了s1-s2a-s3

9. 现在通过移除交换机s2a来测试通道容错:

mininet@mininet-vm:~$ sudo ovs-vsctl del-br s2a

mininet@mininet-vm:~$ sudo ovs-ofctl -O OpenFlow13

dump-flows s1

OFPST_FLOW reply (OF1.3) (xid=0x2):cookie=0x2,

duration=96.839s, table=0, n_packets=0, n_bytes=0,

priority=10000,arp actions=CONTROLLER:65535,NORMAL

cookie=0x2, duration=96.827s, table=0,

n_packets=20,

n_bytes=1700, priority=9500,dl_type=0x88cc

actions=CONTROLLER:65535

cookie=0x0, duration=7.739s, table=0, n_packets=0,

n_bytes=0,

priority=9000,ip,nw_src=10.0.0.1,nw_dst=10.0.0.3

actions=push_mpls:0x8847,set_field:494630-

>mpls_label,output:2

cookie=0x0, duration=7.724s, table=0, n_packets=0,

n_bytes=0,

priority=9000,mpls,mpls_label=337082,mpls_bos=1

actions=pop_mpls:0x0800,output:1

mininet@mininet-vm:~$ sudo ovs-ofctl -O OpenFlow13

dump-flows s2a

ovs-ofctl: s2a is not a bridge or a socket

mininet@mininet-vm:~$ sudo ovs-ofctl -O OpenFlow13

dump-flows s2b

OFPST_FLOW reply (OF1.3) (xid=0x2):cookie=0x3,

duration=95.968s, table=0, n_packets=0, n_bytes=0,

priority=10000,arp actions=CONTROLLER:65535,NORMAL

cookie=0x3, duration=89.545s, table=0,

n_packets=37,

n_bytes=3145, priority=9500,

dl_type=0x88cc actions=CONTROLLER:65535

cookie=0x0, duration=7.747s, table=0, n_packets=0,

n_bytes=0,

priority=9000,mpls,mpls_label=494630,

mpls_bos=1 actions=output:3

cookie=0x0, duration=7.736s, table=0, n_packets=0,

n_bytes=0,

priority=9000,mpls,mpls_label=337082,

mpls_bos=1 actions=output:2

mininet@mininet-vm:~$ sudo ovs-ofctl -O OpenFlow13

dump-flows s2c

OFPST_FLOW reply (OF1.3) (xid=0x2):cookie=0x3,

duration=95.968s, table=0, n_packets=0, n_bytes=0,

priority=10000,arp actions=CONTROLLER:65535,NORMAL

cookie=0x3, duration=89.545s, table=0,

n_packets=37,

n_bytes=3145, priority=9500,

dl_type=0x88cc actions=CONTROLLER:65535

cookie=0x0, duration=7.747s, table=0, n_packets=0,

n_bytes=0,

priority=9000,mpls,mpls_label=494630,

mpls_bos=1 actions=output:3

cookie=0x0, duration=7.736s, table=0, n_packets=0,

n_bytes=0,

priority=9000,mpls,mpls_label=337082,

mpls_bos=1 actions=output:2

mininet@mininet-vm:~$ sudo ovs-ofctl -O

OpenFlow13 dump-flows s3

OFPST_FLOW reply (OF1.3) (xid=0x2):

cookie=0x1, duration=97.781s, table=0,

n_packets=0,

n_bytes=0, priority=10000,arp

actions=CONTROLLER:65535,NORMAL

cookie=0x1, duration=97.778s, table=0,

n_packets=20,

n_bytes=1700, priority=9500,

dl_type=0x88cc actions=CONTROLLER:65535

cookie=0x0, duration=7.747s, table=0, n_packets=0,

n_bytes=0,

priority=9000,mpls,mpls_label=494630,mpls_bos=1

actions=pop_mpls:0x0800,output:1

cookie=0x0, duration=7.746s, table=0, n_packets=0,

n_bytes=0,

priority=9000,ip,nw_src=10.0.0.3,nw_dst=10.0.0.1

actions=push_mpls:0x8847,set_field:337082-

>mpls_label,output:2

注意接下来的数据流向交换机s2b和s2c

工作原理


VPN服务项目用于提供REST层去创建VPN,进行MPLS标签管理,维护全局MPLS VPN状态信息。


VPN规则本身将通过Intent设备实现,通过采用MPLS-capable intent请求端点之间正常的隔离方式于是,VPN服务有一个依赖于NIC(Network Intent Composition)的项目。


NIC用于管理基于端点的新MPLS,根据请求信息等级创建一个在使用MPLS Intent创建VPN时建立CE设备之间的连接。


端点就有了必需的MPLS信息;借助于端点类型的信息,也可映射标签。


使用USC安全通道与设备工作


USC(统一安全通道,Unified Secure Channel)是一个OpenDaylight项目,为了给在Wide Area Networks(广域网)内的SDN控制节点和网络组件之间提供安全和高性能通信通道。最近我们能看到新的增长的组件类型列表,如企业网络、云基础设施、物联网设备、网络设备(NETCONF、OpenFlow等等)。USC提供通信通道的集中管理,能够创建和移除管道。最后,它使用一个给定通道来完成读写信息的统计。

项目结构包含USC插件,负责控制节点和网络组件之间的通信,支持TLS和DTLS协议。


它还负责维护inbound和outbound通道间动态连接。USC manager提供高可用、集群、安全和监控USC自己建立的通道。USC UI允许当前建立的通道信息可视化。USC agent,一般运行在网络组件中,是相当于一个代理去维护动态连接,通过提供inbound和outbound通道来与controller通信。


预备条件


此章内容设备要求为USC agent和一台运行USC agent的VM。当然,为了展现USC的基础功能,我们会用echo服务器响应发送给USC agent的报文。


USC项目和USC agent共享证书,为了提供一个安全位置。那些证书加载在:${ODL_ROOT}/etc/usc/certificates

当前的证书是Certificate Authority,一个私钥和client证书。

USC agent、echo服务器和证书能在这里找到:h t t p s : / / g i t h u b . c o m

/ j g o o d y e a r / O p e n D a y l i g h t C o o k b o o k / t r e e / m a s t e r / c h a p t e r 3 / c h a p t e r 3 - r e c i p e 4


操作指南

1.使用karaf脚本启动OpenDaylight karaf版本。Karaf命令行:

$ ./bin/karaf

2.安装界面友好的用户操作UI组件,使用它配置连接NETCONF设备的所有依赖条件:

opendaylight-user@root>feature:install odl-usc-channel-ui

这应该花少量时间完成安装。

3.使用TCP会话来启动USC agent和echo服务器

开启两个终端进入VM,然后启动USC agent:

$ java -jar UscAgent.jar -t true

启动echo服务器:

$ java -jar EchoServer.jar -t true -p 2007

4.使用以下请求创建通道,你需要VM的IP地址 ${VM_IP_ADDRESS}

· type: POST

· headers: Authorization: Basic YWRtaW46YWRtaW4=

· url:

http://localhost:8181/restconf/operations/usc-channel:a

dd-channel

· payload:

{

'input':{

'channel':{

'hostname':'${VM_IP_ADDRESS}',

'port':2007,

'remote':false,

'tcp':true

}

}

}

如果请求运行正常,你会获得以下的输出:

{

'output': {

'result': 'Succeed to

connect device(${VM_IP_ADDRESS}:2007)!'

}

}

5.使用REST调用或OpenDaylight DLUX组件去查看创建的通道:

· REST调用:所有写进USC插件的信息会位于拓扑usc下,以下是拓扑上下文内容:

· type: POST

· headers: Authorization: Basic YWRtaW46YWRtaW4=

· url:

http://localhost:8181/restconf/operations/us

c-channel:view-channel

· payload:

{

'input':{

'topology-id':'usc'

}

}

在其他信息中,这会返回一个包含通道信息的有效负载,例如它的ID、运行OpenDaylight的主机名(inocybe.local)、VM的IP地址(192.168.2.26)和建立会话(TLS)的协议类型三部分组成。它还包含对会话赋权的数据;以下是第一个被创建的会话,还没有读写操作。

'channel': [ {

'channel-id':

'Controller:inocybe.local-Device:192.168.2.26-

type:TLS',

'channel-type': 'TLS',

'session': [ {

'session-id': '1',

'bytes-in': 0,

'bytes-out': 0,

'termination-point': {

'termination-point-id': '2007'

},

} ],

'destination': {

'dest-node': '192.168.2.26'

}

} ]

· 导航到http://localhost:8181/index.html

使用admin/admin登录。在右边,点击USC标签:

6.使用通道发送一条信息。将得到其中一个运行USC agent的VM IP和正在运行的echo服务器的端口(不管是否使用TCP),报文如下:

· type: POST

· headers: Authorization: Basic YWRtaW46YWRtaW4=

· url:

http://localhost:8181/restconf/operations/usc-channel:s

end-message

· payload:

{

'input':{

'channel':{

'hostname':'192.168.2.26',

'port':'2007',

'tcp':'true',

'content':'This is a test message.'

}

}

}

这个请求能返回一条被告知正在工作的报文。因为使用echo服务器,所以返回的信息会跟发送的相似。在你的设备上,你能定义返回的格式,并能收到该格式的信息。

{

'output': {

'result': 'Succeed to send request

to device(192.168.2.26:2007),

content is This is a test message.'

}

}

7.再次查看通道信息,我们能看到输入输出的数量已经增加。执行与第5步同样的处理。


以下是当前通道输出的会话1。它显示了字节数在增长、每个会话的字节数、整个通道信息。

'channel': [ {

'channel-id': 'Controller:inocybe.local-Device:

192.168.2.26-type:TLS',

'source': {

'source-node': 'inocybe.local'

},

'sessions': 1,

'channel-type': 'TLS',

'call-home': '',

'channel-alarms': 0,

'session': [ {

'session-id': '1',

'bytes-in': 23,

'termination-point': {

'termination-point-id': '2007'

},

'session-alarms': 0,

'bytes-out': 23

} ],

'destination': {

'dest-node': '192.168.2.26'

},

'bytes-in': 23,

'bytes-out': 23

} ]

8.移除会话,清理所有统计:

· type: POST

· headers: Authorization: Basic YWRtaW46YWRtaW4=

· url:

http://localhost:8181/restconf/operations/usc-channel:r

emove-channel

· payload:

{

'input':{

'channel':{

'hostname':'192.168.2.26',

'port':'2007',

'tcp':'true'

}

}

}

此请求会返回一个正向信息,告知通道已经成功移除。

{

'output': {

'result': 'Succeed to remove

device(192.168.2.26:2007)!'

}

}

你可以使用第5步发送请求;会看见通道还在,但是会话已移除。


工作原理


当你创建一个通道时,你会使用Netty框架去建立通道管道,USC插件会首先建立一个主机和远程设备之间的会话,然后它在会话中建立inbound 和outbound通道以提供两种通信方式。使用OpenDaylight和USC agent提供的证书建立会话。证书必须相同,否则连接会失败。在这个例子中,我们使用一台echo服务器,用于callback发送的消息,将其内容发回。


这里使用的会话和通道是和USC项目不一样的,事实上USC项目使用相反的术语,所以一个通道是一个会话,一个会话是USC项目的一个通道。


更多


你可以对相同的通道创建多个会话。为此,参考第3步,打开另一个VM的终端界面,并立刻启动echo服务器(不同端口):


$ java -jar EchoServer.jar -t true -p 2008

· 根据步骤4创建一个特定端口的通道

· 发送请求去查看通道,查看第5步发送的请求

· 此时的返回包含两个会话:

'session': [ {

'session-id': '2',

'bytes-in': 0,

'termination-point': {

'termination-point-id': '2008'

},

'session-alarms': 0,

'bytes-out': 0

},

{

'session-id': '1',

'bytes-in': 0,

'termination-point': {

'termination-point-id': '2007'

},

'session-alarms': 0,

'bytes-out': 0

} ]


你可以在每个通道拥有尽可能多的会话。这意味着在相同的主机上运行一堆设备,你可以使用相同的安全通道连接它们任何一个。


物联网协议


IoTDM(IoT Data Management,物联网数据管理)项目都是一系列oneM2M协议的子集。其目的是提供一个通用的machine-to-machine层面,能植入各种各样的设备和软件。它尽可能遵循最新的oneM2M的规格。版本1公开可用:h t t p : / / w w w . o n e m 2 m . o r g / t e c h n i c a l / p u b l is h e d - d o c u m e n t s .


OpenDaylight IoTDM 项目提供以数据为中心的中间件来作为一个oneM2M的代理。它能使授权应用进入任何设备并从中获取已上传的数据。其以数据为中心的架构原理是提供一个单独版本的全局数据空间,用于应用市场、优化网络堵塞和应用处理,如从物联网域增删设备。


IoTDM项目有能力与传感器、物联网管理系统和数据消费者等这些数据来源交涉。它支持CoAP, MQTT和HTTP southbound协议。项目允许在给定的资源集上创建、恢复、更新、删除和提醒等操作,它可以是CSEBase、AE、容器、内容实例、订阅、接入控制策略、节点等等。随着项目的发展会支持更多的资源。


预备条件


此章内容要求OpenDaylight编置IoTDM服务,还需要一个REST Client。建议下载和使用Postman: h t t p s : / / w w w . g e t p o s t m a n . c o m / 如果你还没准备好,它是一个方便导入已定义REST APIs的collection和负载的工具。


我们将会在此章节使用Postman的collection :h t t p s : / / w w w . g e t p o s t m an . c o m / c o l l e c t i o n s / f 2 a 7 e 7 2 3 e e 6 d a 4 4 7 1 5 e 9


操作指南


1.使用karaf脚本启动OpenDaylight karaf版本。使用脚本将进入Karaf命令行:

$ ./bin/karaf

2.安装界面友好的用户操作UI组件,使用它配置所有需要LACP功能的依赖:

opendaylight-user@root>feature:install odl-iotdm-onem2m

这需要花少量时间完成安装。

3.启动你的Postman client和输入上述连接的collection,然后遵循以下步骤:

1) 在Postman窗口最上方点击“Import”。

2) 在弹出窗口选择从“Import from Link”。

3) 粘贴h t t p s : / / w w w . g e t p o s t m a n . c o m / c o l l e c t i o n s / f 2 a 7 e 7 2 3 e e 6 d a 4 4 7 1 5 e 9

4) 点击“Import”。画面显示:collection 已导入,现在从工具栏获取使用:

5) 点击右上角按钮“Show/Hide sidebar”

6) 点击文件夹 Basic IOTDM CRUD Test。你会得到所有测试应用的REST APIs:

4.提供一个CSE(Common Services Entity,公共服务实体)叫InCSE1

§ type: POST

§ headers: Authorization: Basic YWRtaW46YWRtaW4=

§ url:  http://

localhost:8181/restconf/operations/onem2m:onem2m-cse-

provisioning

§ payload:

{

'input':{

'onem2m-primitive':[ {

'name':'CSE_ID',

'value':'InCSE1'

},

{

'name':'CSE_TYPE',

'value':'IN-CSE'

} ]

}

}

5.AE(Application Entity,应用实体)注册到CSE X-M2M-Origin,代表组合者的请求。X-M2M-RI是Request Identifier组件。

§ type: POST

§ headers: Content-Type:application/vnd.onem2m-res+json;ty=2 X-M2M-

Origin:Test_AE_ID X-M2M-RI:12345

§ url:  http:// localhost:8282/InCSE1

§ payload:

{

'm2m:ae':{

'api':'testAppId', /*Application ID*/

'apn':'testAppName', /*Application

name*/

'rn':'TestAE', /*Resource name*/

'or':'http://ontology/ref', /*On

topology reference*/

'rr':true /*Request reachability*/

}

}

6.向AE发送请求创建名为TestContainer的容器:

§ type: POST

§ headers: Content-Type:application/vnd.onem2m-res+json;ty=3 X-M2M-

Origin://iotsandbox.cisco.com:10000 X-M2M-RI:12345

§ url:  http://localhost:8282/InCSE1

§ payload:

{

'm2m:cnt':{

'rn':'TestContainer' /*Resource name*/

}

}

7. 在TestContainer创建名为Cin2的内容实例:

§ type: POST

§ headers: Content-Type:application/vnd.onem2m-res+json;ty=4 X-M2M-

Origin://iotsandbox.cisco.com:10000 X-M2M-RI:12345

§ url:  http://localhost:8282/InCSE1/TestContainer

§ payload:

{

'cin':{

'con':'CCDS', /*Content/*

'rn':'Cin1' /*Resource name*/

}

}


8. 获取第4步中所有在CSE InCSE1创建的children:

§ type: GET

§ headers:

Content-Type:application/vnd.onem2m-res+json

X-M2M-Origin://iotsandbox.cisco.com:10000

X-M2M-RI:12345

§ url:  http://localhost:8282/InCSE1?fu=1

这会重新获得关于CSE的所有信息,它的封闭类children,如AE,容器和内容实例。它会默认接入控制策略


9. 获取一定数量位于CSE InCSE1的children

§ type: GET

§ headers:

Content-Type:application/vnd.onem2m-res+json

X-M2M-Origin://iotsandbox.cisco.com:10000

X-M2M-RI:12345

§ url:  http://localhost:8282/InCSE1?fu=1&lim=2

这个请求的限制设置成2,在URL中查看参数lim。你能增加或减少此数字去获取所需组件。


10. 创建一个订阅以得到在CSE InCSE1内给定容器的变化通知:

§ type: POST

§ headers:

Content-Type:application/vnd.onem2m-res+json;ty=23

X-M2M-Origin://iotsandbox.cisco.com:10000

X-M2M-RI:12345

§ url:  http://localhost:8282/InCSE1/TestContainer


工作原理


IoTDM项目提供和实现RPCs,使oneM2M资源的子集发生相互作用。一个RPC是一个Remote Procedure Call(远程程序调用),目的是通过处理同步方式提供比调用REST更少的延迟。对于每个RPC,其关联的实现对应于一个定义预期行为的回调函数。IoTDM项目定义oneM2M资源为models,然后提供一个OpenDaylight中的MD-SAL架构的树。当一个资源被修改,一个notifier会产生一个oneM2M提醒给订阅者。这个过程使用一个公开订阅类型机制。最后,IoTDM项目实现3个southbound协议,分别是Constrained Application Protocol (应用约束协议,CoAP – RFC-7252),MQTT(MQ Telemetry Transport,遥测传输MQ)和此章节所用的HTTP协议。


控制cable modem终端系统


OpenDaylight的PCMM(PacketCable MultiMedia,PacketCable 多媒体)项目是一个接口,能让你控制和管理CMTS(Cable Modem Termination System,缆线调制解调器终端系统)中网络组件的设备流量。服务流量通过DOCSIS(Data Over Cable Service Interface Specification)的标准,来提供一个在CMTS和CM(Cable Modem,线缆调制解调器)之间的一个DQoS(Dynamic Quality of Service,动态质量服务)。项目由一台策略服务器、一台应用manager、CMTS和CM组成。策略服务器负责分配网络资源给每个订阅者和应用,应用manager负责指定每个应用的QoS要求给策略服务器,CMTS负责执行基于带宽容量的策略,CM负责与客户端(cable system)网络连接。


预备条件


此章节将只需要一台CTMS设备。如果你没有,可以使用PCCM项目中提供的CMTS模拟器。


在此章节我们将使用此模拟器。对于那些不需要的可以直接跳到下一节的第4步。


我们之前介绍过Postman工具和Postman collection。在此章节,我们同样使用一个Postman collection: h t t p s : / / w w w . g e t p o s t m a n . c o m / c o l l e c t i o n s / e 5 8 c c a 4 4 4 4 8 8

d d 9 0 7 5 3 b 提供所有所需APIs。


这个collection 要求一个Postman环境。可以从此处获取:h t t p s : / / g i t h u b .c o m / j g o o d y e a r / O p e n D a y l i g h t C o o k b o o k / b l o b / m a s t e r / c h a p t e r 3 / c h a p t e r 3 - r e c i p e 6 / P C M

M _ S a m p l e _ L o c a l . p o s t m a n _ e n v i r o n m e n t .


Postman可以设置默认值。复制粘贴原始数据到导入部分。然后在右上角,有一个下拉框选择环境,选择“PCMM Sample local”。通过点击右边按钮(像眼睛的按钮),你会看见环境的内容。


操作指南


1.获取packetcable-emulator压缩包

$ git clone --branch release/beryllium-sr2

https://git.opendaylight.org/gerrit/packetcable

$ cd packetcable/packetcable-emulator/

$ mvn assembly:assembly

在目标文件夹将会成为压缩包,其中一个interest以-jar-with-dependencies.jar结尾。

2.创建一个YAML格式的配置文件,并且包含以下值:

CMTS通信端口号

port: 3918

CMTS支持的每个gate最大分类数量

numberOfSupportedClassifiers:4

设置服务类名称:

serviceClassNames:

- direction: UPSTREAM

names:

- extrm_up

- foo_up

- direction: DOWNSTREAM

names:

- extrm_dn

- foo_dn

Cable Modern信息:

cmStatuses:

- host: 10.32.110.180

status: true

- host: 10.32.110.179

status: true

3.使用jar和做以下配置启动模拟器:

$ java -cp packetcable-emulator-1.3.2-Beryllium-

SR2-jar-with-dependencies.jar

org.pcmm.rcd.impl.CMTS {path to yaml}

22:00:02.966 [main] INFO

org.pcmm.concurrent.IWorkerPool - Pool size :32

22:00:02.984 [main] INFO

org.pcmm.rcd.impl.AbstractPCMMServer - Server

started and listening on port :3918

4.使用karaf脚本启动OpenDaylight版本:

$ ./bin/karaf

5.安装界面友好的用户操作UI组件,使用该组件以配置用户身份验证的依赖:

opendaylight-user@root>feature:install odl-packetcable-policy-server

这会花些许时间完成安装。

6.在设置PCMM gate之前,我们需要建立一个OpenDaylight和CTMS/CCAP(Converged Cable Access Platform)之间持久的连接。(从Postman collection添加CCAP1请求)


我们连接其中一个已配置的模拟设备并事先启动(在这里你可使用自己的设备)。需要知道设备的IP地址和端口,及上下游的服务类名。


提示:如果你使用模拟器,就用正在运行的模拟器的主机IP地址。

最后,你必须给URL和payload的新入口定义${ID}。(${ID} 是一个字符串)

§ type: PUT

§ headers:

Authorization: Basic YWRtaW46YWRtaW4=

§ url:

http://localhost:8181/restconf/config/packetcable:ccaps

/ccap/${ID}

§ payload:

{

'ccap': [{

'ccapId': '${ID}',

'amId': {

'am-tag': '0xcada',

'am-type': '1'

},

'connection': {

'ipAddress': '10.32.110.180',

'port': '3918'

},

'subscriber-subnets': [

'10.32.110.1/24'

],

'downstream-scns': [

'extrm_dn'

],

'upstream-scns': [

'extrm_up'

]

}]

}

如果CCAP连接成功,HTTP请求会返回“200 OK”

启动模拟器时会看到很多活动命令行,第一条看到的消息是新连接:

[pool-2-thread-1] INFO

org.pcmm.rcd.impl.AbstractPCMMServer - Accepted a

new connection from :192.168.2.11:49682

一旦连接建立,一个keepalive机制就会启动,保障连接始终是up。

7. 核实刚建立连接的状态。((Operational –Get All CCAPs)


对于这些请求我们将使用操作数据存储中的操作数据。这反映设备的当前状态。

§ type: GET

§ headers:

Authorization: Basic YWRtaW46YWRtaW4=

§ url:

http://localhost:8181/restconf/operational/packetcable:

ccaps/ccap/${ID}

这条请求返回设备的连接信息${ID}=1。我们设备现在是连接的。

{

'ccap': [

{

'ccapId': '1',

'connection': {

'connected': true

}

}

]

}

8. 我们现在创建一个gate。为此我们将提交以下请求:(Gate w/ classifier) 我们给gate使用第一个定义在配置文件的Cable Modem。

你将必须在此条请求定义三个变量:${APPLICATION_CLASSIFIER}, ${SUBSCRIBER_ID} 和${GATE_ID}

§ type: PUT

§ headers:

Authorization: Basic YWRtaW46YWRtaW4=

§ url:

http://localhost:8181//restconf/config/packetcable:qos/

apps/app/${APPLICATION_CLASSIFIER}/subscribers/subscrib

er/${SUBSCRIBER_ID}/gates/gate/${GATE_ID}/

§ payload:

{'gate':

{

'gateId': '${APPLICATION_CLASSIFIER}',

'classifiers': {

'classifier-container': [{

'classifier-id': '1',

'classifier': {

'srcIp': '10.10.10.0',

'dstIp': '10.32.110.178',

'protocol': '0', 'srcPort':

'1234',

'dstPort': '4321',

'tos-byte': '0xa0',

'tos-mask': '0xe0'

}

}]

}, 'gate-spec': {

'dscp-tos-overwrite': '0xa0', 'dscp-

tos-mask': '0xff'

}, 'traffic-profile': {

'service-class-name': 'extrm_up'

}

}

}

请求正常时返回200 OK,你会查看到终端界面一些活动,描述gate已成功处理。

[Thread-0] INFO org.pcmm.rcd.impl.CmtsPepReqStateMan - Returning

SUCCESS

for gate request [extrm_up] direction [Upstream] for host -10.32.110.180


工作原理


项目使用一个DOCSIS抽象层去管理DOCSIS和PCMM具体的属性,通过服务流量的申请存储、变更默认QoS的值。此组件负责增加或删除CTMS设备。它提供具体的

DOCSIS的北向的REST APIs。南向组件允许通过使用COPS(Common Open Policy Service )协议与CMTS通信。它实现PCMM/COPS/PDP功能,定义如下:  h t t p : / / w w w . c a b l e l a b s . c o m / w p -c o n t e n t / u p l o a d s / s p e c d o c s / P K T - S P - M M - I 0 5 - 0 9 1 0 2 9 . p d f


注意:当创建gate,你需要在3种不同类型的分类中选择:标准类型(案例中使用的)、扩展类型,IPv6类型。


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
OpenDaylight学习 ( by quqi99 )
OpenDaylight安装使用
【转】OpenStack网络技术点概述
做最好的服务商美团云的docker探索之路
DockOne技术分享(四十三):基于OVS的Docker多主机互联设计和实践
云数据中心中的挑战
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服