[batman-adv]学习(1) —— Overview

batman-adv是一种新型的无线路由协议,工作在2层,已经在linux中实现。

https://www.open-mesh.org/projects/batman-adv/wiki/Wiki

主要是对上面网站的学习、翻译、部署实现与记录

1.介绍

       大多数无线路由协议的实现都工作在3层,它们通过发送UDP包来交换路由信息,并通过操纵(manipulating)内核路由表来实现路由选择。

       Batman-adv则是在2层工作的——路由信息通过原始以太帧(raw ethernet frames)传输,数据流量也是经过Batman-adv。它封装(encapsulates)并转发所有数据直到到达目的地址,所以可以仿真一个所有节点参与的虚拟网络交换。所有节点都具有本地链接,并不知道网络拓扑,不会受到任何网络变化的影响。

       它的设计具有以下特征:

l  与网络层无关,在上层可以运行任何协议:IPv4,IPv6,DHCP…

l  节点可以加入mesh网络而不需要IP地址

l  很容易加入非mesh的客户端(比如移动节点),而不需要手动配置

l  非mesh客户端漫游(roaming)

l  可以最优化经过mesh网络的数据流(比如:接口选择,广播,转发修正)

l  依靠mesh节点和非mesh节点的广播和多播来运行协议

 

2.内核模块

       如果节点无法按照路由发送或者转发以太网数据包,2层路由协议也需要处理数据流量(data traffic)。在用户层面处理数据包需要占用大量CPU周期,每个包都需要进行读和写到内核的操作并返回,会限制(影响)网络的可用带宽,尤其是对低速设备。因此把batman-adv部署到了内核,这样即使在高负载情况下也只是引入了很小的包处理开销。

 

Batctl工具

       用来安装和调试batman-adv内核模块。

       可以设置和查看模块的状态信息。

       包含了2层版本的网络工具,例如ping,traceroute,tcpdump,虚拟网络交换对所有2层之上的协议都是透明的。

 

用于配置:

l  添加和删除mesh网络中的接口

l  设置或者更改batman-adv 模块的属性

l  使能 batman-adv 模块的功能参数

 

用于debug:

l  Ping 和 traceroute 节点,基于mac地址

l  解析日志用于发现路由环路

l  检索 batman-adv模块的活动信息

l  列出网络中其它mesh或non-mesh节点

l  列出gateways

### 寻找1000以内的所有完全数 #### 定义 一个数如果恰好等于它的因子之和,则该数被称为“完数”。例如,6是一个完数因为\(6 = 1 + 2 + 3\)。 #### Java 实现方法 为了找到1000以内的所有完数,在Java中可以采用如下方式实现: 遍历1000以内的所有整数[^1]。对于每一个整数`i`,计算其所有小于自身的正因数(即能被`i`整除的数),并将这些因数累加起来得到总和`sum`。当某个整数与其所有小于自身的正因数之和相等时,此数则为完数[^4]。 ```java public class PerfectNumberFinder { public static void main(String[] args) { System.out.println("1000以内的完数有:"); for (int i = 2; i < 1000; i++) { int sum = 0; for (int j = 1; j < i; j++) { if (i % j == 0) { sum += j; } } if (i == sum) { System.out.printf("%d ", i); } } } } ``` 上述程序通过双重循环结构来查找并打印出1000以内的所有完数。外层循环用于迭代可能成为完数的目标数值;内层循环负责检测当前目标值是否存在符合条件的因数,并将其加入到累积变量`sum`之中。一旦发现某数满足条件——即自身等于所有真因数之和,则立即输出该数作为完数之一[^5]。 #### Python 实现方法 同样地,在Python环境下也可以编写类似的逻辑来完成相同任务: ```python def find_perfect_numbers(limit): perfect_numbers = [] for num in range(2, limit): divisors_sum = sum([divisor for divisor in range(1, num) if num % divisor == 0]) if num == divisors_sum: perfect_numbers.append(num) return perfect_numbers if __name__ == "__main__": result = find_perfect_numbers(1000) print(f"1000以内的完数有:{result}") ``` 这段脚本定义了一个名为`find_perfect_numbers()`的功能函数,接受上限参数`limit`指定要检查的最大范围,默认设置为1000。内部运用列表推导式快速获取给定范围内各自然数对应的全部真因数,并求得它们之间的算术平均值。最后返回由所有匹配项构成的新列表供后续处理或展示用途。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值