編者按
《OpenDaylight Coolbook》這本書由云技術社區(qū)志愿者翻譯組翻譯,因為沒有出版紙質書的計劃,本書的翻譯只會翻譯重點章節(jié)。
翻譯的過程是譯者和作者思想溝通的過程,也是一個學習的過程,中間充滿艱辛,也充滿快樂,歡迎大家加入云技術社區(qū)翻譯小組,一起交流、學習、提高,加入請聯系群主(群主微信:xiaolikvm,群穿越使者北極熊微信:hadxiaer),也歡迎大家推薦好的英文技術資料到云技術社區(qū),由社區(qū)會組織翻譯,一起共同學習。
云技術越來越成熟,但是云計算網絡技術目前有好幾個流派,OpenDaylight就是其中之一,《OpenDaylight Coolbook》側重概念及實戰(zhàn),閱讀本書可以快讀了解OpenDaylight。
以下社區(qū)優(yōu)秀翻譯參加了本書的翻譯:
云技術社區(qū) 金牌翻譯 韓衛(wèi) 第一章
云技術社區(qū) 金牌翻譯 鄧嘉浩 第三章
云技術社區(qū) 金牌翻譯 路君 第四章
云技術社區(qū) 金牌翻譯 劉志紅 第五章
云技術社區(qū) 金牌翻譯 羅晶 第六章
云技術社區(qū) 金牌翻譯 羅瑩 第九章
云技術社區(qū) 金牌翻譯 孟馳 第十章
云技術社區(qū) 金牌翻譯 文杰 第十一章
校對
云技術社區(qū) 金牌翻譯 陳海 第一,三,四章
云技術社區(qū) 金牌翻譯 陳建永 第五,六,九章
云技術社區(qū) 金牌翻譯 黃繼敏 第十,十一章
在此感謝他們辛苦而卓越的付出!
已經發(fā)布章節(jié)鏈接:
《OpenDaylight Cookbook》第一章:OpenDaylight原理(上)
《OpenDaylight》第一章:OpenDaylight原理(中)
《OpenDaylight》第一章:OpenDaylight原理(下)
第三章 虛擬客戶邊界
在此章節(jié),我們將講述以下內容:
利用UNI對端到端的廣域網(E2E WAN)連接進行管理
通過MPLS VPN連接多個網絡
使用USC安全通道與設備工作
物聯網協議
控制cable modem終端系統
介紹
虛擬客戶邊界是一種網絡實體端點間互連能力,并通過允許的接入策略規(guī)則在網內集成這些端點。虛擬客戶邊界還可以虛擬化那些端點并帶來更接近核心平臺的功能。通過虛擬化vCPE(客戶產權設備,Customer-Premises Equipment),你可根據需要動態(tài)添加和運行新設備。
注意:REST APIs 使用 user =admin,and password = admin
利用UNI對端到端的廣域網連接進行管理
項目UniMgr能夠提供對物理、虛擬組件的配置和連接服務,特別是由MEF(城域以太網論壇,Metro Ethernet Forum)定義的Carrier Etherne(電信級以太網)服務。目前該項目支持在通過兩個端點間建立GRE隧道的方式來連接兩臺虛擬交換機。當前的路線圖也允許為NETCONF設備創(chuàng)建連接。
預備條件
此章內容需要兩臺虛擬交換機。如果沒有,你可通過安裝OvS來使用Mininet-vm。你可從此處下載:https://github.com/mininer/mininet/wiki/Mininet-VM-Images。任何版本都可使用。
在接下來的章節(jié)中會使用兩個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.創(chuàng)建第一個UNI(User Network Interface,用戶網絡接口)
你將需要設備的IP地址和MAC地址,可使用ifconfig命令從Mininet VM獲取。
UNI創(chuàng)建是一個對controller的REST調用;確保替換正確的${DEVICE_IP}。配置請求如下:
l type: PUT
l headers: Authorization: Basic YWRtaW46YWRtaW4=
l url:
https://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"
} ]
}
你將得到正確的狀態(tài)碼:200 OK。
5.對第二個設備進行之前步驟中相同的操作。
UNI創(chuàng)建會導致在虛擬交換機上創(chuàng)建internal類型的ovsbr0網橋
6.創(chuàng)建EVC(Ethernet Virtual Connection,虛擬以太網連接)
到目前為止,EVC是基于3層來創(chuàng)建,于是你需要兩個連接端點的IP地址(上步驟創(chuàng)建的兩個UNI)
做為一個Integer,你必須定義一個${EVC_ID},確保替換爭取的${DEVICE_1_IP}。創(chuàng)建EVC的請求如下:
l type: PUT
l headers: Authorization: Basic YWRtaW46YWRtaW4=
l url:
https://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":{ }
}
} ]
}
你將得到正確的狀態(tài)碼: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"
在已創(chuàng)建的網橋ovsbr0下,我們看到的re1是所創(chuàng)建的GRE隧道的端點,IP地址就是remote_ip的值。 eth1端口是物理設備端口。
8.測試我們創(chuàng)建的端到端的連接。
選擇一個mininet VM并且ping另外一個。
工作原理
UniMgr是利用OVSDB,通過OpenFlowPlugin使符合OpenFlow協議的交換機通信。OVSDB提供OpenVSwitch數據庫,可讓你創(chuàng)建端口、接口、配置服務質量(QoS)。當odl-unimgr-ui安裝后,一個listener將連接監(jiān)聽端口6640。當一個連接進來,它會通過OpenFlowJava庫創(chuàng)建通信管道,并初始化OvS數據庫。創(chuàng)建UNI導致一個OVSDB節(jié)點和UNI定義的聯合,它創(chuàng)建一個網橋和內部端口給內部通信使用。然后,當創(chuàng)建一個EVC時,它會在之前創(chuàng)建的網橋下創(chuàng)建2個新的端口,一個用于GRE隧道,另外一個用于連接設備。
通過MPLS VPN連接多個網絡
為了完成此章節(jié),我們將使用Network Intent Composition和VpnService兩個項目。
用例范圍是在一個單獨的MPLS域中提供客戶現場的MPLS VPN連接功能。MPLS標簽用于隔離站點之間的堵塞。
PE(Provider Edge,邊緣路由器提供商)和P路由器(Provider路由器提供商)由ODL管理。為了創(chuàng)建一個客戶現場的端到端VPN連接,ODL應該提供MPLS功能,使在兩站點之間分別利用PE和P形成最短的路由。
此外,通過給Intent組件添加約束屬性來達到保護和容錯機制,我們能確保端到端的連接,減少轉發(fā)設備的連接失敗的風險,不管是單點連接或端口down事件引起的。
l 保護性約束: 要求提供冗余通道來保護端到端的連接。
l 容錯性約束: 指定容錯實現的類型。
l slow-reroute:使用例如像Suurballe不相交的通道計算法則去提供可選擇的端到端路由。
l fast-reroute: 通過OF組表特性(future work)在硬件轉發(fā)設備使用失敗探測的特性。
當用戶沒有請求任何約束,我們默認提供Dijkstra最短通道來進行端到端的路由。
預備條件
此章節(jié)要求一臺虛擬交換機。如果沒有,你可通過安裝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中創(chuàng)建拓撲:
· 登錄mininet-vm:
o 賬號:mininet
o 密碼:mininet
· 創(chuàng)建客戶拓撲
拓撲腳本內容:
$ 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. 創(chuàng)建滿足約束(slow-reroute或fast-reroute)的VPN。此次案例使用slow-reroute
· type: POST
· headers: Authorization: Basic YWRtaW46YWRtaW4=
· url:
https://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:
https://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:
https://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:
https://localhost:8181/restconf/config/vpnintent:vpns/
· Result:
<vpns
xmlns="urn:opendaylight:params:xml:ns
:yang:vpnintent">
<vpn-intents>
<vpn-name>VPN #1</vpn-name>
<failover-type>fast-reroute</failover-
type>
<path-protection>true</path-protection>
<endpoint>
<site-name>site1</site-name>
<ip-prefix>10.0.0.1/32</ip-prefix>
<switch-port-id>openflow:1:1
</switch-port-id>
</endpoint>
<endpoint>
<site-name>site3</site-name>
<ip-prefix>10.0.0.3/32</ip-prefix>
<switch-port-id>openflow:3:1
</switch-port-id>
</endpoint>
</vpn-intents>
</vpns>
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層去創(chuàng)建VPN,進行MPLS標簽管理,維護全局MPLS VPN狀態(tài)信息。
VPN規(guī)則本身將通過Intent設備實現,通過采用MPLS-capable intent請求端點之間正常的隔離方式。于是,VPN服務有一個依賴于NIC(Network Intent Composition)的項目。
NIC用于管理基于端點的新MPLS,根據請求信息等級創(chuàng)建一個在使用MPLS Intent創(chuàng)建VPN時建立CE設備之間的連接。
端點就有了必需的MPLS信息;借助于端點類型的信息,也可映射標簽。
使用USC安全通道與設備工作
USC(統一安全通道,Unified Secure Channel)是一個OpenDaylight項目,為了給在Wide Area Networks(廣域網)內的SDN控制節(jié)點和網絡組件之間提供安全和高性能通信通道。最近我們能看到新的增長的組件類型列表,如企業(yè)網絡、云基礎設施、物聯網設備、網絡設備(NETCONF、OpenFlow等等)。USC提供通信通道的集中管理,能夠創(chuàng)建和移除管道。最后,它使用一個給定通道來完成讀寫信息的統計。
項目結構包含USC插件,負責控制節(jié)點和網絡組件之間的通信,支持TLS和DTLS協議。
它還負責維護inbound和outbound通道間動態(tài)連接。USC manager提供高可用、集群、安全和監(jiān)控USC自己建立的通道。USC UI允許當前建立的通道信息可視化。USC agent,一般運行在網絡組件中,是相當于一個代理去維護動態(tài)連接,通過提供inbound和outbound通道來與controller通信。
預備條件
此章內容設備要求為USC agent和一臺運行USC agent的VM。當然,為了展現USC的基礎功能,我們會用echo服務器響應發(fā)送給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.使用以下請求創(chuàng)建通道,你需要VM的IP地址 ${VM_IP_ADDRESS}
· type: POST
· headers: Authorization: Basic YWRtaW46YWRtaW4=
· url:
https://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組件去查看創(chuàng)建的通道:
· REST調用:所有寫進USC插件的信息會位于拓撲usc下,以下是拓撲上下文內容:
· type: POST
· headers: Authorization: Basic YWRtaW46YWRtaW4=
· url:
https://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)的協議類型三部分組成。它還包含對會話賦權的數據;以下是第一個被創(chuàng)建的會話,還沒有讀寫操作。
"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"
}
} ]
· 導航到https://localhost:8181/index.html
使用admin/admin登錄。在右邊,點擊USC標簽:
6.使用通道發(fā)送一條信息。將得到其中一個運行USC agent的VM IP和正在運行的echo服務器的端口(不管是否使用TCP),報文如下:
· type: POST
· headers: Authorization: Basic YWRtaW46YWRtaW4=
· url:
https://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服務器,所以返回的信息會跟發(fā)送的相似。在你的設備上,你能定義返回的格式,并能收到該格式的信息。
{
"output": {
"result": "Succeed to send request
to device(192.168.2.26:2007),
content is This is a test message."
}
}
7.再次查看通道信息,我們能看到輸入輸出的數量已經增加。執(zhí)行與第5步同樣的處理。
以下是當前通道輸出的會話1。它顯示了字節(jié)數在增長、每個會話的字節(jié)數、整個通道信息。
"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:
https://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步發(fā)送請求;會看見通道還在,但是會話已移除。
工作原理
當你創(chuàng)建一個通道時,你會使用Netty框架去建立通道管道,USC插件會首先建立一個主機和遠程設備之間的會話,然后它在會話中建立inbound 和outbound通道以提供兩種通信方式。使用OpenDaylight和USC agent提供的證書建立會話。證書必須相同,否則連接會失敗。在這個例子中,我們使用一臺echo服務器,用于callback發(fā)送的消息,將其內容發(fā)回。
這里使用的會話和通道是和USC項目不一樣的,事實上USC項目使用相反的術語,所以一個通道是一個會話,一個會話是USC項目的一個通道。
更多
你可以對相同的通道創(chuàng)建多個會話。為此,參考第3步,打開另一個VM的終端界面,并立刻啟動echo服務器(不同端口):
$ java -jar EchoServer.jar -t true -p 2008
· 根據步驟4創(chuàng)建一個特定端口的通道
· 發(fā)送請求去查看通道,查看第5步發(fā)送的請求
· 此時的返回包含兩個會話:
"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的規(guī)格。版本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的代理。它能使授權應用進入任何設備并從中獲取已上傳的數據。其以數據為中心的架構原理是提供一個單獨版本的全局數據空間,用于應用市場、優(yōu)化網絡堵塞和應用處理,如從物聯網域增刪設備。
IoTDM項目有能力與傳感器、物聯網管理系統和數據消費者等這些數據來源交涉。它支持CoAP, MQTT和HTTP southbound協議。項目允許在給定的資源集上創(chuàng)建、恢復、更新、刪除和提醒等操作,它可以是CSEBase、AE、容器、內容實例、訂閱、接入控制策略、節(jié)點等等。隨著項目的發(fā)展會支持更多的資源。
預備條件
此章內容要求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和負載的工具。
我們將會在此章節(jié)使用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,然后遵循以下步驟:
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: https://
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: https:// localhost:8282/InCSE1
§ payload:
{
"m2m:ae":{
"api":"testAppId", /*Application ID*/
"apn":"testAppName", /*Application
name*/
"rn":"TestAE", /*Resource name*/
"or":"https://ontology/ref", /*On
topology reference*/
"rr":true /*Request reachability*/
}
}
6.向AE發(fā)送請求創(chuàng)建名為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: https://localhost:8282/InCSE1
§ payload:
{
"m2m:cnt":{
"rn":"TestContainer" /*Resource name*/
}
}
7. 在TestContainer創(chuàng)建名為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: https://localhost:8282/InCSE1/TestContainer
§ payload:
{
"cin":{
"con":"CCDS", /*Content/*
"rn":"Cin1" /*Resource name*/
}
}
8. 獲取第4步中所有在CSE InCSE1創(chuàng)建的children:
§ type: GET
§ headers:
Content-Type:application/vnd.onem2m-res+json
X-M2M-Origin://iotsandbox.cisco.com:10000
X-M2M-RI:12345
§ url: https://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: https://localhost:8282/InCSE1?fu=1&lim=2
這個請求的限制設置成2,在URL中查看參數lim。你能增加或減少此數字去獲取所需組件。
10. 創(chuàng)建一個訂閱以得到在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: https://localhost:8282/InCSE1/TestContainer
工作原理
IoTDM項目提供和實現RPCs,使oneM2M資源的子集發(fā)生相互作用。一個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)和此章節(jié)所用的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,動態(tài)質量服務)。項目由一臺策略服務器、一臺應用manager、CMTS和CM組成。策略服務器負責分配網絡資源給每個訂閱者和應用,應用manager負責指定每個應用的QoS要求給策略服務器,CMTS負責執(zhí)行基于帶寬容量的策略,CM負責與客戶端(cable system)網絡連接。
預備條件
此章節(jié)將只需要一臺CTMS設備。如果你沒有,可以使用PCCM項目中提供的CMTS模擬器。
在此章節(jié)我們將使用此模擬器。對于那些不需要的可以直接跳到下一節(jié)的第4步。
我們之前介紹過Postman工具和Postman collection。在此章節(jié),我們同樣使用一個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環(huán)境。可以從此處獲取: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可以設置默認值。復制粘貼原始數據到導入部分。然后在右上角,有一個下拉框選擇環(huán)境,選擇“PCMM Sample local”。通過點擊右邊按鈕(像眼睛的按鈕),你會看見環(huán)境的內容。
操作指南
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.創(chuàng)建一個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:
https://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. 核實剛建立連接的狀態(tài)。((Operational –Get All CCAPs)
對于這些請求我們將使用操作數據存儲中的操作數據。這反映設備的當前狀態(tài)。
§ type: GET
§ headers:
Authorization: Basic YWRtaW46YWRtaW4=
§ url:
https://localhost:8181/restconf/operational/packetcable:
ccaps/ccap/${ID}
這條請求返回設備的連接信息${ID}=1。我們設備現在是連接的。
{
"ccap": [
{
"ccapId": "1",
"connection": {
"connected": true
}
}
]
}
8. 我們現在創(chuàng)建一個gate。為此我們將提交以下請求:(Gate w/ classifier) 我們給gate使用第一個定義在配置文件的Cable Modem。
你將必須在此條請求定義三個變量:${APPLICATION_CLASSIFIER}, ${SUBSCRIBER_ID} 和${GATE_ID}
§ type: PUT
§ headers:
Authorization: Basic YWRtaW46YWRtaW4=
§ url:
https://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
注意:當創(chuàng)建gate,你需要在3種不同類型的分類中選擇:標準類型(案例中使用的)、擴展類型,IPv6類型。
相關閱讀:
高端私有云項目交流群,歡迎加入!
完
加入中國最活躍的OpenStack技術討論QQ群,加群主QQ:502207183,并注明城市、行業(yè)、技術方向。
轉載請注明來自夕逆IT,本文標題:《8E1轉以太網協議轉換器網橋Ethercom》

還沒有評論,來說兩句吧...