AODV协议详解

合集下载

aodv路由协议工作过程

aodv路由协议工作过程

aodv路由协议工作过程AODV(Ad hoc On-Demand Distance Vector)是一种用于无线自组织网络(ad hoc network)的路由协议。

它是一种基于距离向量的路由算法,可以在网络中动态地选择最佳路径来传输数据包。

本文将详细介绍AODV路由协议的工作过程。

AODV路由协议的工作过程可以分为四个阶段:路由发现阶段、路由维护阶段、路由错误处理阶段和路由释放阶段。

在路由发现阶段,当一个节点需要发送数据包到目标节点时,它首先会向周围节点发送路由请求(Route Request)消息。

这个消息包含了目标节点的地址和源节点的地址。

当一个节点收到路由请求消息时,它会检查自己的路由表,如果没有关于目标节点的路由信息,它会将该消息广播给它的邻居节点。

这样,路由请求消息会不断地传播,直到达到目标节点或者遇到已知路由的节点。

在路由维护阶段,当目标节点或者有关的中间节点收到路由请求消息时,它们会生成路由回复(Route Reply)消息,并将它发送回源节点。

路由回复消息中包含了从目标节点到源节点的最佳路径信息。

当源节点收到路由回复消息后,它将更新自己的路由表,并开始向目标节点发送数据包。

在路由错误处理阶段,如果某个节点无法到达目标节点或者中间节点,它会发送路由错误(Route Error)消息。

这个消息会被广播给所有与这个节点有关的节点。

当一个节点收到路由错误消息后,它会将与错误相关的路由从自己的路由表中删除,并向其他节点发送路由错误消息。

这样,整个网络中的节点都会知道该路径已经不可用。

在路由释放阶段,当一个节点不再需要与目标节点通信时,它可以发送路由释放(Route Release)消息。

这个消息会被广播给与这个节点有关的所有节点,以通知它们可以删除与目标节点相关的路由信息。

AODV路由协议的工作过程充分利用了网络中节点之间的相互通信来动态地选择最佳路径。

它能够在网络拓扑发生变化时及时更新路由信息,保证数据包能够成功传输。

AODV路由协议中文说明

AODV路由协议中文说明

内容目录1导言 (3)2概述 (4)3AODV术语 (5)4适用性综述 (7)5消息格式 (8)6AODV操作 (13)管理序列号 (13)路由表项和先驱列表 (15)生成路由请求 (16)控制路由请求消息的传播 (17)处理和转发路由请求 (18)生成路由回复 (20)接受和转发路由回复 (22)对单向连接的操作 (23)Hello消息 (24)维护本地连接 (25)路由错误,路由超时和路由删除 (26)本地修复 (28)重启后的操作 (30)接口 (31)7AODV和集群网络 (31)8AODV在其他网络中的应用 (32)9扩展 (34)10参数配置 (35)网络组诺基亚研发中心 C. Perkins RFC:3561加州大学圣芭芭拉分校 E. Belding-Royer类别:试验版辛辛那提大学 S. Das2003年7月Ad hoc网络中基于距离数组的按需(AODV)路由协议本备忘状态本备忘定义的只是一个试验性质的网络社区协议而已,它不是任何一种类型的网络标准。

我们非常需要各种讨论和建议用于改进这个协议。

本备忘录的分发不受任何限制。

版权声明复制权属于整个因特网社区,保留所有权利。

摘要本协议用于特定网络中的可移动节点。

它能在动态变化的点对点网络中确定一条到目的地的路由,并且具有接入速度快,计算量小,内存占用低,网络负荷轻等特点。

它采用目的序列号来确保在任何时候都不会出现回环(甚至在路由控制信息出现异常的时候也是如此),避免了传统的距离数组协议中会出现的很多问题(比如无穷计数问题)。

目录1导言AODV算法旨在多个移动节点中建立和维护一个动态的,自启动的,多跳路由的专属网络。

AODV使得移动节点能快速获得通向新的目的节点的路由,并且节点仅需要维护通向它信号所及范围内的节点的路由,更远的节点的路由信息则不需要维护。

网络中连接的断开和异动会使得网络拓扑结构发生变化,AODV使得移动节点能适时对这种变化做出响应。

AODV简介

AODV简介

2 AODV路由发现
正向路由的建立:RREQ分组最终将到达一个节点,该节点 可能是目的节点,或者这个节点由到达目的节点的路由。 如果这个中间节点有到达目的的路由项,它就会比较路由 项里的目的序列号和RREQ分组里的目的序列号的大小来判 断自己已有的路由是否是比较新的。如果是就对收到的 RREQ分组做出响应,否,则更改RREQ中的目的节点序列号 至当前最大,跳数字段加1,然后继续广播。 在RREP转发回源节点的过程中,沿着这条路径上的每一个 节点都将建立到目的节点的正向路由,也就是记录下RREP 是从哪一个邻居节点来的地址以及记录下RREP中目的节点 的最新序列号。
链路断广播RRER:
4 AODV优点
使用序列号机制,避免路由环路 支持中间结点应答,减少了广播数 节点只存储需要的路由,减少了内存的要求和不必要的复 制。 时延较大,不支持单向信道。
2 AODV路由发现
AODV借鉴了DSDV中的列号的思想,每一个节点都维持了独立序列 号计数器,利用这种机制就能有效地防止路由环的形成。当源节点想 与另外一个节点通信,而它的路由表中又没有相应的路由信息时,源 节点通过向自己的邻居广播RREQ(Route Requests)分组来发起一 次路由发现过程。 反向路由的建立:当RREQ分组从源节点转发,沿途所经过的节点都 要自动建立到源节点的反向路由。节点通过记录收到的第一个RREQ 分组的邻居地址来建立反向路由。
AODV路由发现:
3 AODV路由维护
(1)与活动路由无关的节点移动,并不影响信源到信宿 的寻径。 (2)如果信源节点移动导致路由不可用,则由信源重新 发起路由发现过程。 (3)当信宿节点或活动路由的中间结点移动,导致链路 中断,则链路的"上游节点“主动发送一个RERR,该 RERR的信宿大于其所获取的信宿序列号,跳计数设为无 穷大,并广播到所有活动邻居。

AdHoc网络中AODV路由协议的实现及数据业务处理中期报告

AdHoc网络中AODV路由协议的实现及数据业务处理中期报告

AdHoc网络中AODV路由协议的实现及数据业务处理中期报告中期报告:AdHoc网络中AODV路由协议的实现及数据业务处理1. 项目背景与意义随着移动终端设备的普及和无线通信技术的发展,AdHoc网络成为了一种越来越重要的通信方式。

AdHoc网络是一种无需基础设施的网络,由移动终端设备自组成。

相比传统有线网络和基础设施无线网络,AdHoc 网络能够更加灵活地应对复杂环境,并能够更加迅速地部署实施。

在AdHoc网络中,路由协议是起着至关重要的作用。

AdHoc网络由于网络拓扑变化频繁,节点移动、丢包等问题更加严重,因此泛洪等传统路由协议在AdHoc网络中显得不太适用。

AODV(Ad-Hoc On Demand Distance Vector Routing Protocol)是一种基于距离向量的路由协议,在AdHoc网络中得到了广泛应用。

AODV路由协议是一种基于需求的路由协议,当源节点需要向目标节点发送数据时,它会向周边节点发出寻找路由的请求,然后根据返回的路由信息建立路由并发送数据。

AODV路由协议具有快速、稳定、低开销等优点,因此被广泛应用于AdHoc网络中。

本项目旨在通过对AODV路由协议的实现,探索AdHoc网络中路由协议的应用。

本项目将实现AODV路由协议,并在此基础上实现AdHoc网络中常见的数据业务处理,包括数据的发送、接收、存储等。

通过本项目的实现,将加深对AdHoc网络的理解,为AdHoc网络的应用和发展做出贡献。

2. 工作进展本项目已完成了部分工作,包括:2.1 AODV路由协议的实现本项目利用C++语言,通过对AODV协议的研究和分析,实现了AODV路由协议。

该实现包括AODV的路由发现、路由维护、路由更新等功能,能够满足AdHoc网络中节点之间通信的路由需求。

在实现中,我们充分考虑了节点移动、丢包等问题,并进行了有效地处理和优化。

2.2 数据业务处理的设计与实现在AODV路由协议的基础上,本项目还开展了数据业务处理的设计和实现。

无线mesh网络aodv路由协议分析

无线mesh网络aodv路由协议分析

湘潭大学学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。

除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。

对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。

本人完全意识到本声明的法律后果由本人承担。

作者签名:日期:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。

本人授权湘潭大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。

涉密论文按学校规定处理。

作者签名:日期:年月日导师签名:日期:年月日摘要无线Mesh网络(Wireless Mesh Network ,WMNs)具有快速部署和自组织等特点,这使得它非常适应于临时的按需网络部署场景。

WMNs对于热点地区的基础设施网、以及能提供低成本回程的传感器网和偏远农村蜂窝网基站,都是一种具有很大吸引力的技术。

WMNs的自组织性、自愈性、有效的移动用户管理和跟踪机制,高容量和高速率的特性,迫切需要高性能的路由算法。

近年来,路由算法成为WMNs发展中的一个研究热点。

WMNs从移动Ad Hoc 网络中借鉴了许多路由选择方法作为路由的解决方案,但是这些方法都不太理想或者没有达到性能的最优化,且没有利用到WMNs自身的特点。

本文提出了一个改进的分层AODV路由协议(IH-ADOV),它表现出了更好的可扩展性和网络性能,当一条路由丢失时,它可使寻找替代路由的路由开销得到降低。

此外,在IH-AODV中,我们还提出了一种新技术,即最新链路发现机制。

它旨在对加入簇的节点进行快速路由发现,能够提高路由发现的速度和效率。

对于路由维护,这种技术也非常有用。

在新算法中,本论文定义静态节点为Way Point(WP)节点,其他节点称为Cluster Member(CM)簇成员节点。

AODV协议详解

AODV协议详解

AODV协议详解1 AODV 报文格式AODV 有三种基本的协议报文类型:RREQ 报文、RREP 报文和RRER 报文。

1.1 RREQ 报文a. 对RREQ 的处理接收到RREQ 的结点做如下处理:(1)创建一个表项,先不分配有效序列号,用于记录反向路径。

(2)如果在“路由发现定时”内已收到一个具有相同标识的RREQ 报文,则抛弃该报文,不做任何处理;否则,对该表项进行更新如下:I.下一跳结点=广播RREQ 的邻居。

II.跳数=RREQ 报文的“跳计数”字段值。

III.设置表项的“过时计时器”。

(3)如果满足以下条件,则结点产生“路由回答报文”RREP,并发送到信源;否则更新RREQ 报文并广播更新后的RREQ 报文。

I.该结点是信宿。

II.结点的路由表中有到信宿的活动表项,且表项的信宿序列号大于RREQ中的信宿序列号。

(4)更新RREQ 报文并广播更新后的RREQ 报文I.信宿序列号=本结点收到的信宿相关的最大序列号。

II.跳计数加1。

1.2 RREP 报文(1)信宿结点产生RREP执行如下操作:I.如果收到相应的RREQ 的信宿序列号与信宿维护的当前序列号相等,则信宿将自己维护的序列号加1,否则不变。

II.跳计数=0。

III.定时器值。

(2)中间结点产生的RREP执行如下操作:I.本结点获取的该信宿的最大序列号。

II.跳计数=本结点到信宿的跳数(查相应表项即可得到)。

III.更新本结点维护的“前向路由表项”的下一跳和“反向路由表项”的前一跳b. 对RREP 的处理结点对接收到的RREP 作如下处理。

(1)如果没有与RREP 报文中的信宿相匹配的表项,则先创建一个“前向路表”空表项。

(2)否则,满足如下条件对已有表项进行更新。

条件:I.现有表项的信宿序列号小于RREP 报文中的序列号。

II.现有的表项没有激活。

III.信宿序列号相同,但RREP 报文的“跳计数”值小于表项相对应的值;通过更新或创建,产生一个新的前向路由。

aodv反向路由的建立过程

aodv反向路由的建立过程

aodv反向路由的建立过程
AODV(Ad hoc On-Demand Distance Vector)是一种反应式路
由协议,它在需要进行数据传输时才会建立路由。

AODV的反向路由建立过程如下:
1. 数据源节点发现自身没有到达目标节点的有效路由。

在数据源节点找不到到达目标节点的路由时,将广播RREQ(Route REQuest)请求消息。

2. 所有接收到RREQ消息的节点会判断自身是否是目标节点。

如果是目标节点,该节点将发起一个RREP(Route REPly)
回复消息,并携带着自己到数据源节点的最短路径信息。

3. 如果接收到RREQ消息的节点不是目标节点,则会检查自
己的路由缓存表(Route Cache)中是否有到达目标节点的有
效路由。

如果有,该节点将返回一个RREP消息给数据源节点,回复的路径信息是从该节点到目标节点的最短路径。

4. 如果接收到RREQ消息的节点既不是目标节点,也没有到
达目标节点的有效路由,则会继续转发RREQ消息。

5. 在转发RREQ消息时,节点会维护一个反向路由表(Reverse Path Table),记录从数据源节点到达自身的下一跳
节点。

6. 如果一个节点接收到重复的RREQ消息,它会舍弃该消息
而不再转发。

7. 当RREP消息到达数据源节点后,数据源节点将会更新自己的路由缓存表,记录到达目标节点的最短路径信息。

8. 如果某个节点接收到RREP消息并发现它不在该路径上,则会更新自己的反向路由表。

通过上述反向路由建立过程,AODV协议可以在无线自组织网络中快速建立起有效的节点间路径,实现数据的传输。

AODV协议详解

AODV协议详解

AODV协议详解AODV(Ad-hoc On-Demand Distance Vector)是一种用于自组织无线网络的路由协议。

它是基于距离矢量路由算法的一种改进,并在无线传感器网络(WSN)和移动自组网(MANET)中广泛应用。

AODV的主要目标是在网络中实现有效的路由,同时减少网络资源的消耗。

AODV协议通过以下方式工作。

当一个节点需要向目标节点发送数据时,它首先广播一个路由请求(RREQ)消息以查询目标节点的路由信息。

接收到这个消息的节点会更新路由表,并向源节点发送一个路由回复(RREP)消息,该消息包含到目标节点的路径信息。

在此过程中,源节点可以选择最佳的路径,并将其添加到路由表中。

当源节点收到RREP消息后,它就可以开始向目标节点发送数据了。

在途中,如果网络拓扑发生变化(例如节点移动或节点失效),AODV协议会更新路由表以反映这些变化。

在节点间的通信过程中,AODV协议使用一种称为序列号的技术来区分新的路由信息和旧的路由信息,并避免出现循环路径。

每次路由更新时,序列号都会递增,并在路由表中进行记录。

另外,AODV协议还支持源路由。

源路由是指由源节点指定的完整路由路径,数据包将按照此路径传输。

这意味着源节点可以控制数据包的传输路径,可以避免路径和路由发现的开销,并减少网络资源的消耗。

但是,源路由在网络中可能会面临节点失效、链路中断和网络拓扑变化等问题,因此需要进行有效的处理。

在AODV协议中,节点还可以进行路由维护。

路由维护是指节点在路由表中更新、维护和删除路由信息以反映网络状态的变化。

AODV协议使用一些机制来处理链路中断、节点失效和网络分割等问题。

当节点发现路由不可用时,它会向源节点发送一个路由错误(RERR)消息来通知源节点,并更新自身的路由表。

总结起来,AODV协议是一种用于自组织无线网络的强大路由协议。

它具有快速路由发现、低资源消耗和多路径支持等特点,可以在无线传感器网络和移动自组网等环境中提供高效的数据传输。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

AODV协议详解
1 AODV 报文格式
AODV 有三种基本的协议报文类型:RREQ 报文、RREP 报文和RRER 报文。

1.1 RREQ 报文
a. 对RREQ 的处理
接收到RREQ 的结点做如下处理:
(1)创建一个表项,先不分配有效序列号,用于记录反向路径。

(2)如果在“路由发现定时”内已收到一个具有相同标识的RREQ 报文,则抛弃该报文,不做任何处理;否则,对该表项进行更新如下:
I.下一跳结点=广播RREQ 的邻居。

II.跳数=RREQ 报文的“跳计数”字段值。

III.设置表项的“过时计时器”。

(3)如果满足以下条件,则结点产生“路由回答报文”RREP,并发送到信源;否则更新RREQ 报文并广播更新后的RREQ 报文。

I.该结点是信宿。

II.结点的路由表中有到信宿的活动表项,且表项的信宿序列号大于RREQ中的信宿序列号。

(4)更新RREQ 报文并广播更新后的RREQ 报文
I.信宿序列号=本结点收到的信宿相关的最大序列号。

II.跳计数加1。

1.2 RREP 报文
(1)信宿结点产生RREP
执行如下操作:
I.如果收到相应的RREQ 的信宿序列号与信宿维护的当前序列号相等,则信宿将自己维护的序列号加1,否则不变。

II.跳计数=0。

III.定时器值。

(2)中间结点产生的RREP
执行如下操作:
I.本结点获取的该信宿的最大序列号。

II.跳计数=本结点到信宿的跳数(查相应表项即可得到)。

III.更新本结点维护的“前向路由表项”的下一跳和“反向路由表项”的前一跳
b. 对RREP 的处理
结点对接收到的RREP 作如下处理。

(1)如果没有与RREP 报文中的信宿相匹配的表项,则先创建一个“前向路表”空表项。

(2)否则,满足如下条件对已有表项进行更新。

条件:
I.现有表项的信宿序列号小于RREP 报文中的序列号。

II.现有的表项没有激活。

III.信宿序列号相同,但RREP 报文的“跳计数”值小于表项相对应的值;通过更新或创建,产生一个新的前向路由。

更新:
IV.下一跳=广播RREP 的邻居结点。

V.信宿序列号=RREP 中的信宿序列号。

VI.跳计数加1。

(3)按照上述的过程,任何转发RREP 的结点,都记录了到信宿的下一跳,当RREP到达信源时。

结点地址匹配,不再转发RREP,信源到信宿的前向路由已经建立起来了。

信源可以沿这条前向路径进行数据传输。

1.3 RRER 报文
邻居间周期性的互相广播“Hello”报文,用来保持联系,若在一段时间内没有收到“Hello”报文,则认定为链路断。

例如当结点X、Y 之间链路产生断路使数据无法通过此条链路传至信宿,则结点X 会产生RRER 报文向信源报告此情况。

RRER 通过广播形式传送,维护路由表的结点收到此报文会更新路由表(将X、Y
间的路由设成无效),并转发RRER 报文。

2 协议从接收到一个分组开始的基本流程
AODV 路由协议主要包括以下几个组件:
1、协议实体
2、路由表
3、定时器
(1)广播定时器
(2)周期Hello 报文广播定时器
(3)用于邻居管理的定时器
(4)用于路由缓存的定时器
(5)用于本地修复的定时器
(6)缓存广播ID 的定时器
4、日志记录器
5、路由缓存队列
当协议接收到一个分组,即recv(Packet*, Handler*)函数被调用,函数根据分组类型调用不同的处理函数进行处理。

1、如果是协议分组,则将分组的ttl 值减1,并调用recvAODV(Packet*)函数进行处理。

recvAODV 函数再根据分组的不同类型来调用不同的函数进行处理。

(1)如果接收到的是路由请求分组,则调用recvRequest(Packet*)函数进行处理。

如果该分组由节点自身产生或已经接收过的,会被节点丢弃,并结束处理。

否则,节点将缓存该分组的序列号,并将该分组发送来的路径添加到反向路由中,转发相应分组。

然后,节点根据该分组的目的地址进行判断并调用不同函数进行处理。

如果节点自身即为目的节点,则调用sendReply(nsaddr_t,
u_int32_t,nsaddr_t, u_int32_t, u_int32_t, double)函数进行响应。

如果节点不是目的节点,但知道通往目的节点的路由,则调用sendReply 函数进行响应,并在源和目的前驱列表中分别插入到源和目的的下一跳节点。

否则,不能直接响应该请求,
将跳数加1,并调用forward(aodv_rt_entry*, Packet*, double)函数转发该分组。

在sendReply 函数中,节点首先查找到达目的节点(即发送路由请求分组
的节点)的路由,创建并填充分组,然后调用
Scheduler::instance().schedule()函数来发送该分组。

(2)如果接收到的是路由响应分组,则调用recvReply(Packet*)函数进行处理。

节点首先查询前往分组目的节点的路由,如果不存在则新增一条路由项。

然后,节点更新到该目的节点的路由项,并发送所有相关分组。

如果节点为目的节点则更新路由发现延迟并发送所有相关的分组。

如果节点不是目的节点,但知道通往目的节点的路由,则将跳数加1,调用forward 函数转发该分组,并修改响应的前驱列表。

如果节点不是目的节点,也不知道通往目的节点的路由,则丢弃该分组。

(3)如果接收到的是路由错误分组,则调用recvError(Packet*)函数进行处理。

节点首先清除所有受到影响的路由项,丢弃所有受影响的分组。

然后,如果前驱节点中存在会受该路由错误影响的分组,则调用sendError(Packet*, bool)函数转发该分组。

sendError 函数创建并填充分组,然后调用
Scheduler::instance().schedule()函数来发送该分组。

(4)如果接收到的是Hello 消息分组,则调用recvHello(Packet*)函数进行处理。

节点会将该邻居的信息添加到邻居列表中(或更新该邻居的信息)。

2、如果是数据分组,则节点丢弃已经发送过或者ttl 为0 的分组,并结束处理。

如果分组是由上层协议产生的,则节点添加IP 报头。

随后,节点根据目的路由进行不同处理。

(1)如果目的节点路由未知,则调用rt_resolve(Packet*)函数进行路由解析和转发。

如果目的节点路由在路由表中存在,则直接调用forward 函数进行转发。

如果分组是由节点自身产生的,则将分组保存到缓冲队列中,并调用sendRequest(nsaddr_t)函数查询目的路由。

如果目的路由已知,但正在进行本地修复,则将分组保存到缓冲队列中。

否则,丢弃该分组,并调用sendError 函数报错。

(2)如果目的节点路由已知,则调用forward 进行转发。

节点丢弃ttl 为0 的分组,并根据分组类型决定下一步操作。

如果接收到的是数据分组,且自身为目的节点,则通过调用PortClassifier 对象的recv(Packet*, Handle*)函数将分组交递给高层协议,并结束处理。

否则,节点设置分组属性,并调用Scheduler::instance().schedule (Handler*, Event*, double)函数来发送分组。

其中,Handler 为基类中的属性target_(会根据脚本中的设置指向相应的协议实体), Event 为要发送的分组即可。

以上就是在节点收到分组后的一个处理过程。

以下是各个定时器所做的工作。

1、广播定时器BroadcastTimer 在到时后调用id_purge()函数删除广播项中已超时的项目,并通过调用Scheduler:: instance().schedule()函数来设置下次被调用的时间(Handler 为this 指针,Event 为类属性intr)。

2、周期Hello 报文广播定时器HelloTimer 在到时后调用sendHello()函数向邻居创建并发送Hello 消息,并调用schedule()函数来设置下次被调用的时间。

3、邻居管理定时器NeighborTimer 在到时后调用nb_purge()函数来清除邻居列表中已超时的邻居项,并调用schedule()来设置下次被调用的时间。

nb_purge 会调用nt_delete(nsaddr_t) 函数来清除超时的邻居项,其又会调用
handle_link_failure(nsaddr_t)函数来处理由于邻居节点被删除而引起的路由
变化。

4、路由缓存定时器RouteCacheTimer 在到时后调用rt_purge()函数来清除路由表中已超时的路由项,并丢弃相关的分组,再调用schedule()来设置下次被调用的时间。

5、本地修复定时器LocalRepairTimer 在调用后根据传递的分组的目的地址关闭相应的路由项。

6、缓存广播ID 定时器BroadcastID 用来保存广播分组的ID。

相关文档
最新文档