CTP协议的组成原理与具体实现(原理篇,含组件解析)_物联网竞赛挑战赛

简介: CTP协议的组成原理与具体实现(原理篇,含组件解析)_物联网竞赛挑战赛

目录


CTP协议介绍

基本原理

CTP的两种处理路由循环的方法

CTP中包重复问题的解决方案

数据帧图例以及各字段定义

路由帧图例以及各字段定义

链路估计

路由引擎

转发引擎


正文


CTP协议介绍


基本原理


CTP是基于树的汇聚协议,网络中的一些节点将自己设为根节点,节点之间形成到根节点的树的集合。CTP是没有地址的,节点并不是向固定的根节点发送数据包,而是通过选择下一跳隐式地选择根节点,节点根据路由梯度形成到根的路由。


CTP协议假设链路层提供了以下功能:


1. 提供有效的本地广播地址;


2. 为单播包提供同步的确认信息;


3. 提供协议分派字段以支持多种高层协议;


4. 具有单跳的源和目的地址字段。


CTP假设它有一部分附近邻居节点的链路质量估计信息。该信息提供了本节点与某一邻居节点之间的通信过程中成功地传输了单播包的次数。 CTP有一些提高传输可靠性的机制,但它并不保证100%可靠。它是尽力的,但有时即使尽力了也未必能办到。 CTP是为通信量相对较低的网络设计的。带宽有限的系统可能使用别的协议更合适,比如能将多个小的帧组装成单个数据链路层包的协议。

CTP网络拓扑如图所示。

0000000000000000000000000000.png

CTP使用期望传输值(ETX,Expected Transmissions)作为路由梯度。根节点的ETX为0,其它节点的ETX为其父节点的ETX值加上到父节点链路的ETX 值。这种相加的方法需要假设节点使用链路层重传。给出一种有效的路由,CTP 选择ETX值最小的一种。ETX 值用精度为0.01的16位定点实数表示。若ETX 值为451则表示ETX为4.51,同样ETX值为109表示ETX为1.09。


CTP的两种处理路由循环的方法


路由循环是可能在CTP网络中出现的问题之一。路由循环通常发生在节点选择的路由的ETX值比原来的大的多的情况下,这可能是因为与侯选的节点失去连接造成的。如果它是新的路由选择的节点,那就产生了路由循环。


CTP通过两种方法处理路由循环。第一种是每个CTP包含有当前节点的ETX值,如果CTP接收到比自己的ETX值小的数据帧,则说明树中有不一致。CTP通过广播一个信息帧以期解决这种不一致性,希望发送这个数据帧的节点收到并相应地调整它的路由。如果一部分节点被隔开,那么它们会形成ETX值无限增大的死循环。CTP的第二种机制是不考虑ETX值大于一个固定常量的路由,这个值取决于实现。


CTP中包重复问题的解决方案


包重复是CTP中可能发生的另外一个问题。包重复发生在节点收到一个数据帧,并回复一个ACK,但ACK中途丢失的情况。发送者将重传这个包,而接收者又将收到它。这在多跳中是灾难性的,因为重复是指数级的。例如,每跳产生一个重复,则第一跳有两个包,第二跳四个,第三跳八个......


同时路由循环使重复抑制变得更复杂,因为路由循环可能使节点合法地收到一个包一次或多次。因此,如果仅仅根据源地址和顺序号,路由循环中的包可能被丢弃。因此,CTP数据帧具有一个已存活时间(THL,time has lived)字段,每过一跳都对该字段加1。链路层重传具有相同的THL值,但路由循环中的包就不会如此了。


数据帧图例以及各字段定义


CTP数据帧格式如下:

00000000000000.png

各字段定义如下:

P

拉路由位。P位允许节点从其它节点请求路由信息。如果节点收到一个P位置位的包,它应当传输一个路由帧。
C 拥塞标志位。如果节点丢弃了一个CTP数据帧,它必须在下一个传输的数据帧中置C位。
THL 已存活时间。当节点产生一个CTP数据帧时,它必须设THL为0。当节点接收到一个CTP数据帧时,它必须增加THL值。如果节点接收到的数据包THL为255,则将它回绕为0。
ETX 单跳发送者的ETX值。当节点发送一个CTP数据帧时,它必须将到单跳目的地的路由ETX值填入ETX字段。如果节点接收到的路由梯度比自己的小,则它必须准备发送一个路由帧。
origin 包的源地址。转发的节点不可修改这个字段。
swqno 源顺序号。源节点设置了这个字段,转发节点不可修改它。
collect Id 高层协议标识。源节点设置了这个字段,转发节点不可修改它。
data 数据负载。0个或多个字节。转发节点不可修改这个字段。

origin, seqno, collect id合起来标识了一个唯一个源数据包,而origin, seqno, collect id, THL合起来标识了网络中唯一一个数据包实例。两者的区别在路由循环中的重复抑制是很重要的。如果节点抑制源数据包,则它可能丢弃路由循环中的包;如果它抑制包实例,则它允许转发处于短暂的路由循环中的包,除非THL凑巧回绕到与上次转发时相同的状况。


路由帧图例以及各字段定义


CTP路由帧格式如下:

各字段意义如下:

P

与数据C
C 拥塞标识。如果节点丢弃了一个CTP数据帧,则必须将下一个传输路由帧的C位置位。
parent 节点的当前父节点
metric(ETX) 点的当前ETX值

当节点接收到一个路由帧时,它必须更新路由表相应地址的ETX值。如果节点的ETX值变动很大,那么CTP必须传输一个广播帧以通知其它节点更新它们的路由。与数据帧相比,路由帧用父节点地址代替了源节点地址。父节点可以发现子节点的ETX值远低于自己的ETX值的情况,并准备传输一个路由帧。


CTP的一种实现可以在tos/lib/net/ctp目录中找到,该实现由三个主要的子组件组成,如下图所示。


1. 链路质量估计器,负责估计单跳的ETX值;


2. 路由引擎,它根据链路估计和网络层的信息(如拥塞情况)来决定哪个邻居节点作为路由的下一跳;


3. 转发引擎,它维护发送包队列,决定是否发送和发送的时机。它的名字有点令人混淆:转发引擎不仅要发从其它节点过来的数据包,同时也要发送自己产生的数据包。


下图是CTP协议组成图。

000000000.png


链路估计


该实现使用两种机制来估计链路质量:周期性的LEEP包和数据包。该实现使用LEEP包作为信息帧。这些包中填入邻居节点地址和相应的ETX值。信息帧的发送速率由一种与trikle dissemination协议类似的算法计算,它根据网络的状况动态地计算。信息帧使用一个以指数级随机递增的定时器控制发送,当发生以下状况之一时,该实现重置定时器为一个较小的值。


1. 路由表为空(这也将设置P位)


2. 在>=1次传输后ETX值增大


3. 节点收到一个P位置位的包


该实现通过数据传输改变对LEEP的链路估计,这是计算ETX最直接的方法。当数据通路传输一个数据包时,它告知链路估计器传输的目的地和传输成功与否。估计器对每5次传输产生一个ETX估计值,ETX为6表示一次也没传成。


估计器通过指数权重的移动平均线合并信息帧的ETX值和数据估计产生的ETX值。基于信息帧的估计会填充邻居表。期望的状况是在已稳定的网络中,较低的信息帧速率意味着对选定的路由来来说,数据估计占的比重比信息帧估计的大。


此外,CTP收集数据估计的速率与传输速率是成比例的,因此它可以快速地检测到断开的连接并切换到新的侯选邻居节点。


组件tos/lib/net/le/LinkEstimatorP实现了链路估计器。它结合了基于LEEP和数据的估计。


路由引擎


该实现的路由引擎负责选择数据传输的下一跳。它记录了链路估计表中所维护节点的一个子集的路径ETX值。最小耗费的路由即路径ETX值和连接ETX值之和最小的那条。因此路径ETX值整条路由的连接ETX值。组件tos/lib/net/ctp/CtpRoutingEngineP实现了该路由引擎。


转发引擎


组件tos/lib/net/ctp/CtpForwardingEngineP实现了转发引擎。它具有以下5种职责:


1. 向下一跳传递包,当需要时重传,并根据是否收到ACK向链路估计器传递相应信息;


2. 决定何时向下一跳传递包;


4. 维护需要传输的包队列,它混杂了本地产生的包和需要转发的包;


5. 检测由于丢失ACK引起的单跳重复传输。


转发的四个关键函数为包接收(SubReceive.receive()),包转发(forward()),包传输(SendTask())和决定传完之后做什么(SubSend.sendDone())。


receive函数决定节点是否转发一个包。它有一个缓冲区保存了最近收到的包,通过检查这个缓冲区可以确定它是否是重复的。如果不是,则调用转发函数。


转发函数格式化需要转发的包。它检查收到的包是否有路由循环,检查传输队列中是否有足够的空间,如果没有,则丢弃该包并置C位。如果传输队列为空,则post Send任务。


Send任务检查位于传输队列头部的包,为到下一跳的传输作好准备(请求路由层的路由信息),并提交到AM层。


当发送结束时,sendDone检查发送的结果。如果包被确认,则将包从传输队列中拽出。 如果包是本地产生的,则将sendDone信号向上传。如果包是转发的,则将包返回到转发消息缓冲池。如果队列中还有剩余的包(比如没有被确认的),它启动一个随机定时器以重新post这个任务。该定时器实质上用于限制CTP的传输速率,不让它尽快地发包,这是为了防止在通路上自我冲突。

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
3月前
|
前端开发 JavaScript
React 步骤条组件 Stepper 深入解析与常见问题
步骤条组件是构建多步骤表单或流程时的有力工具,帮助用户了解进度并导航。本文介绍了在React中实现简单步骤条的方法,包括基本结构、状态管理、样式处理及常见问题解决策略,如状态管理库的使用、自定义Hook的提取和CSS Modules的应用,以确保组件的健壮性和可维护性。
90 17
|
4天前
|
索引
【Flutter 开发必备】AzListView 组件全解析,打造丝滑索引列表!
在 Flutter 开发中,AzListView 是实现字母索引分类列表的理想选择。它支持 A-Z 快速跳转、悬浮分组标题、自定义 UI 和高效性能,适用于通讯录、城市选择等场景。本文将详细解析 AzListView 的核心参数和实战示例,助你轻松实现流畅的索引列表。
20 7
|
3月前
|
前端开发 UED
React 文本区域组件 Textarea:深入解析与优化
本文介绍了 React 中 Textarea 组件的基础用法、常见问题及优化方法,包括状态绑定、初始值设置、样式自定义、性能优化和跨浏览器兼容性处理,并提供了代码案例。
120 8
|
4月前
|
传感器 消息中间件 物联网
常用的物联网协议
常用的物联网协议包括:MQTT(消息队列遥测传输)、CoAP(受限应用协议)、HTTP/HTTPS、LWM2M(轻量级机器对机器)和Zigbee等。这些协议在不同的应用场景中发挥着重要作用,如数据传输、设备管理等。
|
4月前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
67 1
|
5月前
|
网络协议 物联网 网络性能优化
物联网协议比较 MQTT CoAP RESTful/HTTP XMPP
【10月更文挑战第18天】本文介绍了物联网领域中四种主要的通信协议:MQTT、CoAP、RESTful/HTTP和XMPP,分别从其特点、应用场景及优缺点进行了详细对比,并提供了简单的示例代码。适合开发者根据具体需求选择合适的协议。
128 5
|
5月前
|
存储 JavaScript 前端开发
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
Vue3权限控制全攻略:路由与组件层面的用户角色与权限管理方法深度解析
489 2
|
4月前
|
消息中间件 监控 物联网
物联网8大协议介绍及对比
根据具体的应用需求,选择合适的协议可以大幅提升系统的性能和可靠性。希望本文能为您在物联网协议的选择和应用中提供有价值的参考。
908 0
|
4月前
|
机器学习/深度学习 自然语言处理 数据管理
GraphRAG核心组件解析:图结构与检索增强生成
【10月更文挑战第28天】在当今数据科学领域,自然语言处理(NLP)和图数据管理技术的发展日新月异。GraphRAG(Graph Retrieval-Augmented Generation)作为一种结合了图结构和检索增强生成的创新方法,已经在多个应用场景中展现出巨大的潜力。作为一名数据科学家,我对GraphRAG的核心组件进行了深入研究,并在此分享我的理解和实践经验。
161 0
|
4月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
141 2

相关产品

  • 物联网平台
  • 推荐镜像

    更多