软件定义网络(SDN)应用基础(微课版)课件 项目5 基于OpenDaylight构建SDN控制平面_第1页
软件定义网络(SDN)应用基础(微课版)课件 项目5 基于OpenDaylight构建SDN控制平面_第2页
软件定义网络(SDN)应用基础(微课版)课件 项目5 基于OpenDaylight构建SDN控制平面_第3页
软件定义网络(SDN)应用基础(微课版)课件 项目5 基于OpenDaylight构建SDN控制平面_第4页
软件定义网络(SDN)应用基础(微课版)课件 项目5 基于OpenDaylight构建SDN控制平面_第5页
已阅读5页,还剩192页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目5基于OpenDaylight构建SDN控制平面学习目标项目背景项目需求分析项目相关知识项目实践项目习题目录

5.1学习目标(1)了解SDN控制器概念及作用。(2)了解企业对于SDN控制器的需求。(3)掌握OpenDaylight控制器的业务部署流程。(4)掌握OpenDaylight控制器的功能及原理。(5)掌握Postman工具的操作方法。项目背景项目背景

基于前期项目的实践,网络部工程师对SDN有了一定的了解,能使用OVS手动下发流表实现基本的局域网通信。但OVS仅仅是SDN软件定义网络中的转发部分,其转控分离理念中的集中控制部分仍未实现。因此,管理员计划近期在原测试拓扑的基础上增加SDN控制器,考虑到控制器可靠性和稳定性的要求,网络部工程师计划在控制器中部署OpenDayLight,然后基于OpenDayLight的DLUX组件和北向API功能实现流表下发和网络通信控制。网络结构拓扑如图5-1所示。

项目背景

图5-1网络结构拓扑项目背景角色规划如表5-1所示。角色主机名系统版本软件配置控制器controllerUbuntu18.04OpenDayLight-LithiumJava1.8Postman交换机switchUbuntu18.04OpenvSwitch2.16.0Mininet模拟器mininetUbuntu18.04mininet表5-1角色规划表项目背景网络规划如表5-2所示。主机名称端口IP地址用途LAN区段controllerens33DHCP连接互联网

ens340/24SDN控制网Lan0switch1ens33DHCP连接互联网

ens340/24SDN控制网Lan0ens35无IP地址SDN数据网Lan1ens36无IP地址SDN数据网Lan2ens37无IP地址SDN数据网Lan3mininet2ens33DHCP连接互联网

ens3400/24SDN控制网Lan0PCHost-1ens33DHCP连接互联网

ens3428/24SDN数据网Lan1PCHost-2ens33DHCP连接互联网

ens3429/24SDN数据网Lan2PCHost-3ens33DHCP连接互联网

ens3430/24SDN数据网Lan3表5-2网络规划表项目背景流量规划如表5-3所示。源地址目的地址动作协议类型优先级硬超时/s

转发ARP1003602829丢弃IP1003602930转发交换机3段端口IP1003603029转发交换机2段端口IP100360表5-3流量规划表项目需求分析项目需求分析SDN软件定义网络的本意是网络控制与数据转发的分离,需要将控制器的功能从交换设备上独立分离出来,进一步提升网络性能。因此,管理员需要使用测试环境的“控制器”角色部署控制器的相关软件和功能,并在“控制器”中下发流表实现网络正常通信。

综上所述,本次项目设计如下几点任务。

(1)安装OpenDaylight,并在UI界面查看SDN拓扑相关信息。

(2)使用MiniEdit工具连接ODL控制器,测试控制器功能。

(3)通过YangUI下发L3层流表实现公司业务测试主机通信控制。

(4)通过Postman下发L3层流表实现公司业务测试主机通信控制。项目相关知识5.4.1SDN控制器概述

控制器是SDN网络架构的核心,它的作用类似于计算机操作系统,可以用于管理和控制底层网络资源。控制器可以为上层应用程序提供使用网络资源的API接口(北向API接口)。一般情况下,SDN控制器应具备以下几个功能。

①抽象数据模型的功能。用于将底层网络资源、协议、用户策略抽象化为一个个数据模型提供给上层的应用程序使用。 ②提供北向接口功能。通过API的方式向上层应用程序提供调用抽象底层网络资源的能力。通过API接口可以增、删、改网络资源(如子网、端口等)的相关配置,还可以获取网络配置的相关信息(如拓扑信息、连接信息等)。5.4.1SDN控制器概述

③管理网络资源的功能。具备发现和管理主机、端口、设备、链路等网络资源,维护全网拓扑的能力,如链路层发现协议(LinkLayerDiscoveryProtocol,LLDP)、ARP学习等。④管理网络配置与网络状态的功能。通过特定的消息机制获取网络资源的动态变化信息和对网络信息进行配置。⑤提供网络基本服务的功能。具备路由计算和路由转发等网络基本服务的能力。

⑥提供南向接口功能。具备封装和抽象底层网络协议(如VLAN、STP等协议)、网络设备的能力,为控制器访问底层网络设备提供统一的接口。一般情况下使用的南向接口协议为OpenFlow协议。5.4.1SDN控制器概述

⑦提供数据存储功能。具备存储拓扑信息、网络配置信息的能力,数据存储后可供控制器随时调用。

目前主流的控制器有OpenDayLight、ONOS、Floodlight、Ryu、POX等。锐捷、华为、思科、VMware、惠普等厂商也在积极的参与到SDN控制器的研发中。5.4.2OpenDayLight1.OpenDaylight简介

OpenDayLight是目前比较主流的SDN控制器,它是由Linux基金会联合多家网络设备厂商于2013年创建的开源项目,它的项目目标是在减少用户运营网络复杂度和延长现有基础网络生命周期的同时,建设能管理不同的网络设备并且能支持SDN新服务和新功能的通用的SDN控制平台。

OpenDayLight(ODL)是基于Java语言进行开发的,它采用了开放服务网关(OpenServiceGatewayInitiative,OSGi)体系架构,实现了控制器各个功能的组件化和模块化,让应用程序能以包(Bundle)的方式动态加载和卸载,让控制器支持动态扩容缩和热部署。OpenDayLight引入了由模型驱动的服务抽象层SAL(一种用于在网络设备和应用程序YANG模型之间进行数据交换的机制)。SAL向上连接功能模块,以插件的形式为之提供底层设备服务;向下连接多种协议,通过屏蔽不同底层协议的差异性,为上层功能模块提供一致性服务。5.4.2OpenDayLight

OpenDayLight以元素周期表中的元素名称作为版本号,更新周期为6个月一次,OpenDayLight于2014年发布第一个控制器产品,至今已经拥有15个版本。OpenDayLight软件包可从官方下载,需要注意的是:OpenDayLight依赖于Java平台,因此在安装OpenDayLight之前需要准备好Java平台的安装包。从OpenDayLight-Lithium版本开始,OpenDayLight可以在Java1.8版本上运行,并且开始使用Apachekaraf容器为用户提供管理和测试SDN生产环境的控制台,使用户能够使用feature命令管理OpenDayLight复杂庞大的组件和功能,同时使用DLUX组件为用户提供更好的用户交互界面,提升交互体验。OpenDayLight-Lithium版本是相对功能比较完善且比较稳定的OpenDayLight控制器版本,本项目中也将使用此版本。5.4.2OpenDayLight2.OpenDayLight控制器的架构

OpenDayLight控制器架构在每个版本都会存在一些异同,但总体上讲,OpenDayLight架构可以形象的看作是3层,底部第一层是数据传输通道,包括物理设备、虚拟交换机等;中间第二层是OpenDayLight平台,包括的南向协议、SAL(Socketabstractionlayer)框架、北向协议以及各种应用功能等;最上层是第三方网络业务应用,例如能支持OpenStack。3.OpenDayLight控制器的启动

在一般情况下,OpenDayLight支持两种启动方式:一种是以karaf控制台驻留模式启动和运行OpenDayLight,另一种是以后台服务模式启动和运行OpenDayLight。5.4.2OpenDayLight(1)karaf控制台驻留模式启动OpenDayLight

①以OpenDayLight-Carbon为例。(需提前切换到OpenDayLight安装目录下)。

优点:这种启动方法操作简单,而且能比较直观的看到其控制台是否已经正常启动。。

缺点:启动后,Karaf控制台必须占用一个会话窗口,当用户从Karaf控制台注销(logout)之后或关闭了会话窗口之后,OpenDayLight的服务就会停止,不利于管理员管理,容易造成单点故障。root@hostname:/mnt/distribution-karaf-0.3.0-Lithium#./bin/karaf5.4.2OpenDayLight

(2)后台服务方式启动OpenDayLight

①以OpenDayLight-Lithium为例。(需提前切换到OpenDayLight安装目录下)。

优点:OpenDayLight以后台服务的方式运行,能长期驻留在主机操作系统中,管理员无论是否注销karaf控制台都不影响OpenDayLight服务的正常运行,管理员执行杀掉进程、执行shutdown命令或关闭主机才会使OpenDayLight停止。

缺点:无法直观的得知OpenDayLight是否启动完成,需要等待OpenDayLight以后台服务启动1-2分钟后,才能执行命令连接控制台,否则可能会遇到报错。root@hostname:/mnt/distribution-karaf-0.3.0-Lithium#./bin/start5.4.2OpenDayLight

②用户需要手动执行如下命令以OpenDayLight内置用户身份karaf连接Karaf控制台。注意:运行后将被要求输入OpenDayLight控制台默认用户karaf的密码,一般为karaf或admin(不同版本不一样)。 OpenDayLight-Karaf控制台正常启动后,界面显示如图5-2所示。图5-2OpenDayLight-Karaf控制台界面root@hostname:/mnt/distribution-karaf-0.3.0-Lithium#./bin/client-ukaraf5.4.2OpenDayLight4.OpenDayLight的项目与组件

OpenDayLight是一个综合的SDN开源项目,以OpenDayLight为父项目,全球协作社区在父项目下创建和补充了许多子项目,用于逐步完善OpenDayLight的功能和架构,OpenDayLight部分项目依赖关系如图5-3所示。

图5-3OpenDayLight项目依赖关系图5.4.2OpenDayLight

从图5-3可以看出,OpenDayLight父项目的名称为odlparent,在这个父项目下有许多的子项目,如yangtools、mdsal、controller、openflowplugin等。这些项目通过一定的依赖关系相互协作,而用户可以自由安装搭配这些项目以达到OpenDaylight功能定制化的目的。5.4.2OpenDayLight

(1)OpenDayLight关键项目

①yangtools项目。它是一个基础结构项目,也是OpenDayLight内核项目,功能主要是在OpenDayLight中为mdsal、OFConfig等Java(基于JVM语言)项目和应用程序提供必要的YANG模型化语言支持。

②mdsal项目。模型驱动SAL(MD-SAL)能为OpenDayLight数据存储、RPC、路由、通知的订阅和发布等服务提供基础结构服务,它的功能主要是为应用程序和插件开发人员提供API开发的支持。mdsal项目依赖于yangtools和odlparent项目。5.4.2OpenDayLight

③controller项目。主要功能是为多厂家网络设备的SDN部署提供一个高可用、模块化、可扩展并支持多协议的控制器基础架构。

④netconf项目。主要为OpenDayLight提供管理网络设备、更新和配置数据信息的机制。一般来说netconf需要配合restconf(一个旨在为应用程序提供一个获取配置数据、状态数据、通知事件的网络配置与管理协议)一起工作。netconf项目在OpenDayLight-Beryllium(铍)版本中进行整合(同时包括了netconf和restconf)。5.4.2OpenDayLight

⑤openflowplugin项目。openflowplugin项目旨在基于mdsal开发一个可支持OpenFlow规范(OpenFlow1.0和1.3.x)的可扩展的插件以添加对后续OpenFlow规范的支持。它的功能有连接管理(负责早期会话协商,确定交换机功能和身份)、设备管理(负责处理与交换机的低级交互,确保对交换机的公平访问)、统计数据管理(负责维护交换机上的计数器及计数器在MD-SAL数据存储中的表示之间的同步)和RPC管理(负责将应用程序的请求从MD-SAL路由到设备)。openflowplugin项目的架构如图5-4所示。5.4.2OpenDayLight图5-4openflowplugin项目的架构图5.4.2OpenDayLight

⑥l2switch项目。主要功能是提供第二层交换机功能,如2层数据包处理、环路消除、ARP数据包处理、MAC地址跟踪、主机跟踪等,还可以根据网络流量在每个交换机上安装流(Flows)。⑦dlux项目。主要功能是为用户提供一个可视化的UI界面,包括一下几个模块:a.YangUI与Yang模型进行交互,利用图形化界面浏览、配置和管理网络设备和服务b.UI,使用户能在不了解数据模型的情况下读取和写入数据)c.Yangman(更加激进的UI界面,可用于替代YangUI)d.YangVisualizer(在图表中可视化Yang模型)e.Node(简单的节点信息管理器)f.Topology(简单的OpenFlow拓扑显示器)等应用程序。以上这些项目,在首次启动的OpenDayLight中,默认情况下是需要用户手动安装,每个项目可以称为一个组件,每个组件可以由一个或多个Bundle(Karaf控制台中的最小单位)构成。

5.4.2OpenDayLight(3)卸载组件的执行步骤①删除OpenDayLight安装目录下的data目录。②以root用户在OpenDayLight目录下执行命令。之后OpenDayLight会重新启动。root@hostname:/mnt/distribution-karaf-0.3.0-Lithium#rm-rf./dataroot@hostname:/mnt/distribution-karaf-0.3.0-Lithium#./bin/karafclean5.4.2OpenDayLight5.OpenDayLight关键组件监听的服务端口在安装所有关键组件后,启动服务一般需要1-2分钟。restconf、dlux、mdsal关键组件各自监听的端口分别是:TCP/8181、TCP/8080、TCP/6633,其中8181端口可用于北向API的调试;8080端口是WEB界面默认端口,同时也可以用于北向API的调试与调用;6633端口是控制器服务的监听端口,控制器通过此端口连接交换机进行管理。用户可以通过ss-tlnp命令查询端口监听状态。

5.4.2OpenDayLight6.OpenDayLight的Karaf控制台命令管理员可以通过Karaf控制台执行命令进行一些管理工作,常用命令如表5-1所示。命令含义system:shutdown关闭并退出命令行终端logout登出命令行终端log:tail查看当前最新log日志信息log:display|more逐页查看OpenDayLight日志;feature:list查看模块信息feature:list-i查看已安装的模块信息feature:install<feature1><feature2>安装一个或多个模块,模块名之间用空格隔开help查看命令行终端可用的命令表5-1Karaf控制台常用命令

5.4.2OpenDayLight7.OpenDayLight的DLUX项目 DLUX项目在OpenDayLight中为用户提供一个可视化的WEBUI界面,用户通过这个界面可以查看拓扑、查看或配置流表,也可以用来配置交换机信息,如端口、网桥等。(1)DLUX项目包括的Bundle①odl-dluxapps-core。WEBUI的核心部分,负责页面数据的转换与处理。②odl-dluxapps-nodes。WEBUI用于获取拓扑节点信息并做图形化显示的模块。③odl-dluxapps-yangui。用于与controller交互的模块,可以基于Yang模型渲染表单。默认情况下安装了DLUX项目支持之后,用户可以通过浏览器访问WEBUI地址:http://{controller-ip}:8080/index.html(如果是Carbon以后的版本,WEBUI地址为:http://{controller-ip}:8181/index.html),其中{controller-ip}指的是控制器的IP。5.4.2OpenDayLight(2)通过浏览器访问WEBUI访问WEBUI默认情况下需要用户身份验证,默认的用户名为:admin,密码为admin。用户身份验证通过后,默认将进入Topology页面,页面示例如图5-5所示。Topology页面主要用于显示controller通过LLDP检测到的拓扑信息(主要是交换机与Host连接的部分,controller不会显示在拓扑中),如果OpenFlow交换机连接主机的链路没有交换流量,那么拓扑图中只会显示OpenFlow交换机,只有Host主机的上联链路有流量经过时,通过Controls下方的“Reload”按钮进行刷新,才能显示主机图标。用户可以在此界面获取交换机的id,也就是nodeid,用户通过使用鼠标悬停在拓扑中的图标显示其他信息,如连接线的端点信息、节点的其他信息等。5.4.2OpenDayLight图5-5Topology页面示例

5.4.2OpenDayLight

在WEBUI界面,用户还可以切换到其他几个页面,如下所示。①Nodes选项卡。可以切换到Nodes节点信息页面。在Nodes页面中显示的是控制器已连接的交换机节点信息,主要有NodeID(交换机节点ID)、NodeName(交换机名称)、NodeConnectors(交换机连接)、Statistics(交换机统计信息)几栏,数据以表格形式显示,每个交换机节点占一行。如果表格中字体是蓝色的,说明用户可以单击蓝色的字体,查看更多详细内容。单击NodeConnectors列中的字体将显示交换机节点的端口信息,用户可以获取端口的ID、端口名、端口在网桥中的编号、MAC地址等信息;单击Statistics列中的“Flows”字样,将跳转显示流表相关数据的统计信息,如流表ID、活动的流表项、数据包匹配数、数据包查找量等;单击Statistics中的“NodeConnectors”字样,用户可以获取交换机端口的统计数据,包括请求/传输的数据包个数、请求/传输的字节数、请求/传输的丢弃数据包个数、请求/传输的错误数据包个数、泛洪数据包错误个数等。5.4.2OpenDayLight②“YangUI”选项卡。可以切换到基于Yang模型渲染的表单页面中。表单页面中包括Module目录、ActionsAPI路径和操作区域、状态事件通告区域、表单区域。其中的Module目录用于显示已安装、可操作的所有组件的API;ActionsAPI路径和操作区域用于显示当前访问的API路径、设置对API中执行的操作方法等;状态事件通告区域用于显示上一次操作的状态(成功、失败或错误等);表单区域用于展示和设置渲染好的Yang模型表单,让用户可以通过表单写入或读取Yang模型数据。③YangVisualizer选项卡。可以切换到YangVisualizer页面,通过图形化界面查看Yang模型数据。5.4.2OpenDayLight8.OpenDayLight的表示层状态转化(RepresentationalStateTransfer,RESTCONF)协议 YangUI页面中的Module目录可以展示已安装组件提供的所有Yang模型的API接口目录,而这些目录是根据RESTCONF规范进行呈现的。简单的说,RESTCONF是OpenDayLight的北向API,负责为用户提供网络配置与管理的API接口和详细路径。在OpenDayLight中,RESTCONF是一个协议类项目,它能基于HTTP协议运行REST协议,访问Yang模型中定义的数据,它的组件一般为odl-restconf;它能基于HTTP协议对外提供API接口服务,默认监听端口为8181,在OpenDayLight-Lithium之前的版本中,它同时能监听8080端口传送过来的请求。用户可以通过feature:list|grepodl-restconf命令查看所有可安装的RESTCONF组件,通过feature:installodl-restconf命令安装RESTCONF支持。5.4.2OpenDayLightRESTCONF提供API接口和详细路径,但是,它需要mdsal组件提供存储数据的功能支持。mdsal组件安装后,在YangUI的Module目录中被允许使用的数据存储有两种:config(配置数据,包含通过控制器插入的数据,主要用于变更或插入网络或系统的配置数据)和operational(运行数据,包含其他数据的信息,主要用于查看应用程序反馈的网络或系统状态等信息)。operational只有读数据权限,不可更改设置,config同时支持对数据的读和写操作。一般情况下,operational中的数据是运行时的数据,而config的数据则是用户预期中要应用的数据,operational与config的数据是同步的。需要注意的是:如果用户的config数据设置错误是不会同步到operational中的。此时在operational和config中的数据是不相同的。5.4.2OpenDayLightModule目录的基本结构如图5-6所示。一般情况下,第一层目录被称为顶级节点,也称为模块,它通常以rev.TIME结尾(TIME应为这个项目创建时间),第二层目录可以是operational或config。在operational和config的下一层目录则被称为节点,节点的下层目录则被称为子节点,子节点下还可以接关键字或挂载点。用户在选择Module目录时,下方的Actions区域也将同步显示当前的API路径。在API路径中,一般情况下顶级节点与节点之间使用“:”符号进行连接,节点与子节点之间使用“/”符号进行分隔。如图5-6所示,单击展开的Module目录,顶级节点为network-topology(不含rev.TIME部分),节点为network-topology,子节点为topology{topology-id}。图5-6Module目录的基本结构5.4.2OpenDayLightROOT目录被展开后,YangUI中的Actions的API路径显示如图5-7所示,根据其API命名规则,可以看出此API路径的顶级节点为network-topology,节点为network-topology,子节点为topology,API路径后还存在空白的方框,这个代表着节点的关键字(也就是Module目录中“{}”的部分),前面的选择列表代表的是对Actions的可用操作(GET),最后的按钮分别代表了保存、发送、展示完整路径和自定义API请求。图5-7YangUI中的Actions的API路径5.4.2OpenDayLight安装了RESTCONF组件之后,OpenDayLight将允许第三方程序(如Postman)使用HTTP请求调用RESTCONF,每个HTTP请求的统一资源定位器(UniformResourceLocator,URL)都应该以http://{controller-ip}:8181/restconf开头,需要调用到Module时,首先要在URL中补全需要调用的数据存储名称(如operational、config),然后在数据存储名称后添加实例标识符<moduleName>:<nodeName>/<nodeName>/<valueOfKey1>.其中:<moduleName>表示的是Module模块的名称;第一个<nodeName>表示的是节点的名称;第二个<nodeName>指的是子节点的名称;<valueOfKey1>指的是子节点需要输入的关键字。5.4.2OpenDayLight因此,一个正常的operational数据存储URL路径可以如下所示。一个正常的config数据存储URL路径可以如下所示。如图5-8所示,topology子节点的Module目录层次转换为HTTP格式的URL路径应该如下所示。http://{controller-ip}:8181/restconf/operational/<moduleName>:<nodeName>/<nodeName>/<valueOfKey1>http://{controller-ip}:8181/restconf/config/<moduleName>:<nodeName>/<nodeName>/<valueOfKey1>http://{controller-ip}:8181/restconf/operational/network-topology:network-topology/topology/<valueOfKey1>5.4.2OpenDayLight图5-8topology子节点的Module目录层次5.4.2OpenDayLight默认情况下,安装了RESTCONF组件之后,能支持用户在DLUX的YangUI页面中使用GET、PUT、POST、DELETE等HTTP操作方法,分别代表获取、上传、创建、删除等操作。这些操作方法可以在YangUI中的Actions区域进行选择,如图5-9所示。operational仅支持GET方法,而config可以支持GET、PUT、POST、DELETE等方法。RESTCONF能支持XML和JSON格式的HTTP数据类型,它能通过HTTP头部中的Content-Type字段定义请求的媒体(输入的代码)格式,通过HTTP头部中的Accept字段定义响应的媒体(输出的代码)格式;默认情况下YangUI中使用的是JSON格式的HTTP数据类型。图5-9Actions区域的操作方法选项5.4.2OpenDayLight9.OpenDayLight自动下发的流表在默认情况下,OVS连接到OpenDayLight之后,OpenDayLight就会在拓扑内部进行LLDP发现并生成拓扑。在此过程中OpenDayLight会自动为拓扑生成流表项保证链路的通信并进行拓扑检测。如果是单交换机连接2个主机的拓扑中,OpenDayLight自动生成的流表项一般有4条,如图5-10所示。在OpenDayLight自动下发的流表项中,一般情况下,至少有一条流表项用于匹配LLDP数据包执行动作输出到控制器,用于确保LLDP数据包的正常转发和链路发现。另外至少有一条tablemiss流表项用于丢弃没被匹配上的数据包。图5-10OpenDayLight自动生成的流表项5.4.3YangUI模块1.Network-topology模块 在YangUI中,常用的Module主要有两个,分别是network-topology和OpenDayLight-inventory。前一个主要用于拓扑信息的查询与管理,后一个主要用于流表的查询与管理。network-topology模块常用数据存储为operational。常用的节点为network-topology。用户可以将Module目录展开到operational下的network-topology,然后在Actions中使用GET方法,再单击Send按钮,可以查询当前已检测到的拓扑信息,如图5-11所示。5.4.3YangUI模块图5-11通过GET方法查询当前已检测到的拓扑信息5.4.3YangUI模块在图5-12中,可以看出Send请求发送成功后,状态事件区域也显示为“Requestsentsuccessfully”,在network-topology表单区域中总体目录结构如下。network-topology #节点名称├topologylist #拓扑列表 ├nodelist #拓扑中的节点列表(设备列表) ├termination-pointlist #节点的端点列表(设备的端口列表) ├attachment-pointlist #节点的远端列表(设备远端端口列表) ├addresslist #节点端点的IP地址列表 ├linklist #连接列表 ├source #源端(连接的源端信息) ├destination #目的端(连接的远端信息)5.4.3YangUI模块假设当前已有一个拓扑,执行Send操作后的页面显示如图5-12所示。5.4.3YangUI模块图5-12拓扑信息查询的结果页面5.4.3YangUI模块①在topologylist(拓扑列表)中可以获取到控制器管理的所有拓扑的ID,图5-12中topology-id表示拓扑的ID为flow:1。②在node-list(设备列表)中可以获取当前拓扑中的所有节点的ID信息,图5-12中共显示有三个节点,它们的node-id的值分别为openflow:52231055667、host:00:0c:29:f7:b3:3d、host:00:0c:29:ab:22:6a。单击host:00:0c:29:ab:22:6a复选框,说明nodelist下的其他内容都是节点host:00:0c:29:ab:22:6a对应的信息,termination-pointlist中的内容表示host:00:0c:29:ab:22:6a节点下有一个id为host:00:0c:29:ab:22:6a的端口(tp-id的值为host:00:0c:29:ab:22:6a)。③attachment-pointslist中的内容表示节点host:00:0c:29:ab:22:6a连接的远端端口是激活状态的(active值为true),远端端口的id为openflow:52231055667:2(attachment-pointslist中的tp-id的值为openflow:52231055667:2)。④addresslist中的内容表示节点host:00:0c:29:ab:22:6a的MAC地址为00:0c:29:ab:22:6a(mac的值为00:0c:29:ab:22:6a),IP地址为29。用户可以通过单击其它node-id复选框查看不同的node的信息(黄色代表正在查看的node),node-id以openflow开头表示这个节点是一个交换机节点,如果是以host开头则代表这个节点是一个主机节点。5.4.3YangUI模块⑤在linklist中可以获取拓扑中所有连线的源端和目的端信息。在图5-12中,linklist一行中显示有3条记录,而且在右侧的还有一个向右的三角箭头可以单击,说明右侧还有记录被隐藏起来了,用户可以通过单击三角箭头查看被隐藏的条目。标记为深色的条目代表正在查看的link。link-id为host:00:0c:29:ab:22...的内容,省略号表示后面还有内容无法显示,用户可以通过鼠标悬停在条目上查看所有的内容。从link-list对应的数据可以看出这个连接的ID为host:00:0c:29:ab:22:6a/openflow:52231055667:2,这条连接的源端节点是host:00:0c:29:ab:22:6a(根据source-node的值为host:00:0c:29:ab:22:6a可以得到这个结论),源端的端口是host:00:0c:29:ab:22:6a(根据source-tp的值为host:00:0c:29:ab:22:6a可以得到这个结论)。5.4.3YangUI模块这条连接的目的端的节点是openflow:52231055667(根据destination-node的值为openflow:52231055667可以得到这个结论),目的端的端口是openflow:52231055667:2(根据destination-tp的值为openflow:52231055667:2可以得到这个结论)。单击其他没有标记为深色的条目,可以切换linklist显示的内容。一般来讲,这个拓扑中有多少条连线在linklist中就会有双倍的连接记录,因为连接是相对而言的,对于节点端口host:00:0c:29:ab:22:6a而言,它的目的端是openflow:52231055667:2,而对于节点端口openflow:52231055667:2而言,目的端是host:00:0c:29:ab:22:6a。5.4.3YangUI模块2.opendaylight-inventory模块opendaylight-inventory模块常用的数据存储为config,常用的节点为nodes,常用的子节点名称为node{id}下的table{id},主要用于流表与流表项的设置。其Module目录结构如图5-13所示。图5-13

opendaylight-inventory目录结构5.4.3YangUI模块用户可以将Module目录单击到config下的node{id}下的table{id},然后在Actions中可以选择操作方法为PUT表示进行的操作是配置流表,界面如图5-14所示。图5-14inventory模块table节点的Actions5.4.3YangUI模块从图5-14中可以看出Actions中需要填写两个空格,它们对应的值分别应该填写为交换机的node-id和流表的id值。如果交换机仅支持OpenFlow1.0协议,那么流表的id值只能填写为0,如果是支持OpenFlow1.3协议的交换机则可以填写为0-253。如果要设置node-id为openflow:522310的交换机的流表0,那么Actions应填写的内容如图5-15所示。图5-15table节点的Actions中空格的填写示例5.4.3YangUI模块在Actions下方的表单区域中可以看到当前只显示了tablelist(流表列表)这一行,但是在右侧有一个“+”号可以单击,单击一次“+”号表示为tablelist添加一个流表的表单,单击后如图5-16所示。图5-16为tablelist添加一个流表的表单后的目录结构5.4.3YangUI模块在这里可以设置id的值,如果更改了tablelist中的id的值,那么Actions中的第一个空格位置的对应值也会改变。同时在tablelist下还可以通过单击一次flowlist右侧“+”号表示为这个流表添加一个流表项的表单,单击后界面如图5-17所示。图5-17为流表添加一个流表项的表单后的目录结构5.4.3YangUI模块在flowlist中id、priority、idle-timeout、hard-timeout、table-id属于流表项的其他设置项。用户可以自行规划,它们仅能填写为十进制数。需要注意的是table-id需要与前面填写的流表ID的值一致。id指的是流表项ID,在默认情况下为0,建议用户手动规划,并且记录起来,以免在下发多条流表项时发生混乱,记录的流表ID也可以用于事后回溯查看、流表项删除等操作。在flowlist表单中match表单默认是收起的,需要用户单击左侧的三角符号才能展开,match表单展开后如图5-18所示。图5-18match表单展开后的目录结构5.4.3YangUI模块由上图可以看出match下还有其他默认为收起状态的表单项(向右的三角符号代表表单是收起的,向下则代表展开)。(1)match匹配域表单中的注意事项 ①ethernet-type中的报文类型(type),可以填写为十进制或十六进制的格式,常见的十进制---十六进制---对应的以太网代表类型有:2055---0x0806---ARP、2048---0x0800---IPv4、2269---0x08dd---IPv6。 ②ip-match中的IP协议匹配设置ip-protocol,仅支持十进制填写格式,常用的十进制---对应的IP协议类型有:1---ICMP协议、6---TCP协议、17---UDP协议。5.4.3YangUI模块③2层匹配项ethernet-type影响3层匹配项的应用。如:当ethernet-type中设置的值为0x0800,3层匹配项中ipv4-match的匹配设置才生效;当ethernet-type中设置的值为0x08dd,3层匹配项中ipv6-match的匹配设置才生效。④3层匹配项影响4层匹配项的应用。如当ip-protocol设置的值为6时,4层的tcp-match的匹配设置才生效;当ip-protocol设置的值为17时,4层的udp-match的匹配设置才生效。5.4.3YangUI模块在flowlist中,instructions指令默认情况下也是收起的,打开状态下目录结构如图5-19所示。图5-19instructions指令展开状态的目录结构5.4.3YangUI模块可以看出instructions下在默认情况下只有一条记录,名为instructionlist,需要用户手动单击右侧的“+”符号才可以添加一个指令表单,添加指令表单后,默认下层目录是展开状态的,如图5-20所示。图5-20添加指令表单后的目录结构5.4.3YangUI模块在上图中可以看出instructionlist可设置的是order和instruction。其中,order是必填项,用于表示指令表单的编号,默认第一个指令表单编号为0;instruction是通过菜单栏模式进行选择的,表示选择执行的指令类型。5.4.3YangUI模块(2)instruction常用的类型选项①apply-actions-case:用于设置立刻执行动作的事件。②clear-actions-case:用于设置执行清除动作集的事件。③go-to-table-case:用于设置执行跳转到其他流表的事件。④meter-case:用于设置执行计量动作的事件。⑤write-actions-case:用于设置执行写入动作集的事件。⑥write-metadata-case:用于设置执行写入元数据的事件。5.4.3YangUI模块打开选择框如图5-21所示。图5-21instruction选择框内容5.4.3YangUI模块以选择apply-actions-case指令为例,默认会显示下一层目录:apply-actions(应用动作)主要用于设置动作相关的参数。apply-actions目录下是actionlist(动作列表)需要通过右侧的“+”符号添加,单击多次可以添加多张动作列表,每张动作列表仅能设置一个动作参数。展开的apply-actions目录如图5-22所示。图5-22apply-actions的目录结构5.4.3YangUI模块添加一个actionlist动作列表之后,在列表中可设置的是order和action。order是必填项,用于设置这个动作列表的编号,默认第一张动作列表的编号为0。action是使用下拉菜单进行选择的,主要用于选择动作的类型。常用的动作类型有:controller-action-case(表示执行输出控制器)、drop-action-case(表示执行丢弃动作)、output-action-case(表是执行输出动作)、flood-action-case(表示执行泛洪输出)。actionlist目录结构如图5-23所示。。图5-23actionlist目录结构5.4.3YangUI模块添加一个actionlist动作列表之后,在列表中可设置的是order和action。order是必填项,用于设置这个动作列表的编号,默认第一张动作列表的编号为0。action是使用下拉菜单进行选择的,主要用于选择动作的类型。常用的动作类型有:controller-action-case(表示执行输出控制器)、drop-action-case(表示执行丢弃动作)、output-action-case(表是执行输出动作)、flood-action-case(表示执行泛洪输出)。actionlist目录结构如图5-23所示。图5-23actionlist目录结构5.4.3YangUI模块action下拉菜单如图5-24所示:图5-24action下拉菜单5.4.3YangUI模块选择完动作类型之后,还需要手动展开随着选择后刷新出来的菜单项。如图5-25所示,以output-action-case为例,选择完毕后下方出现了名为output-action的新表单项,需要单击左侧的三角符号展开目录。图5-25选择output-action-case后出现的output-action的新表单项5.4.3YangUI模块展开后如图5-26所示,在这里需要填写output-node-connector的值为交换机端口的编号,表示输出到的交换机上接口的编号(交换机接口的编号可以通过ovs-ofctlshowBridge命令获取)。图5-26

展开output-action后的结果。5.4.3YangUI模块在安装了RESTCONF支持之后,就允许第三方应用程序使用XML或JSON代码通过HTTP请求进行调用,以基于JSON格式的流表设置为例,部分代码框架及解释如下。5.4.4通过HTTP调用RESTCONF的代码格式{ #代码的固定格式,设置的所有内容都要在这个大括号里面编写。"table":[ #表示设置的是流表,中括号代表是一个集合,中括号下可以允许有多个大括号的内容{ #表示这是一个流表的设置"id":"x", #表示设置流表的id为x,x取值范围可以为0-253"flow":[ #表示设置的是流表项,中括号代表的是集合,中括号下允许有多个大括号的内容5.4.4通过HTTP调用RESTCONF的代码格式{ #表示这是一个流表项的设置"id":"x", #表示设置的是流表项的id"match":{ #表示设置的是匹配域的内容"in-port":"x" #设置匹配进端口为x的数据包,如果有其他匹配项,需要用“,”号隔开}, #表示匹配域设置已经完毕"instructions":{ #表示设置的是指令集的内容"instruction":[ #表示设置的是指令的内容,中括号表示这是一个集合,允许后面有多个大括号的内容{ #表示这是一个指令的设置"order":"x", #设置指令的编号为x,一般第一个指令编号为05.4.4通过HTTP调用RESTCONF的代码格式"apply-actions":{ #这里表示应用事件的设置,相当于在YangUI中选择了apply-actions-case"action":[ #表示设置的是动作的内容,中括号代表这是一个集合,允许后面有多个大括号的内容{ #表示这是一个动作的设置"order":"x", #表示动作的标号为x,默认情况下,第一个动作编号为0"output-action":{ #表示这是一个输出动作的配置,相当于在YangUI中选择了output-action-case"output-node-connector":"x" #这里表示设置的是数据到的接口编号} #这里表示输出动作的配置结束5.4.4通过HTTP调用RESTCONF的代码格式} #这里表示一个动作的设置结束,如果需要添加第二个动作的配置,那么需要在后面添加“,”然后换行输入一对大括号“{}”,在括号中进行第二个动作的配置] #这里表示action所有配置已结束} #这里表示apply-actions的配置已经结束} #这里表示一个指令的设置结束,如果需要添加第二个指令的配置,那么需要在后面添加“,”然后换行输入一对大括号“{}”,在括号中进行第二个指令的配置] #这里表示instruction的所有配置已经结束}, #这里表示所有的instructions配置已经结束"priority":"x", #这里表示配置流表项的优先级为x"idle-timeout":"x", #这里表示流表项的空闲超时为x"hard-timeout":"x", #这里表示流表项的硬超时为x5.4.4通过HTTP调用RESTCONF的代码格式"table_id":"x" #这里表示流表项所属的流表的ID为x,这里需要与前面table下的id的值一致} #这里表示一个流表项的配置已经结束,如果需要添加第二个流表项的配置,那么需要在这后面添加“,”然后换行输入一对大括号“{}”,在大括号中进行第二个流表项的配置] #这里表示流表项的所有配置已经结束} #这里表示一个流表的配置已经结束,如果需要添加第二个流表的配置,那么需要在这后面添加“,”然后换行输入一对大括号“{}”,在大括号中进行第二个流表的配置] #这里表示流表的所有配置已经结束} #这里表示配置已经结束,与第一个左大括号相呼应提示:初学者可以通过YangUI获取代码,以流表设置为例,用户可以在YangUI中填写完流表设置的相关参数后,在Actions栏中单击【Showpreview】按钮,打开一个悬浮窗用于显示当前设置的表单转换为代码后的格式,如图5-27所示。在Preview窗口中,首行显示的是这个操作的HTTP格式URL路径,第二行开始显示的是流表设置相关的代码。图5-27单击ShowPreview按钮的结果5.4.4通过HTTP调用RESTCONF的代码格式项目实训任务描述为了分离转发平面与控制平面,管理员决定在公司业务测试环境中部署OpenDayLight,并使用OpenDayLight-YangUI和Postman查看和分析拓扑,观察OpenDayLight自动下发的流表。具体可以通过以下步骤完成。5.5.1任务1安装OpenDayLight(1)配置初始化环境,包括安装JAVA和上传控制器安装包。(2)安装控制器并查看控制器运行状态。(3)配置OVS连接控制器,并查看连接状态。(4)在控制器的UI界面查看当前网络拓扑。(5)通过Postman工具获取当前网络拓扑状态。5.5.1任务1安装OpenDayLight任务实施(1)各主机的主机名、IP地址配置过程略,需要用户参考项目一的实训内容进行配置。(2)用xftp、SecureFX、WinSCP等工具将所需的软件通过NAT网络从物理主机传入controller中,默认安装包存放路径是/home/classroom/,需要上传的软件包包括distribution-karaf-0.3.0-Lithium.tar.gz。5.5.1任务1安装OpenDayLight(3)使用root用户登录controller,打开终端命令行,执行【apt】命令安装java环境。(4)编辑/etc/profile环境变量文件,添加jdk运行环境变量。5.5.1任务1安装OpenDayLightroot@controller:~#aptinstallopenjdk-8-jre-headlessroot@controller:~#vim/etc/profile#JAVA设置,在文件末尾添加以下内容后保存退出即可exportJAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64exportPATH=$JAVA_HOME/bin:$PATHexportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar保存退出后可以使用【cat/etc/profile|grepJAVA】命令进行查看添加JDK运行环境变量的操作结果如图5-28所示。5.5.1任务1安装OpenDayLight图5-28添加JDK运行环境变量的操作结果(5)运行命令解压OpenDayLight程序包解压到/mnt目录下。(6)重新加载环境变量后,启动OpenDayLight控制台。5.5.1任务1安装OpenDayLightroot@controller:/home/classroom#tar-xzf\distribution-karaf-0.3.0-Lithium.tar.gz-C/mntroot@controller:~#source/etc/profileroot@controller:~#/mnt/distribution-karaf-0.3.0-Lithium/bin/karaf启动OpenDayLight控制台的操作结果如图5-29所示。5.5.1任务1安装OpenDayLight图5-29启动OpenDayLight控制台的操作结果(7)安装控制器的必要组件。(8)在controller上打开另一个终端,使用命令查看控制器组件监听端口8080、8181和6633端口是否正常启动(建议在安装组件3~5分钟后再进行查看)。其中8080端口由dlux组件监听的,8181端口由restconf组件监听,6633端口由mdsal组件监听。5.5.1任务1安装OpenDayLightopendaylight-user@root>feature:installodl-restconfopendaylight-user@root>feature:installodl-l2switch-switchopendaylight-user@root>feature:installodl-openflowplugin-allopendaylight-user@root>feature:installodl-dlux-allopendaylight-user@root>feature:installodl-mdsal-allopendaylight-user@root>feature:installodl-adsal-northbound查看控制器组件监听端口的操作结果如图5-30所示。5.5.1任务1安装OpenDayLight图5-30查看控制器组件监听端口(9)在switch上打开命令行终端切换为root身份加载环境变量后,启动OVS守护进程,然后创建名为br-sw的网桥将本地端口ens35、ens36和ens37加入网桥。5.5.1任务1安装OpenDayLightclassroom@switch:~$surootroot@switch:~#source/etc/profileroot@switch:~#ovs-ctlstartroot@switch:~#ovs-vsctladd-brbr-swroot@switch:~#ovs-vsctladd-portbr-swens35root@switch:~#ovs-vsctladd-portbr-swens36root@switch:~#ovs-vsctladd-portbr-swens37(10)配置网桥模式为secure,使网桥不能通过传统方式实现报文正常通信(严格按照流表执行通信控制),并将通讯协议设置为OpenFlow1.0。(11)查看当前网桥详细信息和流表详细信息。(12)设置switch连接到OpenDayLight控制器。5.5.1任务1安装OpenDayLightroot@switch:~#ovs-vsctlset-fail-modbr-swsecureroot@switch:~#ovs-vsctlsetbridgebr-swprotocol=OpenFlow10root@switch:~#ovs-vsctlshowroot@switch:~#ovs-ofctldump-flowsbr-swroot@switch:~#ovs-vsctlset-controllerbr-swtcp:0:6633连接到OpenDayLight控制器的操作结果如图5-31所示。5.5.1任务1安装OpenDayLight图5-31连接到OpenDayLight控制器的操作结果(13)查看连接上控制器之后网桥与流表的详细信息。提示:网桥信息中显示is-connected“true”则说明连接成功。(14)在PCHost-1主机上pingPCHost-2主机。5.5.1任务1安装OpenDayLightroot@switch:~#ovs-vsctlshowroot@switch:~#ovs-ofctldump-flowsbr-swclassroom@pchost-1$ping29PCHost-1主机上pingPCHost-2主机操作结果如图5-32所示。5.5.1任务1安装OpenDayLight图5-32在PCHost-1主机上pingPCHost-2主机(15)返回controller主机打开firefox火狐浏览器,访问网址“http://localhost:8080/index.html”使用用户admin、密码admin进行登录。登录认证的操作结果如图5-33所示。5.5.1任务1安装OpenDayLight图5-33输入用户admin密码admin的结果(16)登录完毕后在Topology页面查看当前拓扑。 Topology页面查看当前拓扑的操作结果如图5-34所示。5.5.1任务1安装OpenDayLight图5-34在Topology页面查看当前拓扑(17)在YangUI查看拓扑信息,首先单击页面左侧的YangUI,跳转到YangUI界面,在页面中的Module界面中找到并单击左边的【+】号展开network-topologyrev.2015-07-12目录---展现出operational和config目录,然后单击左边的【+】号展开operational目录---随后单击目录下的【network-topology】,然后单击下方Actions界面中的【GET】,然后再单击【send】按钮,等待下方出现Requestsentsusccessfully提示即代表获取成功,返回的结果将存放在Requestsentsusccessfully的下方,通过分析结果可以得出当前拓扑。5.5.1任务1安装OpenDayLight在YangUI查看拓扑信息的操作结果如图5-35所示。5.5.1任务1安装OpenDayLight图5-35在YangUI查看拓扑信息将Web页面下拉,即可看见完整的结果。查看network-topology完成结果的操作结果如图5-36所示。5.5.1任务1安装OpenDayLight图5-36完整的结果(18)在controller上运行命令行终端,切换为root用户身份,打开Postman,在Postman工具中,URL地址填写为http://localhost:8181/restconf/operational/network-topology:network-topology,方法更改为【GET】,然后在Authorization中选择TYPE为【BasicAuth】,填写用户名和密码为admin之后单击【send】按钮发送请求,请求成功之后,在下方的Body中接收获取到的拓扑信息。5.5.1任务1安装OpenDayLight使用Postman发送请求的操作结果如图5-37所示。5.5.1任务1安装OpenDayLight图5-37发送请求(19)在Postman界面内查看接收的信息,如图5-45、图5-46、图5-47所示。如图5-38和图5-39所示,topology-id的值为flow:1表示这个拓扑的ID为flow:1,下方“link”后中括号的内容是指这个拓扑中的连线的信息,包括了连线的ID(link-id,表示是一条连线)、源端(source)和目的端(destination)的具体信息。源、目的端都包含连接节点(dest-node:目的连接节点;source-node源连接节点)和连接端口(dest-tp:目的连接端口;source-tp源连接节点端口)的信息。5.5.1任务1安装OpenDayLight5.5.1任务1安装OpenDayLight图5-38获取到的拓扑信息-15.5.1任务1安装OpenDayLight图5-39

获取到的拓扑信息-25.5.1任务1安装OpenDayLight如图5-40和5-41所示,可以看到描述主机节点的信息中还包含了“host-tracker-service:addresses”的信息,从这个信息中我们可以看到主机节点的MAC、IP地址等具体信息。图5-40

“host-tracker-service:addresses”的信息-15.5.1任务1安装OpenDayLight图5-41“host-tracker-service:addresses”的信息-25.5.1任务1安装OpenDayLight如图5-42所示,node后的中括号内的内容用于描述拓扑中节点的具体信息,拓扑中的一个设备就是一个节点,node-id代表是节点的id信息,“openflow:”开头的id指的是交换机节点,而“host”开头的节点代表的是主机。node中的termination-point后的中括号的内容用于描述节点端口的具体信息,其中tp-id代表节点端口的id信息。5.5.1任务1安装OpenDayLight图5-42node信息5.5.1任务1安装OpenDayLight任务验证(1)查看OpenDayLight运行日志。图5-43查看OpenDayLight运行日志opendaylight-user@root>log:tail5.5.1任务1安装OpenDayLight(2)查看已安装组件。查看已安装组件的操作结果如图5-44所示。图5-44查看已安装组件opendaylight-user@root>feature:list-i5.5.1任务1安装OpenDayLight(3)查看网桥和流表详细信息(连接控制器前)。查看网桥和流表详细信息(连接控制器前)的操作结果如图5-45所示。图5-45查看网桥和流表详细信息(连接控制器前)root@switch:~#ovs-vsctlshowroot@switch:~#ovs-ofctldump-flowsbr-sw5.5.1任务1安装OpenDayLight(4)查看网桥和流表详细信息(连接控制器之后)。查看网桥和流表详细信息(连接控制器之后)的操作结果如图5-46所示。图5-46查看网桥和流表详细信息(连接控制器之后)root@switch:~#ovs-vsctlshowroot@switch:~#ovs-ofctldump-flowsbr-sw5.5.1任务1安装OpenDayLight(5)两台主机互相通信的情况。在pchost-1测试与其他主机连通情况的操作结果如图5-47所示。由于网桥连接上OpenDayLight控制器之后,默认会下发流表,因此两台主机能正常ping通。图5-47两台主机能ping通的情况5.5.1任务1安装OpenDayLight(6)查看并分析流表。查看流表的操作结果如图5-48所示。图5-48查看并分析流表root@switch:~#ovs-ofctldump-flowsbr-sw5.5.1任务1安装OpenDayLight由图5-48可知:在主机上ping测试之后,流表项一共生成了7条,由上至下分别是:①匹配LLDP协议的数据包,动作是传送到controller的65535端口,流表项优先级100。②匹配源MAC地址为00:0c:29:ef:0b:14,目的MAC地址为00:0c:29:15:2a:ab的数据包,动作是转发到交换机的ens36端口输出,流表项空闲过期时间1800s,硬过期时

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论