【NDN IoT】Caching in Named Data Networking for the Wireless Internet of Things 全文翻译

Caching in Named Data Networking for the Wireless Internet of Things
研究关于将命名数据网络中的缓存运用于无线物联网

 

Mohamed Ahmed Hail *, Marica Amadeo+,Antonella Molinaro+, Stefan Fischer*

*Telematics Institute University of LUbeck, Germany, E-mail:{hail.fischer}@itm.uni-luebeck.de

+University Mediterranea of Reggio Calabria, Italy, E-mail: name.surname@unirc.it

 

摘要

           命名数据网络是一个有前景的信息中心未来网络体系结构。除了它作为内容获取方案在有线领域被认为是有潜力的之外,NDN最近被认为是一种可以用于物联网的技术,由于它的创新特征,比如基于名字的路由和网络内存储。特别地,在中间节点缓存可能特别有用,以减少获取延迟,限制网络流量,减轻数据生产者的负载。然而,不像传统的因特网内容,物联网数据是不断变化的,并被生产者周期性地更新。同时,不像因特网路由器,物联网设备可能是资源限制的,依据能源、存储和处理能力而限制。因而,因特网中的缓存算法为非瞬变的因特网流量设计,因特网路由器不能很好地适应物联网领域。

       在本文中,我们考虑无线NDN-IoT网络,并提出了一种新的分布式概率性缓存策略,依赖于数据的更新和设备可能的限制能力(能量层次和存储能力)。提出的方案通过在ndnSIM上的模拟实验评估,结果显示在数据获取和网络能源效率方面,它比传统的NDN缓存机制做的更好。


关键词:

      命名数据网络;信息中心网络;物联网;网络内存储;新鲜度


1  引言

      在物联网愿景中,异构无线设备,范围从小的、约束传感器和制动器到更强大的智能手机和形成网络的车辆,将通过物理大环境和因特网交互,来支持大范围的环境感知服务。相较于传统的因特网主机,比如路由器,PC和笔记本电脑,绝大多数IoT设备在能源、内存和计算能力方面受到限制,并且他们具有移动性。此外,不像因特网内容通过大的时不变文件被特征化,IoT数据通常是小且瞬变的。新信息可能不断生成,例如,感知器周期性地更新环境数据,应用程序对最新的数据包感兴趣。

      由于IoT系统这样明显的特性,研究社团致力于新网络协议的设计,以有效支持IoT通信。除了基于IP的解决方案之外,基于云的方法,信息中心网络范式最近考虑用于IoT。实际上,这个革命性的体系结构的潜力是多方面的,像被因特网研究任务组(IRTF)的ICN研究组(ICNRG)和最近的文献[4]中展示的那样。在ICN中,每个内容包通过使用唯一的持久的位置独立的名字来命名,并被网络节点看作自证明和自识别的数据单元。内容通过消费者直接使用名字获取,而不需要生产者的IP地址。该范式从基于IP的主机中心模型转变到信息中心模型,意味着几种优势,包括更容易获取和共享数据,本地移动支持,网络内缓存和基于内容的安全,这在IoT中特别有用。特别地,网络内存储可以加速数据获取,并减少网络内的流量,由于数据请求可以被更靠近消费者的中间节点满足。这也意味着网络内缓存限制了海量数据对生产者的访问,并通过放松持续连接的需要从接收者解耦生产者。

      尽管网络内缓存在ICN有线网络中被广泛研究,由于信息新鲜度和资源约束设备存在严格要求,传统的缓存算法为因特网所设计,并不能很好地适应IoT。仅仅一些准备工作[6]-[8]考虑在IoT系统中的缓存,但并没有为无线环境提出特定的缓存策略。

      为了弥补该不足,本文聚焦于新的缓存策略的设计,该设计为无线多跳信息中心物联网系统特别定制。在几种ICN实例中,我们参考命名数据网络(NDN)体系结构,该体系结构分别利用简单但健壮的兴趣包和数据包的传输来请求和传送命名数据单元。NDN对不同的新的缓存算法的实现开放,例如,节点可以基于用户定义的策略/算法缓存进来的数据包。

      在该环境中,我们定义pCASTING,一个物联网的概率缓存策略,该策略考虑数据新鲜度和两个设备的特征,即能量层级和存储能力,来动态调整每个节点的缓存概率。提出的策略是完全分布式的,不需要任何额外的信号传输。模拟实验通过ndnSIM实现,实验显示,相较于在NDN中广泛使用的参考缓存方案,pCASTING通过保证更低的获取延迟增加了网络的能源效率,这些参考缓存方案包括通用缓存方案和随机缓存方案。

      本文的下面部分如下组织。第2部分介绍了NDN体系结构和NDN-IoT系统中的缓存的相关工作。第3部分提出了pCASTING提议,第4部分讨论了性能评估。最后,第5部分总结全文。


2  背景和动机


A. 命名数据网络

      NDN被作为一种内容传播体系结构提出,以用于使用层次化的类似URI的内容名字的未来网络,携带兴趣包和数据包。每个NDN节点维持三张表:(i)内容存储(CS),用来缓存进来的数据包;(ii)待定兴趣表(PIT),用来记录已经转发的但还未被满足的兴趣包;(iii)转发信息表(FIB),用作基于内容名字的路由。当节点接收到兴趣包,它首先查看CS,如果在CS中找到匹配数据,节点将发回数据包。否则,如果在PIT中存在匹配条目,兴趣包被丢弃,因为相同的请求已经被转发。否则,一个新的PIT条目被创建,兴趣包转发到存储在FIB中的接口。数据包遵循PIT条目的链条返回消费者,并且数据包可以被存储在中间节点。

      节点中的缓存系统包括(i)缓存决定策略,指定是否缓存进来的数据包;(ii)替代策略,指定当新来的数据包需要缓存,但CS已满,必须擦除什么元素。NDN中默认的缓存策略也叫做在任何地点缓存任何东西(CE2)方案:节点缓存每个进来的数据包,尽管替换通过标准策略执行,比如最近最少使用策略(LRU)。然而,许多论文已经指出通用缓存策略并不高效,比如文献[11],由于高度的内容冗余和可用缓存资源的不高效利用。这是其他方案通常被用在文献中,包括概率性缓存的原因。概率性策略背后的关键想法是NDN节点通过确定的概率p随机缓存进来的数据包,其中0<p<1。CE2策略是概率性方案的特殊案例,其中,p=1。减少p,减少了网络内缓存的概率,并最大化网络中缓存的数据包的多样性。

      像在文献[6]中讨论的那样,NDN在IoT中可能非常高效,它能够工作于链路层之上,而不需要工作于IP协议栈之上的覆盖网,而它意味着额外的内存消耗。近期工作开始在不同的IoT场景中将NDN作为一种从零开始的方法,包括建筑管理系统(BMS)和智能传输系统(ITS),聚焦于命名、安全和转发方面。

 

B. NDN-IoT系统中的缓存

      到目前为止,对于NDN网络,大量的缓存策略被提出,但没有一个专门针对IoT系统和IoT系统的特征的策略。这些策略通常为预记录的多媒体文件设计,比如Youtube视频和类似的被因特网上的用户频繁请求的大内容;他们通常考虑固定的有线连接的内容路由器。值得注意的是,该方案的高性能通常以大的开销和高复杂性的代价获得,这使得他们不适合资源约束(移动)设备。

      当我们特别关注于IoT,NDN网络内缓存的问题在很大程度上都是未被探索的。

      文献[6]工作于与实物大小相同的IoT部署中,实现了NDN的第一个实验研究。作者通过比较不同消费者在缓存禁用时和标准的NDN网络内缓存时内容获取的性能,并评估了缓存的影响。结果显示,由于缓存,无线传输的数量大幅度减少。实际上,尽管资源约束节点的缓存大小最多是1KB数量级,并且信息是转瞬即逝的,缓存仍然是有益的:它增加了内容的可用性,减少了朝向生产者的有损耗的多跳无线路径的数量。此外,一方面,IoT设备的缓存很小,另一方面,IoT内容通常也很小,因而,单独的缓存可以存储几个IoT包。

      文献[7]分析了NDN缓存中IoT信息新鲜度的影响。除了新鲜度参数包括在数据包中之外,在CS中存储多少秒内容可以被认为是有效的,作者提出了一种消费者驱动新鲜度的方法。该机制允许消费者依据兴趣包中的新鲜度指定它的特殊需求,因此CS可以决定它是否有可用信息。结果,作者证明了消费者接收到的数据的精确度有提高。

      第一个研究是关于在Internet内容路由器中缓存IoT内容。它提出了一种分布式概率性缓存算法,路由器通过考虑到源和消费者的跳数,动态地更新了他们的缓存概率、数据新鲜度、速率和新鲜度需求。两个关键概念是提议的原理的阐述。首先,当缓存位置远离生产者时,IoT数据变得不太新鲜,例如,缓存位置越靠近源,获取的数据包越新鲜。第二,从更靠近源而不是消费者的位置获取数据引发了网络上更高的多跳流量负载。因而,算法定义了一个实用功能来处理在(i)来自消费者和生产者的多跳交付,和(ii)交付的数据包的数据新鲜度的预期损耗。

      不像文献[8],聚焦于有线因特网和电力的静态设备,我们认为一个IoT多跳无线网络由(移动)资源约束节点组成,并部署了一个轻量级的缓存决定算法,像在下一节中讨论的那样。

 

3  缓存决定策略


A. 假设

      在我们的场景中,拥有有限的电池能源的N个资源约束节点连接在一个多跳无线网络中。节点是固定的,例如,监控传感器部署于街道、桥梁、建筑或者人类携带的智能手机中。我们假设节点集C={1,..,Nc},Nc<N,作为消费者,而生产者P以一个特定的新鲜度值生成IoT内容。其余节点作为转发者,缓存进来的数据包。

      像在文献[7]中讨论的那样,消费者通过广播兴趣包请求数据包,该兴趣包指定了新鲜度需求,这是对于基本的IoT瞬变内容的方案。任何节点(不同于P)接收了请求,该请求在CS中没有合适的数据包,并可以根据已经实现的路由协议重新广播包。

      当节点接收到拥有PIT匹配的数据包,它通过运用pCASTING策略执行缓存决定。

      作为提出的方案的基本需求,我们的目标是简单和无开销。pCASTING在资源约束设备上实现足够简单,并且不需要额外的信号或者在兴趣包/数据包中携带更多的信息。此外,pCASTING完全独立于选择的路由协议:它能够工作在基于洪泛的生产者感知的或者路径感知的方法中。

      缓存决定是完全分布式的,包括两个主要步骤,被每个转发节点本地计算:

      (1) 缓存概率的计算,考虑与设备和内容相关的动态IoT属性。选择的属性被正确标准化以使得异构的值可以相互比较。

      (2) 实际的概率决定,指定了是否缓存了基于计算概率的数据包。

 

B. 属性描述

      作为设备属性,我们考虑两个主要参数:能源层级和缓存占有率,可以容易地监测IoT设备的这两个值。

      能源消耗是IoT设备的一个主要的限制因素。如果剩余的电池可用时间掉落在预定的层级之下,设备的活跃性应该是被强烈限制的。这意味着缓存(和随后的传输)操作应该是被尽可能地抑制的。因而,我们假定,对于剩余的电池能量层级,缓存概率是直接成比例的,这可以作为标准参数EN被动态描绘,0<=EN<=1,值0和1分别意味着电池是完全放电的,或者带电的。

      关于缓存占用率,我们有理由假定拥有高存储容量的节点更倾向于缓存进来的数据包,拥有有限存储容量的节点在缓存决定中应该具有强烈的选择性。直观上,节点的缓存概率应该与缓存占用层次成反比,这可以被描绘成标准化参数OC,0<= OC<=1,值0和1分别意味着缓存是空的或者满的。

      作为内容属性,我们考虑数据包剩余新鲜度。根据NDN,任何生产者可能在数据包中构建一个值,以秒级指示新鲜度f,时间戳ts,当信息一被生产出来,就被识别。

      尽管节点自动丢弃CS中每个过期的数据包,相同数据包更新鲜的和不太新鲜的版本同时存在于网络和消费者应用程序中,不同的可能对获取拥有不同新鲜度需求的相同数据包感兴趣。例如,消费者C1能够以最多30分钟的新鲜度获得一个路段污染的值,同时,另一个消费者C2能够获得相同的数据,但是以最多10分钟的新鲜度。一个节点接收两个兴趣包,能够用缓存的数据包响应第一个请求,但转发第二个请求,因为拥有的数据包对C2来说并不新鲜。这也暗示着,在一个特定时期,相同的数据包的两个版本有不同的新鲜度值,在网络中将是可行的。

      更新鲜的数据包在缓存决定中拥有优先值,由于他们更可能适应消费者的新鲜度需求。因此,我们定义数据包的标准化的剩余新鲜度FR为:


      根据公式(1),如果时间戳ts与当前时间相等,那么FR=1,数据包可以认为是新近生成的,然而,当前时间增加时,剩余新鲜度减少。当然,有负FR值的包是过期的,并且根本没有缓存。

 

C. 缓存概率

      为了合适地定义数据包的缓存概率,我们考虑一个缓存效用函数Fu,同时考虑上面的标准化参数,EN,OC,FR。函数可以如下列出:


     

      其中,Np=3(Fu的定义很灵活:它可以被扩展来为缓存决定考虑除了EN,OC,FR之外其他的参数),权重wi范围0<=wi<=1,。因而,权重表达了标准化参数xi在计算效用值时的重要性。

      Fu必须假定在[0:1]范围内取值,并作为节点缓存概率的函数:如果Fu趋向于1,包被缓存的概率就高,反之亦然,如果Fu趋向于0,包被缓存的概率就低。

      函数g(xi)的模型可以通过考虑它应该满足的需求来设计。首先,它应该提供一个介于0和1之间的值,当xi的值随着整个缓存的效用成比例增加时,单调增加,成比例减少时,单调减少。第二,它也应该满足参数xi越靠近极限值,结果效用的影响越高的条件。通过这样做,缓存决定偏爱更新鲜的内容,更可能存储在具有拥有更高能量和更多缓存容量的节点中。

      满足如此特性的数学函数是幂函数g(xi)=xni,其中n>=1,依据与第二需求的相关度进行选择。效用函数因此通过幂函数的权重和来表达:

     

      数据包接收时,任何节点计算Fu的值来得到数据包的缓存概率。


4  实验


A. 模拟实验启动

     

      为了评估提出的pCASTING方案的性能,我们考虑图1中的智慧城市场景代表一个大小为600m*600m的城市区域。

     

      一组感知器部署在城市中,周期性地生成环境数据和其他与位置相关的信息。收集点获取这些内容,并操纵这些内容来为用户创建内容感知的服务,例如实时公共交通更新,空气污染更新。接入点(AP)放在方形拓扑的右上角,为感兴趣的消费者提供这样的环境感知服务。我们假设场景中有60个节点以步行速度移动,依据Truncated Levy-Walk移动模型,生成现实的人类移动轨迹。这样的移动节点模仿想要访问AP服务的用户携带的智能手机。每个节点装配有IEEE 802.11g无线接口,其中介质访问控制和物理参数(例如,传输能力和接收机灵敏度)依据今天市场上设备的数据集设置。传播服从瑞利衰落分布,由于各种障碍物、建筑和树木,需要考虑多路径效果。

      拓扑中节点的子集是为AP提供的环境感知服务所选择的。每个服务作为一组Nd数据包被建模,例如,每个消费者必须传输Nd个不同的兴趣包来获得整体信息。然而,由于信息是瞬变的,每个消费者必须周期性地发送新的兴趣包来获得更新的信息。在我们的场景中,更新周期是1分钟(例如,消费者在t=0s,t=60s,t=120s等请求内容)每次兴趣包携带新鲜度需求,该新鲜度在[1:10]秒的范围内随机选择。与AP的通信以多跳执行。不失一般性,我们参考的转发协议是可控的洪泛,像在文献[15]中定义的那样,文献[6]专用于无线网络。包括基于计数器的广播方案,为了限制碰撞概率和无线共享介质上的冗余而推迟包转发。可控的洪泛是物联网络中的一个好的选择,由于它固有的简单性:不依赖于额外的控制流量和并且在节点中需要最小状态。此外,在一个中等/较小的拓扑中(像本文考虑的拓扑),由于冗余传输,潜在的开销将会较低。

      为了在高存储限制条件下研究缓存策略的行为,我们假定每个节点的CS性能仅仅限制到10个包。

      我们描述的场景和pCASTING方案在ndnSIM工具中实现,NDN研究社团的参考模拟平台,部署在ns-3上。模拟设置在表I中汇总。下面,我们考虑两个不同的实验,目标是评估提出的方案的能源效率和数据获取性能。

 

B. 网络生存周期分析

      我们评估的第一个目标是理解对于电池供电的设备,pCASTING是否是一个能源高效的方案,通过保证好的性能,依据获取延迟和收集数据包的数量。因此,ns-3中的能源模型已经被用作计算模拟场景中无线设备的能源消耗。模型允许指定每个设备的初始能源,在模拟期间,它基于节点的活动减少了这个值。

      在实验中,8个节点被选作消费者,提供了高层次的初始化能源,而转发节点提供了非常低层次的初始化能源,意味着能源很快会被耗尽。实际上,我们主要关注的是,通过考虑转发节点的能源消耗来估计整个网络生存时间,允许消费者和AP之间的通信。后者提供了四个不同的环境感知服务:每个消费者随机选择一个服务,并开始以选择的随机间隔请求数据包,该间隔为[0:5]秒。然后,在每一分钟,每个消费者再次发送兴趣包。当所有的转发节点耗尽能源后,模拟结束。

      我们将pCASTING和三个参考方案比较:(i)在任何地点缓存任何东西的策略,CE2,用来缓存进来的数据包;(ii)概率方案,P(0.5),以固定概率p=0.5缓存进来的数据包;(iii)无缓存方案,节点不使用CS,仅转发进来的数据包。每个缓存方案的替换策略都是LRU。

      作为能源性能度量,我们考虑转发节点放电时间的累积分布函数(CDF),从网络视角给出缓存策略能源效率的信息。作为传播性能的指示器,我们考虑缓存命中率,在网络生存时间内消费者接收到的数据包的平均数量和平均数据获取延迟,计算兴趣包发送和数据包接收的时间间隔。延迟考虑可能的兴趣包重传。

      结果在10个独立运行的进程上计算。

      图2显示了转发节点放电时间的累积分布函数(CDF),表II显示了数据分发性能度量的参考值。我们可以观察到,最短网络生存时间通过CE2方案获得:在t=320s时刻,CDF达到值1,意味着所有的转发节点都耗尽能源。这是由于CE2在节点中生成了许多缓存/转发操作,同时,它没有最大化内容差异。实际上,在无线领域,许多邻居节点应该在相同时间接收到相同的数据包,CE2方案的结果,他们都缓存相同的信息。对于小的CS,情况更加严重,这引起高驱逐率并随时间获得均匀内容分布。这样均匀的缓存内容的存在有双重副作用。一方面,不同内容的请求不能被任何中间节点满足,兴趣包必须转发到最初的生产者(见表II中的CE2缓存命中率)。另一方面,CS匹配的存在,许多节点通过无益地浪费能源和网络资源同时可以响应相同的请求。值得注意的是,数据包通常比兴趣包更长,因而,数据包因为信道差错和碰撞丢失的概率比兴趣包丢失的概率更高。



      无缓存方案可以提供相较于CE2稍高的网络生存时间,但相应地,他有更高的端到端延迟,由于缓存的优势不能以任何方式被利用。

      更好的性能以P(0.5)概率的方案获得,通过引入概率缓存决定,在网络中增加内容多样性,并在中间节点促进缓存命中率。然而,由于它的能源感知行为,pCASTING保证了最高的网络生存时间,甚至获取的数据包最多。此外,由于固有的概率决定,pCASTING最大化网络中的内容多样性,因此增加了缓存命中率,结果,减少了数据获取延迟。

 

C. 获取性能分析

     

      第二个实验研究完全充电的节点的数据传播的性能。ns-3能源模型仍然应用来显示模拟期间的能源损耗,持续10分钟。在这段时间,消费者的数量变化范围为1到6,周期性地请求环境感知服务。模拟结果平均运行在10个独立的进程上,拥有95%的置信区间。

      我们将pCASTING与无缓存和P(0.5)方案做比较。为了从网络视角评估缓存策略的效率,我们考虑模拟期间网络中传输的兴趣包的数量和数据包的数量。反之亦然,为了从消费者视角评估缓存策略的效率,我们计算消费者能源开销,这是消费者消耗的能源和正确接收的比特之间的比率,在所有的消费者上做平均。

      图3(a)和图3(b)中兴趣包和数据包的数量,表明相较于其他方案,pCASTING极大地减少了流量,因此节约了网络资源。而且由于它减少了能源消耗,消费者也从pCASTING中得到好处,如图3(c)所示。这是由于获知节点的状态(依据能源和缓存大小)和数据包的剩余新鲜度的事实,pCASTING执行智能缓存决定,高效地在网络中分发内容。结果,pCASTING缓存命中率比P(0.5)概率方案更高,维持55-62%的数量级,P(0.5)的缓存命中率总是低于50%。

 

5  结论

      在本文中,我们在命名数据无线物联网络中研究网络内缓存,并提出了一种分布式缓存方案,叫做pCASTING,该方案通过考虑三个主要的参数来调整缓存概率,这三个参数是:电池能源等级、节点的缓存占用率和数据包的剩余新鲜度。模拟结果证明了提出方案的有效性和效率,这也能够减少节点的能源消耗,同时,保证低的内容获取延迟。

      我们在pCASTING中计算缓存概率的方式非常通用:缓存效用函数Fu可以与不同的路由协议工作,并可以通过增加其他参数被容易地修改。真正地,作为未来工作,我们计划(i)在缓存决定中包括其他属性,并且,(ii)在缓存和不同的路由协议之间评估可能的交互。

 

6  感谢

      该工作受德国学术交流服务(DAAD)的FITweltweit项目团体支持。

 

参考文献

[I] J. Gubbi, R.Buyya, S. Marusic, and M. Palaniswami, "Internet of Things (loT): AVision, Architectural Elements, and Future Directions," Elsevier FutureGeneration Computer Systems, Volume 29, No. 7, 2013.

[2] B. Ahlgren, C.Dannewitz, C. Imbrenda, D. Kutscher, and B. Ohlman, "A Survey ofInformation-Centric Networking," IEEE Communications Magazine, vol. 50,no. 7, pp. 26-36, 2012.

[3] Y. Zhang et aI.,"ICN based Architecture for loT - Requirements and Challenges," inInternet-Draft, 2014.

[4] M. Amadeo, C.Cam polo, A. lera, and A. Molinaro, "Named Data Networking for loT: anArchitectural Perspective," in European Conference on Networks andCommunications (EuCNC), Bologna, Italy, 2014.

[5] G. Zhang, Y. Li,and T. Lin, "Caching in Information Centric Networking: a Survey,"Elsevier Computer Networks, vol. 57, no. 16, 2013.

[6] E. Baccelli etaI., "Information Centric Networking in the loT: Experiments with NDN inthe Wild," ACM ICN, 2014.

[7] J. Quevedo, D.Corujo, and R. Aguiar, "Consumer Driven Information Freshness Approach forContent Centric Networking," in IEEE INFOCOM NOM Workshop, 2014. [S] S.Vural et al., "In-network Caching of Internet-of-Things Data," in IEEEICC, 2014.

[9] L. Zhang et aI.,"Named Data Networking (NDN) Project," PARC, Tech. Rep. NDN-OOOl,October 2010.

[10] A. Afanasyev etaI., "ndnSIM: NDN simulator for NS-3," University of California, LosAngeles, Tech. Rep. NDN-0005, 2012.

[11] I. Psaras etaI., "Probabilistic In-Network Caching for InformationCentric Networks,"in ACM ICN'12, 2012.

[12] S. Tarnoi, K.Suksomboon, W. Kumwilaisak, and Y. Ji, "Performance of ProbabilisticCaching and Cache Replacement Policies for ContentCentric Networks," inIEEE LCN, 2014.

[13] W. Shang etal., "Securing Building Management Systems Using Named DataNetworking," IEEE Network, vol. 3, no. 2S, 2014.

[14] L. Wang et aI.,"Rapid Traffic Information Dissemination Using Named Data," in ACMNoM'12, 2012.

[15] M. Amadeo, C.Campolo, and A. Molinaro, "Forwarding Strategies in Named Data Wireless AdHoc Networks: Design and Evaluation," Elsevier Journal of Network andComputer Applications, 2014.

[16] I. Rhee, M.Shin, S. Hong, K. Lee, and S. Chong, "On the Levy-walk Nature of HumanMobility," in IEEE INFO COM, 200S.

[17] "CiscoAironet S02.11a/b/g Wireless Cardbus Adapter, Data Sheet on line at http://www.cisco.com...[IS] "The network simulator-3 (ns-3),http://www.nsnam.org/.''

已标记关键词 清除标记
#include "ns3/random-variable-stream.h" #include "ns3/core-module.h" #include "ns3/network-module.h" #include "ns3/internet-module.h" #include "ns3/point-to-point-module.h" #include "ns3/applications-module.h" #include "ns3/netanim-module.h" #include "ns3/rng-seed-manager.h" #include "ns3/ptr.h" #include <iostream> #include <string> #include <stdlib.h> #include <string> #include <sstream> //ns3命名空间 using namespace ns3; using namespace std; //日志定义 NS_LOG_COMPONENT_DEFINE ("FirstScriptExample"); void SendPacket (Ptr<Socket> sock) { string number={"1"}; uint8_t buffer[sizeof(number)] ; uint32_t rng=9;//自定义一个变量 uint32_t seed=15; uint32_t len=number.length(); RngSeedManager::SetSeed(seed); RngSeedManager::SetRun (rng); Ptr<UniformRandomVariable> x = CreateObject<UniformRandomVariable> (); x->SetAttribute ("Min", DoubleValue (1.0)); x->SetAttribute ("Max", DoubleValue (4.0)); int value = x->GetValue (); uint8_t value1=value+48; buffer[0]=value1; buffer[len]='\0'; Ptr<Packet> p = Create<Packet>(buffer,sizeof(buffer));//把buffer写入到包内 sock->Send(p); } void SendPacket2 (Ptr<Socket> sock2) { string number={"1","2"}; uint8_t buffer1[sizeof(number)] ; uint32_t rng=50;//自定义一个变量 uint32_t len=number.length(); RngSeedManager::SetSeed(3); // Changes seed from default of 1 to 3 RngSeedManager::SetRun (rng); Ptr<UniformRandomVariable> x = CreateObject<UniformRandomVariable> (); x->SetAttribute ("Min", DoubleValue (1.0)); x->SetAttribute ("Max", DoubleValue (4.0)); int value = x->GetValue (); uint8_t value1=value+48; buffer1[0]=value1; buffer1[len]='\0'; Ptr<Packet> p = Create<Packet>(buffer1,sizeof(buffer1));//把buffer写入到包内 sock2->Send(p); } void RecvString2(Ptr<Socket> sock2) { Address from; Ptr<Packet> packet = sock2->RecvFrom (from); packet->RemoveAllPacketTags (); packet->RemoveAllByteTags (); InetSocketAddress address2 = InetSocketAddress::ConvertFrom (from); uint8_t data2[sizeof(packet)]; packet->CopyData(data2,sizeof(data2));//将包内数据写入到data2内 cout <<sock2->GetNode()->GetId()<<" "<<"receive : " << data2 <<" from "<<address2.GetIpv4 ()<< endl; cout<<"接受到的数为 "<<data2<<endl;}*/ void ReceivePacket (Ptr<Socket> socket) { //Ptr<Packet> packet2; Address from; Ptr<Packet> packet1 = socket->RecvFrom (from); packet1->RemoveAllPacketTags (); packet1->RemoveAllByteTags (); uint8_t data1[sizeof(packet1)]; packet1->CopyData(data1,sizeof(data1)); cout<<data1[0]<<endl; } int main (int argc, char *argv[]) { CommandLine cmd; cmd.Parse (argc, argv); Time::SetResolution (Time::NS); // LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO); // LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO); NodeContainer nodes; nodes.Create (3); NodeContainer n0n1 = NodeContainer (nodes.Get (0), nodes.Get (1)); NodeContainer n1n2 = NodeContainer (nodes.Get (2), nodes.Get (1)); PointToPointHelper pointToPoint; pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps")); pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms")); NetDeviceContainer nets; NetDeviceContainer d0d1 =pointToPoint.Install (n0n1); NetDeviceContainer d1d2 = pointToPoint.Install (n1n2); InternetStackHelper stack; stack.Install (nodes); Ipv4AddressHelper address; address.SetBase ("10.1.1.0", "255.255.255.0"); address.Assign (d0d1); address.SetBase ("10.1.2.0", "255.255.255.0"); address.Assign (d1d2); Ipv4InterfaceContainer interfaces = address.Assign (d0d1); Ipv4InterfaceContainer interfaces2 = address.Assign (d1d2); Ipv4GlobalRoutingHelper::PopulateRoutingTables (); //UDP传输 // //接收端 TypeId tid = TypeId::LookupByName("ns3::UdpSocketFactory"); Ptr<Socket> Recv_sock = Socket::CreateSocket(nodes.Get (1), tid); // InetSocketAddress addr = InetSocketAddress(Ipv4Address::GetAny(), 10000); InetSocketAddress addr = InetSocketAddress(interfaces.GetAddress(1), 10000); Recv_sock->Bind(addr); Recv_sock->SetRecvCallback(MakeCallback(&ReceivePacket)); //设置回调函数 Ptr<Socket> Recv_sock2 = Socket::CreateSocket(nodes.Get (1), tid); //InetSocketAddress addr = InetSocketAddress(Ipv4Address::GetAny(),100); InetSocketAddress addr2 = InetSocketAddress(interfaces2.GetAddress(1),10000); Recv_sock2->Bind(addr2); Recv_sock2->SetRecvCallback(MakeCallback(&ReceivePacket)); //设置回调函数 //发送端 Ptr<Socket> Send_sock = Socket::CreateSocket(nodes.Get (0), tid); InetSocketAddress RecvAddr = InetSocketAddress(interfaces.GetAddress(1), 10000); Send_sock->Connect(RecvAddr); Ptr<Socket> Send_sock2 = Socket::CreateSocket(nodes.Get (2), tid); InetSocketAddress RecvAddr2 = InetSocketAddress(interfaces2.GetAddress(1), 10000); Send_sock2->Connect(RecvAddr2); Simulator::Schedule(Seconds(1),&SendPacket,Send_sock); Simulator::Schedule(Seconds(3),&SendPacket2,Send_sock2); Simulator::Run(); Simulator::Stop(Seconds(40)); Simulator::Destroy (); return 0; }
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页