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函数。即上层会指定相应的通道号,然后从最下层开始,打开通道,每一层往上开始初试化。

0 0
原创粉丝点击