Rime协议学习笔记:(九)单跳单播小结
来源:互联网 发布:如何查看服务器域名 编辑:程序博客网 时间:2024/05/29 09:21
九.单跳单播小结
至此Rime协议已学习完成单跳单播这一主线,即rucb->runicast->stunicast->unicast->broadcast->abc(从上层到下层的顺序)。从Rime协议栈中看该主线,单跳单播的实现建立在广播的基础上,即从最底层的abc匿名广播开始,直到实现rucb可靠单播块传输。
从原理上讲,最底层abc实现的是匿名广播;broadcast在其基础上给数据包增加发送者地址属性实现标识广播;再往上unicast增加接收着地址包属性,此时广播转变为单播;stunicast利用重复发送这一机制为可靠单播的实现提供了基础;runicast继续增加确认和重传机制以确保节点可以成功收到数据包;最终当要发送较大的数据或文件时,rucb将数据进行分块传输,这样既减少了数据传输的出错率,又可以通过记录块来实现断点续传。
下面将从每一层的conn结构体、callbacks、 open函数回调三个方面对该条主线进行总结。
9.1 conn结构体
首先看abc_conn:
Struct abc_conn {/**代表一个abc连接,包含一个通道channel和一个abc_callbacks*/ struct channel channel; const struct abc_callbacks *u;};
abc_conn中包含一个通道和自己的回调函数结构体。而上层的该结构体中只需包含下层,再定义自己需要的内容即可,如broadcast_conn定义如下所示:
struct broadcast_conn {/**代表一个broadcast连接 */ struct abc_conn c; const struct broadcast_callbacks *u;};
如此往上,每一层的conn结构体都套用上一层的。这样实现有非常多的好处,比如易于实现和维护,如果上层需要修改或新增功能,这会非常方便。另外各层可以专注于处理自己的问题,比如runicast_conn定义如下,runicast只需专注于处理rxmit等标志重传次数等属性的处理,实现重传和确认机制。其实这些也是网络协议分层实现的好处。
struct runicast_conn {/**一个runicast连接*/ struct stunicast_conn c; const struct runicast_callbacks *u; uint8_t sndnxt; uint8_t is_tx; uint8_t rxmit; uint8_t max_rxmit;};
9.2 callbacks结构体
每一层的系统代码中都会定义上一层回调类型的回调函数,比如在unicast中定义如下:
static const struct broadcast_callbacks uc = {recv_from_broadcast,sent_by_broadcast};
其中定义的便是broadcast_callbacks类型的回调函数,并且在recv和sent函数中有如下的实现,即每一层发送数据时会调用下一层进行发送,直到调用到最底层的射频发送;而每一层接收数据时,都是接收来自下一层的数据。
而对于每一层自己的回调类型的回调函数,用户可以定义在自己的实现代码中,以自定义功能。比如在rucb发送节点的代码中,定义了read_chunk来根据用户自己的规则调度数据块。
const static struct rucb_callbacks rucb_call = {NULL, read_chunk, NULL};
9.3 open函数
首先看abc_open,该函数主要功能是打开一个通道,并且将之加入到通道链表中。
void abc_open(struct abc_conn *c, uint16_t channelno, const struct abc_callbacks *callbacks){ channel_open(&c->channel, channelno); c->u = callbacks; channel_set_attributes(channelno, attributes);}
其它层的open函数都是用于初始化的,且都会调用上一层的open函数。即上层会指定相应的通道号,然后从最下层开始,打开通道,每一层往上开始初试化。
- Rime协议学习笔记:(九)单跳单播小结
- Rime协议学习笔记:(一)Rime协议概述
- Rime协议学习笔记:(二)主要数据结构(2)
- Rime协议学习笔记:(三)匿名广播abc
- Rime协议学习笔记:(四)标识广播broadcast
- Rime协议学习笔记:(五)单播unicast
- Rime协议学习笔记:(六)顽固单播stunicast
- Rime协议学习笔记:(七)可靠单播runicast
- Rime协议学习笔记:(八)可靠单播块传输rucb
- Rime协议学习笔记:(十)polite广播
- Rime协议学习笔记:(十一)ipolite广播
- Rime协议学习笔记:(十二)netflood洪泛技术
- Rime协议学习笔记:(十三)route discovery路由发现
- Rime协议学习笔记:(十五)mesh网络
- Rime协议栈概述及学习资料
- HTTP协议学习笔记九
- Real-Rime Rendering (10) - 图形硬件及学习小结(Graphics Hardware)
- rime协议栈简介
- Android 判断触摸点是否在某个view的区域,解决子view与parent的touch事件冲突
- spring MVC之构造ModelAndView对象
- Maven指南
- 鸟人的Android揭秘(10)——Init进程源代码分析(一)
- 接口特点
- Rime协议学习笔记:(九)单跳单播小结
- 开往早晨的午夜——2016这一年
- spring&guice 的AOP
- Python爬虫辅助库BeautifulSoup4用法精要
- redis学习系列--5.redis-sets 类型
- 用axis解析webservice并调用
- java 接口的引入
- 把时间转化为毫秒,把毫秒转化为时分秒
- 自动识别OpenCV版本并添加依赖库