高级路由技术网络系统建设课件-第11章 网络运维技术_第1页
高级路由技术网络系统建设课件-第11章 网络运维技术_第2页
高级路由技术网络系统建设课件-第11章 网络运维技术_第3页
高级路由技术网络系统建设课件-第11章 网络运维技术_第4页
高级路由技术网络系统建设课件-第11章 网络运维技术_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

第11章网络运维技术学习目标和素质目标了解SDN网络的基本知识。了解NETCONF协议的基本知识和原理。了解RESTCONF协议的基本知识和原理。了解Telemetry协议的基本知识和原理。了解OpenFlow协议的基本知识和原理。掌握Python语言的基本知识。掌握Paramiko模块基本知识和使用方法。提高学生的自学意识。引导学生完善知识结构。培养学生紧跟科技发展的学习习惯。11.1新网络运维技术基础SNMP、CLI等传统的网络运维技术已不能适应当前复杂网络(如SDN)管理和配置管理的需求,管理效率也越来越低;NETCONF、RESTCONF、Telemetry等新的技术应运而生,解决了传统网络运维技术的短板,满足了新网络管理的需求。Sources:NetworkComputing,theMetaGroupandContingencyPlanningResearch.AllfiguresU.S.dollars.6.482.80.090.631.11.62.0媒体医疗零售制造电信能源金融故障损失每小时停机损失百万美元人工配置下发人工配置校验人工业务开通业务开通慢>70%的网络通过CLI方式管理网络故障定位难一个故障定位平均耗时76min异常流占全网流3.65%30%传统运维可以识别70%传统运维无法识别Sources:2018年IO峰会现场调研数据11.1新网络运维技术基础网络管理的发展趋势2019年大数据+AI体验可视/评估异常识别/预测根因定位/分析排障/网络调优网络故障提前预警,故障解决更快,降低业务损失,潜在故障识别率大幅提升。通过在线的网规、部署、优化和巡检工具,实现本地网

络免管理,可以有效降低OPEX。自动化程度高自动化程度低2022年自动化程度管理自动化运维智能化11.1.1SDN概述众所周知,传统网络是分布式的网络架构,每个网络设备拥有独立的控制面,网络中没有集中的控制点,网络业务的开通要由管理员通过命令行或网管一一配置每个网络设备。很显然,传统的网络架构已经无法满足当前高速发展的互联网和云计算等新型业务的需求,也无法跟上企业和运营商未来发展的脚步,无论是企业还是运营商,未来都需要一张敏捷、智能和开放的网络。为了满足敏捷、智能和开放的诉求,需要一种新的网络架构,而SDN网络体系架构是目前业界认可的最佳选择。11.1.1SDN概述SDN起源SDN(SoftwareDefinedNetworking)即软件定义网络,是由斯坦福大学CleanSlate研究组提出的一种新型网络创新架构。其核心理念通过将网络设备控制平面与数据平面分离,从而实现了网络控制平面的集中控制,为网络应用的创新提供了良好的支撑。SDN起源提出了三个特征:转控分离、集中控制、开放可编程接口。OpenFlowSwitchesOpenFlow控制器SDN应用OpenFlow控制平面转发平面转发平面控制平面OpenFlow交换机仅有数据平面控制面功能由控制器提供OpenFlow协议互联11.1.1SDN概述SDN的本质诉求及价值SDN的本质诉求让网络更加开放、灵活和简单。它的实现方式是为网络构建一个集中的大脑,通过全局视图集中控制,实现或业务快速部署、或流量调优、或网络业务开放等目标。SDN的价值集中管理,简化网络管理与运维;屏蔽技术细节,降低网络复杂度,降低运维成本;自动化调优,提高网络利用率;快速业务部署,缩短业务上线时间;网络开放,支撑开放可编程的第三方应用。11.1.1SDN概述SDN的架构SDN是对传统网络架构的一次重构,从原来的分布式控制的网络架构重构为集中控制的网络架构。SDN最重要的变化是在网络中增加了SDN控制器,由SDN控制器对网络实行集中控制。SDN网络架构分为协同应用层、控制器层和设备层。不同层次之间通过开放接口连接。以控制器层为主要视角,区分面向设备层的南向接口和面向协同应用层的北向接口。OpenFlow属于南向接口协议的一种。11.1.1SDN概述SDN的架构(续)SDN网络架构分为应用层、控制层、设备层三层,不同层次之间通过开放接口连接。11.1.2网络管理协议简介NETCONF(NetworkConfigurationProtocol,网络配置协议)提供了一种网管和网络设备之间通信的机制,网络管理员可以利用这套机制增加、修改、删除网络设备的配置,获取网络设备的配置和状态信息。网络设备提供了规范的应用程序编程接口(API),网管可以通过NETCONF使用这些API管理网络设备。在SDN领域,NETCONF是SDN网络南向接口协议之一,SDN控制器通过NETCONF对网络设备进行配置管理。NETCONFClientDeviceDevice1Device2Device3NetworkNETCONFServerNETCONF11.1.2网络管理协议简介NETCONF是一种基于XML的网络配置协议,它存在的目的在于用可编程的方式实现网络配置的自动化,从而简化、加速网络服务地部署。NETCONF的一个重要特点是NETCONF协议实现可以直接使用设备已有的功能模块。2种角色NETCONF客户端NETCONF服务器1种典型管理方式IP网络NETCONF消息SSH11.1.2网络管理协议简介NETCONF与SNMP比较项目NETCONFSNMP配置保护支持。NETCONF提供锁定机制,防止多用户操作产生冲突不支持配置备份支持。NETCONF提供多个配置数据库(以下简称数据库),数据库之间可以互相备份不支持配置查询支持。NETCONF定义了过滤功能,可查询某个节点的全部配置数据,大批量数据收集时比SNMP快10倍支持。SNMP能够对某个表的一条或多条记录进行操作,查询中需要多次交互才能够完成扩展性(1)协议模型采取分层定义,各层之间相互独立,对协议中的某一层进行扩展时,能够不影响其他层协议。(2)协议采用了XML编码,使得协议在管理能力和系统兼容性方面具有一定的可扩展性。因此,NTECONF扩展性好扩展性差安全性NETCONF利用现有的安全协议提供安全保证,如SSH和SOAP,并不与具体的安全协议绑定。在使用中,NETCONF要比SNMP更灵活仅SNMPv3版本提供认证加密机制,但全部为协议自己定义,没有扩展的余地11.1.2网络管理协议简介NETCONF网络架构NETCONF整套系统必须包含至少一个NMS(NetworkManagementSystem)作为整个网络的网管中心,NMS运行在NMS服务器上,对设备进行管理。网络管理系统中的主要元素:NETCONFClientNETCONFServer11.1.2网络管理协议简介NETCONF协议框架NETCONF协议分为四层,由下至上分别是内容层、操作层、消息层、安全传输层。层面示例说明第一层:安全传输层BEEP,SSH,SSL安全传输层为NETCONF客户端(Client)和服务器端(Server)之间交互提供通信路径第二层:消息层<rpc>,<rpc-reply>消息层提供了一种简单的、不依赖于传输协议的RPC请求和响应机制。客户端采用<rpc>元素封装操作请求信息,并通过一个安全的、面向连接的会话将请求发送给服务器,而服务器将采用<rpc-reply>元素封装RPC请求的响应信息(即操作层和内容层的内容),然后将此响应信息发送给请求者第三层:操作层<get-config>,<edit-config>,<notification>操作层定义了一系列在RPC中应用的基本操作,这些操作组成了NETCONF基本能力第四层:内容层配置数据内容层描述了网络管理所涉及的配置数据,而这些数据依赖于各制造商设备11.1.2网络管理协议简介NETCONF建模语言NETCONF协议使用XML作为编码格式。基于XML网络管理的主要思想是利用XML的强大数据表示能力,使用XML描述被管理数据和管理操作,使管理信息成为计算机可以理解的数据库,提高计算机对网络管理数据的处理能力,从而提高网络管理能力。NETCONF协议当前有Schema和YANG两种建模语言。Schema是为描述XML文档而定义的一套规则。YANG是专门为NETCONF协议设计的数据建模语言11.1.2网络管理协议简介RESTCONF协议随着网络规模的增大、复杂性的增加,自动化运维的需求日益增加。网络发展中对设备编程接口提出了新要求,希望能够提供支持WEB应用访问和操作网络设备的标准化接口。NETCONF提供基于RPC机制的应用编程接口,要满足新的需求就会抛弃NETCONF本身的特色,RESTCONF因此应运而生。RESTCONF是在融合NETCONF和HTTP的基础上发展而来的。RESTCONF以HTTP的方法提供了NETCONF的核心功能,编程接口符合IT业界流行的RESTful风格,为用户提供高效开发WEB化运维工具的能力。11.1.2网络管理协议简介RESTCONF与NETCONF比较RESTCONF使用HTTP的操作,无状态,无事务机制,无回滚,只支持对设备运行配置库的修改。NETCONF操作设备支持多个配置库,有事务机制,有回滚。项目RESTCONF+YANGNETCONF+YANG传输通道(协议)基于HTTP访问设备资源,提供的编程接口符合IT业界流行的RESTful风格。传输层首选推荐SSH(SecureShell)协议,XML信息通过SSH协议承载。报文格式采用XML或JSON编码。采用XML编码。操作特点RESTCONF的操作简单,例如:RESTCONF支持增、删、改、查操作,仅支持<running/>配置数据库。RESTCONF操作方法无须两阶段提交,操作直接生效NETCONF的操作复杂,例如:NETCONF支持增、删、改、查,支持多个配置数据库,也支持回滚等。NETCONF需要两阶段提交(即先提交参数,再commit参数)。11.1.2网络管理协议简介RESTCONF网络架构RESTCONFClient:客户端利用RESTCONF协议对网络设备进行系统管理。客户端向服务器发送请求,可以实现创建、删除、修改或查询一个或多个数据。RESTCONFServer:设备作为服务器端,服务器用于维护被管理设备的信息数据并响应客户端的请求,把数据返回给发送请求的客户端。服务器收到客户端的请求后会进行解析并处理请求,然后给客户端返回响应。11.1.2网络管理协议简介Telemetry协议Telemetry是一项远程从物理设备或虚拟设备上高速采集数据的技术。设备通过推模式(PushMode)周期性的主动向采集器上推送设备的接口流量统计、CPU或内存数据等信息,相对传统拉模式(PullMode)的一问一答式交互,提供了更实时更高速的数据采集功能。分析器设备采集器控制器

Telemetry上送11.1.2网络管理协议简介传统网络监控方式(如SNMPget和CLI),存在如下不足,管理效率越来越低,已不能满足用户需求的演进:通过拉模式来获取设备的监控数据,不能监控大量网络节点,限制了网络增长。精度是分钟级别(5-15min),只能依靠加大查询频度来提升获取数据的精度,但是这样会导致网络节点CPU利用率高而影响设备的正常功能。由于网络传输时延的存在,监控到的网络节点数据并不准确。SNMPPullingModelsFlowNetStream数据收集数据分析SamplingModel网络纠错11.1.2网络管理协议简介Telemetry与传统网络监控方式比较项目TelemetrySNMPgetSNMPTrapCLISYSLOG工作模式推模式拉模式推模式拉模式推模式精度亚秒级分钟级秒级分钟级秒级是否结构化YANG模型定义结构MIB定义结构MIB定义结构非结构化非结构化11.1.2网络管理协议简介Telemetry数据订阅定义了数据发送端和数据获取端交互关系。数据搜集数据订阅数据推送数据生成数据源UDPNP数据分析Telemetry订阅方式分为两种:静态订阅和动态订阅。静态订阅是指设备作为客户端,采集器作为服务端。由设备主动发起到采集器的连接,进行数据采集上送。多用于长期巡检。动态订阅是指设备作为服务端,采集器作为客户端发起到设备的连接。由设备进行数据采集上送。多用于短期监控。采集器设备静态配置设备主动上送(dialout)CLI/网管采集器设备静态订阅动态订阅动态订阅(dialin)11.1.2网络管理协议简介广义的Telemetry是一个闭环的自动化运维系统,由网络设备、采集器、分析器和控制器等部件组成,分为网管侧和设备侧Telemetry静态订阅的业务流程静态配置推送采样数据读取数据分析数据调整网络参数11.1.2网络管理协议简介Telemetry动态订阅的业务流程动态配置推送采样数据读取数据分析数据调整网络参数11.1.2网络管理协议简介OpenFlow协议OpenFlow是SDN架构中控制器与交换机之间的一种南向接口协议。OpenFlow允许控制器直接访问和操作网络设备的转发平面,这些网络设备可能是物理上的交换机,也可能是虚拟的交换机。协同应用层控制层转发层API接口OpenFlow协议APP转发器SDN控制器转发器转发器11.1.2网络管理协议简介OpenFlow体系结构控制器OpenFlow交换机OpenFlow专用交换机OpenFlow兼容型交换机OpenFlowAgent转发数据库用户策略表11.1.2网络管理协议简介OpenFlow工作原理控制器对交换机的控制和管理可以通过OpenFlow协议实现。首先,控制器和交换机之间通过建立OpenFlow通道,实现控制器与交换机之间的信息交互;如果交换机与多个控制器建立OpenFlow多连接,那么此时控制器会将自己的角色通过OpenFlow通道告知交换机。随后,控制器将转发信息数据库或用户策略表通过OpenFlow通道下发到交换机;交换机根据转发信息数据库进行协议计算生成ARP表项,从而完成数据的转发;或者根据用户策略表信息,完成数据转发。11.1.2网络管理协议简介通道建立与维护实现控制器和交换机之间的信息交互之前,需要建立OpenFlow通道,OpenFlow通道建立之后需要进行维护,保证OpenFlow通道的稳定性。11.1.2网络管理协议简介控制器角色通知在建立OpenFlow通道期间,交换机需要与其配置的所有控制器建立连接,并且要保证每个OpenFlow连接的连通性。在OpenFlow通道建立成功后,控制器会主动发送携带控制器角色等信息的ROLE_REQUEST报文。11.1.2网络管理协议简介转发数据库下发控制器只将部分数量大、变化频繁的协议计算收集到控制器生成转发数据库并通过OpenFlow协议下发到设备,以辅助设备增加计算能力。11.1.2网络管理协议简介用户策略表下发控制器下发的用户策略表是由用户在控制器上创建的,用于指导报文转发。11.1.2网络管理协议简介报文透传控制器与交换机之间通过标准的Packet-in和Packet-out报文进行报文的透传。Packet-in:交换机将获得的信息通过Packet-in报文上送到控制器。Packet-out:控制器将信息通过Packet-out报文下发到交换机。11.2Python自动化运维Python语言作为当下最热门的语言之一,简单、易学、接近自然思维、可移植性高等特点,使之成为自动化运维的必备工具。运用Python编程语言,可以让程序代替人力去自动化运维,解决网络运维中实际问题,告别枯燥的重复工作,提升运维效率和满意度。11.2.1Python基础Python是一种面向对象的解释性计算机程序设计语言,由荷兰人GuidovanRossum创造,第一个公开发行版发行于1991年。Python程序代码简洁、功能强大,相比其他编程语言更加易于学习。目前,Python是一种广泛使用的高级编程语言。编译型语言(源代码)解释型语言(源代码)编译器可执行文件解释器:逐行解释源代码操作系统(Windows/Linux/MacOS)CPU(X86架构/ARM架构)11.2.1Python基础Python开发环境Windows系统下配置Python开发环境软件下载。在Python官方网站下载Windows安装包,下载完成后,双击安装即可。注意在高级选项中,要选中“AddPythontoenvironmentvariable”选项,其他步骤保存默认设置即可。安装完成后,在系统命令行窗口输入【Python】命令即可进入Python命令行界面。11.2.1Python基础Python变量变量,顾名思义就是可以改变的量。Python中可以通过变量赋值这个操作来将变量指向一个对象,例如,下面的a=10即是一个最简单的变量赋值的示例:变量在命名时,需要遵守一些规则,否则将会引发系统错误。变量名只能包含字母、数字和下划线。变量名可使用字母或下划线开头,但不能以数字开头。例如:变量可命名为“vendor_1”,但不能命名为“1_vendor”。变量名不能包含空格。例如:变量不能命名为“ipaddr”。不能讲Python的关键字和函数名用作变量名。例如:“print”不能作为变量名。>>>a=1011.2.1Python基础Python数据类型数字(Number)整数(Int)浮点数(Float)布尔值(Bool),布尔值包括True和False两个值。>>>a=123456>>>type(a)<class'int'>>>>a=3.1415>>>type(a)<class'float'>>>>a=1>>>a==1True>>>a==2False11.2.1Python基础Python数据类型(续)字符串(Sring)Python中字符串是一种相当灵活的数据类型,内容可以为空,可以为汉字或英文字母,可以为整数或小数,可以为标点符号等,只需以引号开始和结尾即可,引号可以为单引号、双引号、或三引号,但字符串的开始和结尾引号必须一致。>>>a='CloudEngineS6730-S24X6Q’>>>a'CloudEngineS6730-S24X6Q’>>>b=“CloudEngineS6730-S24X6Q”>>>b'CloudEngineS6730-S24X6Q’>>>c='''CloudEngineS6730-S24X6Q'‘’>>>c'CloudEngineS6730-S24X6Q'11.2.1Python基础Python数据类型(续)列表(List)列表是一组有序的集合,以中括号“[]”表示,列表里的数据项被称为元素,每个元素之间以逗号“,”隔开,元素的数据类型可以不相同。例如,创建包含3组IP地址的列表:列表是有序的集合,因此我们可以使用元素的位置或索引号来访问列表中的元素。在Python中,第一个列表元素的索引号为0,而不是1。下面举例说明如何使用索引号访问和更新列表中的元素:>>>ipaddr

=

['1','2','3']>>>ipaddr[0]'1’>>>ipaddr[2]='4’>>>ipaddr['1','2','4']11.2.1Python基础Python数据类型(续)集合(Sets)集合是一组无序的集合,里面没有重复的数据。创建集合是使用“{}”,但如果要创建一个空集合,必须使用函数set()。>>>vendors={'Huawei','Cisco','Juniper’}>>>vendorsset(['Huawei','Cisco','Juniper'])>>>vendors=set()>>>vendorsset([])11.2.1Python基础Python数据类型(续)元组(Tuple)元组和列表的大部分特性都是相同的,不同之处:(1)元组中的元素是不可修改的,而列表中的元素是可以修改的;(2)元组以小括号“()”表示,而列表以中括号“[]”表示。>>>vendors=('Huawei','Cisco','Juniper’)>>>type(vendors)<type'tuple'>11.2.1Python基础Python数据类型(续)字典(Dictionary)字典是无序的键值对(key-valuepair)的集合,以大括号“{}”表示,元素以逗号“,”隔开;每组元素由键(key)和值(value)构成,中间以冒号“:”隔开,冒号的左边为键,右边为值。键的数据类型可为字符串,常数,浮点数或者元组;值可为任意的数据类型。>>>dict={'Vendor':'Huawei','Model':'CloudEngineS6730-S24X6Q','Ports':48}>>>dict{'Model':'CloudEngineS6730-S24X6Q','Vendor':'Huawei','Ports':48}>>>type(vendors)<type'tuple’>\\这里创建了一个变量名为dict的字典,该字典有3组键值对。11.2.1Python基础Python分支结构常见的编程语言都有三大结构:顺序结构、分支结构和循环结构。其中,顺序结构就是按照语句顺序自上而下一句接一句执行,而分支结构则是会绕过一些语句执行。在Python中,分支结构语句由if、elif和else三种语句组成。其中,if为强制语句,可以单独使用;elif和else为选择语句,不能单独使用。下面分别举例说明:ifScores>=60:print"恭喜,您已及格!"\\判断当用户的分数大于等于60时,打印“恭喜,您已及格!”ifScores>=60:print"恭喜,您已及格!“else:print"很遗憾,您没有及格!“\\判断当用户的分数大于等于60时,打印“恭喜,您已及格!”,当用户分数小于60时,打印“很遗憾,您没有及格!”11.2.1Python基础Python循环结构while语句while语句每当执行一次写在它下面的执行语句,程序都会回到while条件语句处,重新判断条件是否为True,如果为True,程序继续执行;否则,while程序立即终止。下面通过举例说明:n=100sum=0counter=1whilecounter<=n:sum=sum+countercounter+=1print("1到%d之和为:%d"%(n,sum))\\使用while语句计算1~100数字之和11.2.1Python基础Python循环结构(续)for语句虽然都是循环结构语句,但for语句和while语句完全不同,while语句是结合判断语句决定循环的开始和结束,而for语句则是遍历一组可迭代的序列,遍历结束后for语句也随即停止。for语句的基本语法格式为:其中,<variable>是一个变量的名称,代表序列中的每一个元素,<sequence>为可迭代的序列(字符串、列表、元组等)。for<variable>in<sequence>:

语句else:

语句11.2.1Python基础Python函数内置函数内置函数,就是加载Python解释器后,可以直接使用的函数。例如:常用print()、input()、dir()等。用户自定义函数在Python中,我们使用关键字def定义函数,语法格式如下:def函数名称(参数1,参数2,…):"文件字符串“

语句11.2.1Python基础Python模块import语句如果希望引入某个模块,可以使用import加上模块的名称,这样会导入指定模块中的所有成员(包括变量、函数、类等)。不仅如此,当需要使用模块中的成员时,需用该模块名(或别名)作为前缀,否则Python解释器会报错。>>>importmath>>>math.sin(90)0.8939966636005579>>>frommathimportsin>>>sin(90)0.893996663600557911.2.2Paramiko模块Paramiko简介Paramiko是Python语言编写的支持以加密和认证方式,进行远程控制模块;它遵循SSH2协议,使用Paramiko可以方便地通过SSH协议执行远程主机的程序或脚本。Paramiko有两个重要的基础类:Channel类和Transport类。Channel类:是对SSH2Channel的抽象类,作用类似于套接字(Socket),是SSH传输的安全通道。常用的方法有:execcommand()、exit_status_ready()、recv_exit_status()、close()等。Transport类:是核心协议的实现类,是一种加一个加密的流隧道。常用的方法有:send()、recv()、close()等密的会话,使用时会同步创建。11.2.2Paramiko模块Paramiko核心组件SFTPClient类SFTPClient封装了SFTP客户端,主要用来实现执行远程文件操作(文件上传、下载、修改文件权限等)。常用的方法有:from_transportputgetfrom_transport(cls,t)put(localpath,remotepath,callback=None,confirm=True)get(remotepath,localpath,callback=None)11.2.2Paramiko模块Paramiko核心组件(续)SSHClient类SSHClient类封装了Transport类、Channel类及SFTPClient类,通常用于执行远程命令。常用的方法有:Connectexec_commandload_system_host_keysset_missing_host_policyinvoke_shellconnect(hostname,port=22,username=None,password=None,timeout=None)exec_command(command,bufsize=-1,timeout=None)load_system_host_keys(self,filename=None)set_missing_host_policys(AutoAddPolicy/RejectPolicy/WarningPolicy/)invoke_shell()11.2.2Paramiko模块Paramiko模块安装在使用Python编程的过程中,我们会经常用到第三方库包,而pip作为Python最优秀的包管理工具之一,可以方便Python库包的安装管理。在命令行中输入【pip--version】命令,如果有相关的版本信息,则说明pip工具已经安装,可以直接使用。安装完成后,进入Python解释器,导入Paramiko模块,如果没有报错,就说明Paramiko模块安装成功。pipinstallparamikoPythonimportparamiko11.2.2Paramiko模块Paramiko应用举例使用SFTPClinent上传和下载文件#-*-coding:UTF-8-*-importparamiko\\导入paramiko模块tran=paramiko.Transport("0",22)\\获取Transport实例tran.connect(username="root",password="Huawei@123")

\\连接远程服务器print("连接成功")sftp=paramiko.SFTPClient.from_transport(tran)\\获取SFTPClient实例put_localpath="D:/Python/upload/upload.py"\\设置上传的本地文件路径变量put_remotepath="/home/upload“\\设置上传的远程文件路径变量get_remotepath='/home/download/download.py’\\设置下载的本地文件路径变量get_localpath='D:/Python/download’

温馨提示

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

评论

0/150

提交评论