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
相关文章
|
9天前
|
存储 缓存 算法
HashMap深度解析:从原理到实战
HashMap,作为Java集合框架中的一个核心组件,以其高效的键值对存储和检索机制,在软件开发中扮演着举足轻重的角色。作为一名资深的AI工程师,深入理解HashMap的原理、历史、业务场景以及实战应用,对于提升数据处理和算法实现的效率至关重要。本文将通过手绘结构图、流程图,结合Java代码示例,全方位解析HashMap,帮助读者从理论到实践全面掌握这一关键技术。
48 13
|
15天前
|
前端开发 JavaScript
React 步骤条组件 Stepper 深入解析与常见问题
步骤条组件是构建多步骤表单或流程时的有力工具,帮助用户了解进度并导航。本文介绍了在React中实现简单步骤条的方法,包括基本结构、状态管理、样式处理及常见问题解决策略,如状态管理库的使用、自定义Hook的提取和CSS Modules的应用,以确保组件的健壮性和可维护性。
54 17
|
27天前
|
运维 持续交付 云计算
深入解析云计算中的微服务架构:原理、优势与实践
深入解析云计算中的微服务架构:原理、优势与实践
61 1
|
3天前
|
网络协议 安全 网络安全
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
27 1
|
21天前
|
前端开发 UED
React 文本区域组件 Textarea:深入解析与优化
本文介绍了 React 中 Textarea 组件的基础用法、常见问题及优化方法,包括状态绑定、初始值设置、样式自定义、性能优化和跨浏览器兼容性处理,并提供了代码案例。
48 8
|
28天前
|
监控 网络协议 网络性能优化
网络通信的核心选择:TCP与UDP协议深度解析
在网络通信领域,TCP(传输控制协议)和UDP(用户数据报协议)是两种基础且截然不同的传输层协议。它们各自的特点和适用场景对于网络工程师和开发者来说至关重要。本文将深入探讨TCP和UDP的核心区别,并分析它们在实际应用中的选择依据。
56 3
|
9天前
|
传感器
Modbus协议深入解析
Modbus协议是由Modicon公司(现施耐德电气)于1979年发明的串行通信协议,主要用于工业自动化系统中的PLC通信。本文深入解析了Modbus协议的主从模式、数据类型(线圈、离散输入、保持寄存器、输入寄存器)、帧结构和通信过程,并介绍了其应用场景和重要性。
15 0
|
28天前
|
存储 供应链 算法
深入解析区块链技术的核心原理与应用前景
深入解析区块链技术的核心原理与应用前景
54 0
|
1月前
|
JavaScript 前端开发 API
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
57 0
|
1月前
|
负载均衡 网络协议 算法
OSPF与其他IGP协议的比较:全面解析与应用场景
OSPF与其他IGP协议的比较:全面解析与应用场景
44 0

相关产品

  • 物联网平台
  • 推荐镜像

    更多