三种无线电模型的缺点:
- RF Pipe:没有MAC层,重叠传输时无法检测到冲突;
- TDMA:对时钟同步要求比较高,在单一节点上还好。如果是分布式部署,那么即使使用NTP网络时间同步协议也无法满足对时间精度的要求。
- 802.11:多个节点向一个节点发送信息时,传输速率本应减小,但是却随着节点增多而增大。
1. RF Pipe Model
对应 Wiki:https://github.com/adjacentlink/emane/wiki/RF-Pipe-Model
1.1. 特点
射频管道(RF Pipe)提供以下功能集,以支持各种无线电波形的仿真:
-
带宽的数据/突发速率仿真(数据传输速率):在发送端(下游),射频管道根据数据包大小和配置的数据速率在数据包之间应用延迟,以限制配置的数据传输速率。哪里,
-
分组传输之间的延迟在分组传输之后应用。
-
计算出的延迟被发送到仿真器物理层,并作为消息持续时间包含在公共 PHY 报头中。
-
带宽是每个节点的限制,而不是整个网络的限制。
-
网络延迟仿真:在发送端(下游),射频管道将在数据包发送到物理层进行空中传输之前应用可配置的网络延迟。网络延迟计算如下: 网络延迟=延迟+抖动。
关于延迟:
定义应用于每个传输数据包的额外固定延迟(秒)。
类型:float
运行状态可修改:是
出现范围:[1,1]
数值范围:[0.000000,FLOAT_MAX]
默认值:0.000000
关于抖动:
定义应用于每个传输数据包的延迟抖动(秒)。基于 +/- 配置抖动值之间的均匀随机分布,抖动被添加到配置延迟。
类型:float
运行状态可修改:是
出现范围:[1,1]
数值范围:[0.000000,FLOAT_MAX]
默认值:0.000000
传输延迟仿真:在接收端(上游),射频管道将计算并应用每个数据包的传输延迟,然后将其发送到堆栈。传输延迟计算如下:传输时延=消息持续时间+传播延迟。
消息持续时间由发射机通过公共PHY报头传播来提供。延迟由物理层使用位置事件来计算,并作为每个分组控制信息的一部分来提供。
使用用户定义的数据包完成率(PCR)曲线作为 SINR 函数。射频管道不会施加任何额外的带内干扰影响。因此,只有当物理层噪声模式(noisemode)设置为带外时,在 PCR 曲线文件中使用负 SINR 值才有效,以便将噪底提高到固有接收器灵敏度之上。
关于噪声模式:
定义噪声处理操作模式:无、全部、带外或直通。
类型:string
运行状态可修改:否
出现范围:[1,1]
默认值:全部
正则表达式:^(none|all|outofband|passthrough)$
关于SINR:
SINR:信号与干扰加噪声比 (Signal to Interference plus Noise Ratio)是指接收到的有用信号的强度与接收到的干扰信号(噪声和干扰)的强度的比值;可以简单的理解为“信噪比”。
1.2. 数据包完成率
射频管道数据包完成率被指定为通过 XML 语言定义的曲线。曲线定义由一系列 SINR 值及其相应的接收概率组成。曲线定义必须包含至少两个点,一个 SINR 代表POR = 0,一个 SINR 代表 POR = 100。当没有找到精确的 SINR 匹配时,执行线性插值。
在曲线文件中指定数据包大小(<表> 属性pktsize
)将根据接收到的数据包大小调整 POR。当计算 POR 时,指定 pktsize 为0将忽略收到的数据包大小。
当指定非零 pktsize 时,POR 通过以下计算获得:POR = POR0^(S1/S0)。
POR0 是根据给定 SINR 值的 PCR 曲线确定的 POR 值。S0 是曲线文件(pktsize)中指定的数据包大小。S1 是接收到的数据包大小。
仿真器提供以下默认的射频管道 PCR 曲线定义。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pcr SYSTEM "file:///usr/share/emane/dtd/rfpipepcr.dtd">
<pcr>
<table pktsize="0">
<row sinr="0.0" por="0"/>
<row sinr="0.5" por="2.5"/>
<row sinr="1.0" por="5"/>
<row sinr="1.5" por="7.5"/>
<row sinr="2.0" por="10"/>
<row sinr="2.5" por="12.5"/>
<row sinr="3.0" por="15"/>
<row sinr="3.5" por="17.5"/>
<row sinr="4.0" por="20"/>
<row sinr="4.5" por="22.5"/>
<row sinr="5.0" por="25"/>
<row sinr="5.5" por="27.5"/>
<row sinr="6.0" por="30"/>
<row sinr="6.5" por="32.5"/>
<row sinr="7.0" por="35"/>
<row sinr="7.5" por="37.5"/>
<row sinr="8.0" por="40"/>
<row sinr="8.5" por="42.5"/>
<row sinr="9.0" por="45"/>
<row sinr="9.5" por="47.5"/>
<row sinr="10.0" por="50"/>
<row sinr="10.5" por="52.5"/>
<row sinr="11.0" por="55"/>
<row sinr="11.5" por="57.5"/>
<row sinr="12.0" por="60"/>
<row sinr="12.5" por="62.5"/>
<row sinr="13.0" por="65"/>
<row sinr="13.5" por="67.5"/>
<row sinr="14.0" por="70"/>
<row sinr="14.5" por="72.5"/>
<row sinr="15.0" por="75"/>
<row sinr="15.5" por="77.5"/>
<row sinr="16.0" por="80"/>
<row sinr="16.5" por="82.5"/>
<row sinr="17.0" por="85"/>
<row sinr="17.5" por="87.5"/>
<row sinr="18.0" por="90"/>
<row sinr="18.5" por="92.5"/>
<row sinr="19.0" por="95"/>
<row sinr="19.5" por="97.5"/>
<row sinr="20.0" por="100"/>
</table>
</pcr>
上面的定义产生以下PCR曲线:
1.3. 配置参数
以下配置参数可用于定制层功能:
-
数据速率
以 bps 为单位定义传输数据速率。发射机使用数据速率来计算连续传输之间的传输延迟(数据包大小/数据速率)。- 类型:uint64
- 运行状态可修改:是
- 出现范围:[1,1]
- 数值范围:[1,18446744073709551615]
- 默认值:1000000
-
延迟
定义应用于每个传输数据包的额外固定延迟(秒)。- 类型:float
- 运行状态可修改:是
- 出现范围:[1,1]
- 数值范围:[0.000000,FLOAT_MAX]
- 默认值:0.000000
-
启用混杂模式(enablepromiscuousmode)
定义是否启用混杂模式。 如果启用了混杂模式,则将通过接收检查概率的所有接收到的数据包(是否打算给定节点)发送到传输的上游。- 类型:bool
- 运行状态可修改:yes
- 出现范围:[1,1]
- 数值范围:[no,yes]
- 默认值:yes
-
流量可控(flowcontrolenable)
定义是否启用流量控制。流量控制仅适用于虚拟传输,并且设置必须与虚拟传输配置中的设置相匹配。- 类型:bool
- 运行状态可修改:no
- 出现范围:[1,1]
- 数值范围:[no,yes]
- 默认值:no
-
流控制令牌(flowcontroltokens)
定义无需刷新即可从虚拟传输中处理的最大流量控制令牌数(数据包传输单位)。任何给定时间可用令牌的数量与虚拟传输相协调,当令牌计数达到零时,不再传输数据包,导致应用程序套接字队列备份。- 类型:uint16
- 运行状态可修改:否
- 出现范围:[1,1]
- 数值范围:[0,65535]
- 默认值:10
-
抖动
定义应用于每个传输数据包的延迟抖动(秒)。基于 +/- 配置抖动值之间的均匀随机分布,抖动被添加到配置延迟。- 类型:float
- 运行状态可修改:是
- 出现范围:[1,1]
- 数值范围:[0.000000,FLOAT_MAX]
- 默认值:0.000000
-
邻居删除时间(neighbormetricdeletetime)
定义从邻居表中删除给定邻居之前没有接收到射频信号的时间(秒)。- 类型:float
- 运行状态可修改:是
- 出现范围:[1,1]
- 数值范围:[1.000000,3660.000000]
- 默认值: 60.000000
-
pcrcurveuri
定义 PCR 曲线文件的 URI。PCR 曲线文件包含作为信号干扰加噪声比(SINR )函数的接收曲线概率。- 类型:字符串
- 运行状态可修改:no
- 所需值:yes
- 出现范围:[1,1]
-
radiometricenable
定义是否通过“无线电到路由器接口”(R2RI)报告无线电指标。- 类型:bool
- 运行状态可修改:no
- 出现范围:[1,1]
- 数值范围:[no,yes]
- 默认值:否
-
radiometricreportinterval
定义支持 R2RI 功能的度量报告间隔(秒)。- 类型:float
- 运行状态可修改:no
- 出现范围:[1,1]
- 值范围:[0.100000,60.000000]
- 默认值:1.000000
1.4. XML 示例
RF Pipe 配置使用两个文件指定:
- NEM定义文件
- MAC定义文件
NEM定义文件将mac定义文件以及仿真器物理层配置和传输定义文件分组在一起。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE nem SYSTEM "file:///usr/share/emane/dtd/nem.dtd">
<nem>
<transport definition="transvirtual.xml"/>
<mac definition="rfpipemac.xml"/>
<phy>
<param name="fixedantennagain" value="0.0"/> <!-- 固定天线增益:0 -->
<param name="fixedantennagainenable" value="on"/> <!-- 固定天线增益使能:开 -->
<param name="bandwidth" value="1M"/> <!-- 带宽:1MHz -->
<param name="noisemode" value="none"/> <!-- 噪声模式:带外 -->
<param name="propagationmodel" value="precomputed"/> <!-- 传播模型:预计算 -->
<param name="systemnoisefigure" value="4.0"/> <!-- 系统噪声指数:4.0 -->
<param name="subid" value="2"/> <!-- 子id:2 -->
<param name="txpower" value="0.0"/> <!-- 发射机功率:0 -->
</phy>
</nem>
mac定义文件指定仿真器将加载的模型 DLL 和所需的模型配置。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mac SYSTEM "file:///usr/share/emane/dtd/mac.dtd">
<mac library="rfpipemaclayer">
<param name="enablepromiscuousmode" value="off"/> <!-- 启用混杂模式:关 -->
<param name="datarate" value="1M"/> <!-- 数据速率:1Mb/s -->
<param name="jitter" value="0"/> <!-- 抖动:0 -->
<param name="delay" value="0"/> <!-- 时延:0 -->
<param name="flowcontrolenable" value="off"/> <!-- 流量控制:关 -->
<param name="flowcontroltokens" value="10"/> <!-- 流量控制令牌:10 -->
<param name="pcrcurveuri" <!-- PCR曲线URL:路径 -->
value="file:///usr/share/emane/xml/models/mac/rfpipe/rfpipepcr.xml"/>
</mac>
1.5. 统计数据
可以使用emanesh访问以下统计信息。
名称 | 类型 | 可清除 | 描述 |
---|---|---|---|
processedConfiguration | uint64 | yes | |
processedDownstreamControl | uint64 | yes | |
processedDownstreamPackets | uint64 | yes | |
processedEvents | uint64 | yes | |
processedTimedEvents | uint64 | yes | |
processedUpstreamControl | uint64 | yes | |
processedUpstreamPackets | uint64 | yes |
1.6. 统计表
可以使用emanesh访问以下统计信息。
名称 | 可清除 | 描述 |
---|---|---|
BroadcastPacketAcceptTable0 | yes | 接受广播数据包 |
BroadcastPacketDropTable0 | yes | 按原因码丢弃的广播数据包 |
EventReceptionTable | yes | 收到的事件计数 |
NeighborMetricTable | no | 邻居度量表 |
NeighborStatusTable | no | 邻居状态表 |
UnicastPacketAcceptTable0 | yes | 接受单播数据包 |
UnicastPacketDropTable0 | yes | 单播数据包被原因码丢弃 |
2. IEEE 802.11abg Model
对应 Wiki:https://github.com/adjacentlink/emane/wiki/IEEE-802.11abg-Model
2.1. 特点
IEEE 802.11abg 无线电模型提供了以下一组功能:
-
支持流量控制。
-
通过适当的时序支持以下波形模式和数据速率。
-
802.11b(DSS速率:1、2、5.5和11 Mbps)。
-
802.11a/g(OFDM速率:6、9、12、18、24、36、48和54 Mbps)。
-
802.11b/g(DSS 和 OFDM 速率)。
-
仅支持 DCF 通道访问功能。不支持 PCF 和信标传输。
-
支持单播和广播传输。 单播传输包括模拟控制消息(RTS/CTS)行为以及重试的能力,而无需实际传输控制消息或重新传输数据消息。 由于检测到故障,单播仿真不会复制竞争窗口的指数增长。
-
支持Wi-Fi多媒体(WMM)功能。 初始实现支持对四个不同的流量类别(背景,尽力而为,视频和语音)进行分类的能力,其中优先级较高的类别(语音和视频)将首先得到服务。
-
支持作为 SINR 函数的用户定义的数据包完成率曲线。
-
为每种受支持的802.11调制和数据速率组合提供了默认曲线。 默认曲线基于用于确定加性高斯白噪声(AWGN)通道中的误码率(BER)的理论方程式。
-
IEEE 802.11abg无线电模型会根据检测到的冲突在每个数据包的基础上调整干扰,因此支持负SINR值,如默认曲线所示。
2.2. 数据包完成率
IEEE 802.11abg 数据包完成率被指定为通过 XML 定义的曲线。 曲线定义由一系列 SINR 值及其对应的接收概率组成。 曲线定义必须至少包含两个点,其中一个 SINR 表示 POR = 0,一个SINR 表示 POR =100。当未找到精确的 SINR 匹配时,将执行线性插值。
在曲线文件中指定数据包大小 (<table> 属性pktsize)
将根据接收到的数据包大小来调整POR。 将 pktsize 指定为 0会在计算 POR 时忽略接收的数据包大小。
当指定非零的 pktsize 时,使用以下计算获得 POR:POR = POR0^(S1/S0)。
- POR0 是从 PCR 曲线确定的给定 SINR 值的 POR 值。
- S0 是曲线文件中指定的数据包大小(pktsize)。
- S1 是接收到的数据包大小。
仿真器提供以下默认PCR曲线定义。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pcr SYSTEM "file:///usr/share/emane/dtd/ieee80211pcr.dtd">
<pcr>
<table pktsize="128">
<!-- 1Mpbs -->
<datarate index="1">
<row sinr="-9.0" por="0.0"/>
<row sinr="-8.0" por="1.4"/>
<row sinr="-7.0" por="21.0"/>
<row sinr="-6.0" por="63.5"/>
<row sinr="-5.0" por="90.7"/>
<row sinr="-4.0" por="98.6"/>
<row sinr="-3.0" por="99.9"/>
<row sinr="-2.0" por="100.0"/>
</datarate>
<!-- 2Mpbs -->
<datarate index="2">
<row sinr="-6.0" por="0"/>
<row sinr="-5.0" por="1.4"/>
<row sinr="-4.0" por="20.6"/>
<row sinr="-3.0" por="63.1"/>
<row sinr="-2.0" por="90.5"/>
<row sinr="-1.0" por="98.5"/>
<row sinr="0.0" por="99.9"/>
<row sinr="1.0" por="100.0"/>
</datarate>
<!-- 5.5Mpbs -->
<datarate index="3">
<row sinr="-2.0" por="0.0"/>
<row sinr="-1.0" por="0.2"/>
<row sinr="0.0" por="9.1"/>
<row sinr="1.0" por="46.2"/>
<row sinr="2.0" por="82.8"/>
<row sinr="3.0" por="96.7"/>
<row sinr="4.0" por="99.6"/>
<row sinr="5.0" por="100.0"/>
</datarate>
<!-- 11Mpbs -->
<datarate index="4">
<row sinr="1.0" por="0.0"/>
<row sinr="2.0" por="0.2"/>
<row sinr="3.0" por="8.9"/>
<row sinr="4.0" por="45.8"/>
<row sinr="5.0" por="82.5"/>
<row sinr="6.0" por="96.7"/>
<row sinr="7.0" por="99.6"/>
<row sinr="8.0" por="100.0"/>
</datarate>
<!-- 6Mpbs -->
<datarate index="5">
<row sinr="-2.0" por="0.0"/>
<row sinr="-1.0" por="5.5"/>
<row sinr="0.0" por="39.8"/>
<row sinr="1.0" por="79.0"/>
<row sinr="2.0" por="96.0"/>
<row sinr="3.0" por="99.5"/>
<row sinr="4.0" por="100.0"/>
</datarate>
<!-- 9Mpbs -->
<datarate index="6">
<row sinr="-1.0" por="0.0"/>
<row sinr="0.0" por="0.3"/>
<row sinr="1.0" por="10.5"/>
<row sinr="2.0" por="50.3"/>
<row sinr="3.0" por="84.9"/>
<row sinr="4.0" por="97.5"/>
<row sinr="5.0" por="99.7"/>
<row sinr="6.0" por="100.0"/>
</datarate>
<!-- 12Mpbs -->
<datarate index="7">
<row sinr="3.0" por="0.0"/>
<row sinr="4.0" por="14.3"/>
<row sinr="5.0" por="55.2"/>
<row sinr="6.0" por="87.5"/>
<row sinr="7.0" por="97.8"/>
<row sinr="8.0" por="99.8"/>
<row sinr="9.0" por="100.0"/>
</datarate>
<!-- 18Mpbs -->
<datarate index="8">
<row sinr="4.0" por="0.0"/>
<row sinr="5.0" por="1.7"/>
<row sinr="6.0" por="21.5"/>
<row sinr="7.0" por="65.0"/>
<row sinr="8.0" por="91.2"/>
<row sinr="9.0" por="98.7"/>
<row sinr="10.0" por="99.9"/>
<row sinr="11.0" por="100.0"/>
</datarate>
<!-- 24Mpbs -->
<datarate index="9">
<row sinr="9.0" por="0.0"/>
<row sinr="10.0" por="2.2"/>
<row sinr="11.0" por="23.8"/>
<row sinr="12.0" por="64.4"/>
<row sinr="13.0" por="90.4"/>
<row sinr="14.0" por="98.4"/>
<row sinr="15.0" por="99.8"/>
<row sinr="16.0" por="100.0"/>
</datarate>
<!-- 36Mpbs -->
<datarate index="10">
<row sinr="10.0" por="0.0"/>
<row sinr="11.0" por="0.1"/>
<row sinr="12.0" por="4.6"/>
<row sinr="13.0" por="32.4"/>
<row sinr="14.0" por="72.8"/>
<row sinr="15.0" por="93.4"/>
<row sinr="16.0" por="99.0"/>
<row sinr="17.0" por="99.9"/>
<row sinr="18.0" por="100.0"/>
</datarate>
<!-- 48Mpbs -->
<datarate index="11">
<row sinr="16.0" por="0.0"/>
<row sinr="17.0" por="1.3"/>
<row sinr="18.0" por="15.8"/>
<row sinr="19.0" por="53.5"/>
<row sinr="20.0" por="84.9"/>
<row sinr="21.0" por="96.8"/>
<row sinr="22.0" por="99.6"/>
<row sinr="23.0" por="100.0"/>
</datarate>
<!-- 54Mpbs -->
<datarate index="12">
<row sinr="17.0" por="0.0"/>
<row sinr="18.0" por="0.2"/>
<row sinr="19.0" por="5.7"/>
<row sinr="20.0" por="32.4"/>
<row sinr="21.0" por="71.3"/>
<row sinr="22.0" por="92.4"/>
<row sinr="23.0" por="99.9"/>
<row sinr="24.0" por="100.0"/>
</datarate>
</table>
</pcr>
上面的定义为 IEEE 802.11b(DSS)生成了以下PCR曲线:
上面的定义为 IEEE 802.11ag(OFDM)产生以下PCR曲线:
2.3. 配置参数
2.4. XML 示例
IEEE 802.11abg 配置使用两个文件指定:
- NEM 定义文件
- MAC 定义文件
NEM 定义文件将 mac 定义文件以及仿真器物理层配置和传输定义文件分组在一起。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE nem SYSTEM "file:///usr/share/emane/dtd/nem.dtd">
<nem>
<transport definition="transvirtual.xml"/>
<mac definition="ieee80211abgmac.xml"/>
<phy>
<param name="fixedantennagain" value="0.0"/>
<param name="fixedantennagainenable" value="on"/>
<param name="bandwidth" value="20M"/>
<param name="noisemode" value="none"/>
<param name="propagationmodel" value="precomputed"/>
<param name="systemnoisefigure" value="4.0"/>
<param name="subid" value="2"/>
<param name="txpower" value="0.0"/>
<param name="subid" value="1"/>
</phy>
</nem>
mac 定义文件指定仿真器将加载的模型 DLL 以及所需的模型配置。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mac SYSTEM "file:///usr/share/emane/dtd/mac.dtd">
<mac library="ieee80211abgmaclayer">
<param name="mode" value="0"/>
<param name="enablepromiscuousmode" value="off"/>
<param name="distance" value="1000"/>
<param name="unicastrate" value="4"/>
<param name="multicastrate" value="1"/>
<param name="rtsthreshold" value="0"/>
<param name="pcrcurveuri"
value="file:///usr/share/emane/xml/models/mac/ieee80211abg/ieee80211pcr.xml"/>
<param name="flowcontrolenable" value="off"/>
<param name="flowcontroltokens" value="10"/>
</mac>
2.5. 统计数据
可以使用emanesh访问以下统计信息。
表格略。
2.6. 统计表
可以使用emanesh访问以下统计信息。
表格略。
3. TDMA Model
对应 Wiki:https://github.com/adjacentlink/emane/wiki/TDMA-Model
3.1. 特点
TDMA 无线电模型实现了一个通用的时分多址方案,支持时分多址调度分发和使用事件实时更新。TDMA 无线电模式支持以下功能:
-
支持TDMA调度定义,包括时隙大小,时隙开销,帧大小以及每个时隙数据速率,频率,功率,服务等级和可选目的地。
-
支持优先级队列,该队列根据 DSCP 映射用户流量。 出站消息根据时隙服务类队列映射和从最高优先级到最低优先级的队列搜索(必要时)从 FIFO 中出队。
-
支持基于每个时隙数据速率的大型出站消息的分段和重组。
-
支持将较小的出站消息聚合成较大的无线消息。
-
支持流量控制。
-
支持作为 SINR 函数的用户定义的数据包完成率曲线。
3.1.1. Queuing(排队)
TDMA 模型将用户流量分为四类,它们映射到四个队列。 根据下游数据包优先级将流量分配给队列。queue.depth
配置参数控制所有队列的队列深度。当在最大队列深度的队列上发生入队操作时,所有队列都将溢出,并丢弃最旧的数据包。被选择丢弃的数据包将是最旧的数据包,其中由于分段而没有传输该数据包的任何部分。如果队列中的所有数据包都已传输了一部分,则最旧的数据包将被丢弃,无论分段状态如何。
虚拟传输和原始传输使用 DSCP 作为下游数据包优先级。
队列ID | DSCP(IP TOS字段的6个MSB) | 队列优先级 |
---|---|---|
0 | 0-7,24-31 | 0(lowest) |
1 | 8-23 | 1 |
2 | 32-47 | 2 |
3 | 48-63 | 3 |
4 | 保留控制 | 4(highest) |
所有传输时隙都分配有一个等级或服务。此类代表四个流量队列之一或第五个保留的调度程序控制队列。如果启用了 queue.stricttxdequeue
配置参数,则只有与传输时隙类匹配的队列才用于使流量出列。如果 queue.stricttxdequeue
被禁用,则会尝试将流量从时隙类匹配队列中出队,然后是优先级从高到低的所有其他队列。
根据当前传输时隙是否分配了目的地 NEM,队列可以以两种方式之一出队。如果指定了目的地,只有与目的地匹配的数据包才会出队(先进先出)。如果没有找到目的地匹配,则不会发生传输。如果没有指定目的地,数据包将被取消队列(先进先出),而不管它们的目的地是哪里。
每个时隙具有相同的大小和开销,这是使用 TDMA 调度事件分配的。 可以为发送时隙分配不同的数据速率,从而使时隙具有不同的最大字节限制。 TDMA 模型支持分段和聚合,并允许独立启用或禁用。
3.1.2. Fragmentation(分段)
如果使用 queue.fragmentationenable
配置参数启用分段,则一个太大而无法放入给定传输时隙的大数据包将被分段为两个或多个消息组件。所需消息组件的实际数量无法事先确定,因为每个时隙的允许大小和目的地分配可能会有所不同。如果分段被禁用,过大的数据包将被丢弃,直到找到合适的数据包。如果在与队列和 queue.stricttxdequeue
匹配的插槽类中没有找到任何数据包,将会搜索其他队列,但由于长度原因,不会丢弃任何数据包。在这种情况下,一旦发现数据包对于给定的时隙来说太大,搜索就在该队列中结束,并在下一个最低优先级队列中继续。
3.1.3. Aggregation(聚合)
如果使用 queue.aggregationenable
配置参数启用了聚合,则可以在单个时隙中传输用于相同或不同目的地(单播或广播)的一个或多个消息组件。如果单个时隙传输中包含的所有消息组件都用于同一 NEM 目的地,则将该目的地用作下游(出站)数据包目的地。 否则,将 NEM 广播地址用作下游数据包目标。 后一种情况并不意味着 TDMA 模型将这些消息视为广播。 TDMA 模型将包含在单个传输中的每个消息组件作为单独的消息进行处理。 但是,在检查物理层统计信息时,单播和广播传输的概念有点模糊。
如果启用分段,聚合传输中的一个或多个消息组件可能是一个分段。 queue.aggregationslotthreshold
配置参数控制必须填充的时隙的百分比,以便满足聚合功能并防止进一步搜索和/或分割分组以填充该时隙。
3.1.4. Fragment Reassembly(分段重组)
如果禁用分段和/或聚合,则 TDMA 模型仍将处理上游(入站)聚合消息,并类似于数据包片段。 TDMA 模型将尝试同时对来自一个或多个源的一个或多个数据包进行片段重组。 使用两个配置参数来控制何时应放弃各个片段重组工作:fragmentcheckthreshold
和 fragmenttimeoutthreshold
。 fragmentcheckthreshold
配置参数控制模型检查查看是否应该放弃任何活动的重组工作的频率。 fragmenttimeoutthreshold
配置参数是自收到用于特定重组工作的片段以来必须经过的时间,以便将该工作视为超时并随后被放弃。
无线电模型不会处理乱序的片段。一旦接收到非连续片段,就放弃对该分组的重组工作。
3.1.5. Statistics Packets vs Bytes(统计数据包与字节)
聚合和分段使得难以传达基于分组的统计信息。TDMA 模型通过跟踪使用消息组件的字节统计信息和传递队列信息的数据包统计信息来解决此问题。 这与其他无线电型号不同。
3.1.6. Timing and Slot Size(时隙和时序大小)
TDMA模型需要正确的时间同步。时间同步所需的紧密度是使用 TDMA 多址调度 事件配置的时隙大小的函数。 系统配置,仿真节点数,流量情况和一般资源可用性,都是确定可实现的时隙大小的因素。
3.1.7. TDMA Schedule(TDMA 调度)
TDMA 模型使用三个单位来描述时间分配:时隙,帧和多帧。 时隙是最小的时间单位,以微秒为单位定义。时隙支持最大长度的单个突发的传输,这考虑了有效负载和开销(前导,报头,保护时间,传播延迟等)。框架包含许多插槽。复帧包含许多帧。
TDMA 模型通过 TDMA 调度事件接收调度。TDMA 调度有两种类型:完整和更新。 完整的 TDMA 调度表定义了正在使用的 TDMA 结构以及每个 NEM 的发送,接收和空闲时隙的分配。TDMA 结构定义:
- 时隙大小(以微秒为单位)
- 时隙开销(以微秒为单位)
- 每帧插槽数
- 每多帧的帧数
- 收发器带宽(单位:Hz)
时隙开销应设置为考虑各种波形开销参数,如同步、波形头、周转时间、传播延迟等。当在仿真中使用位置事件时,至少应将时隙开销设置为信号预期传播的最大值。如果希望在时分多址模式下支持10公里的范围,调度中的开销应该设置为至少34微秒。这将确保每个帧中打包的最大数据量+最大传播延迟将始终小于时隙大小。否则,当接收结束跨越时隙边界时,会导致帧被接收器丢弃。
更新的 TDMA 调度会更改 NEM 的时隙分配信息,但不会更改 TDMA 结构。
可以将 TDMA 时隙分配为发送、接收和空闲。 为发送时隙分配了频率(Hz),功率(dBm),类别([0,4]),数据速率(bps)和可选的目标 NEM。 接收时隙被分配了一个频率(Hz)。 空闲时隙没有分配,表示 NEM 既不在发送也不在接收。
当 TDMA 模型实例收到调度时,它将在1970年1月1日UTC时间00:00:00所引用的下一个多帧边界的开始处生效。
3.1.8. Defining a TDMA Schedule(定义 TDMA 调度)
TDMA 调度是使用 XML 定义的。 XML 模式记录了编写调度所涉及的详细信息。 需要考虑的一些重要事项:
- 包含
< structure >
元素的调度是完整调度,而不包含< structure >
元素的调度是更新调度。 - 多帧可以定义默认频率、功率、数据速率和类别。一个帧可以定义相同的默认值,覆盖多帧中定义的所有或部分默认值。传输时隙可以覆盖全部或部分帧或多帧默认值,并添加可选的目的地 NEM。接收时隙只能覆盖频率。
- 对于完整的调度,未定义的任何帧对于调度中引用的所有 NEM 都是空闲的。
- 对于完整的调度,任何未在帧中定义的时隙将是调度中引用的所有网元的接收时隙。如果指定,将使用帧默认频率。否则,将使用多帧默认频率。
- 对于更新调度,仅修改分配给指定 NEM 的那些时隙。没有接收时隙或空闲帧自动填充发生。
- 对于完整的调度,NEM 使用的一组频率被发送到物理层,以配置频谱监视器监视的感兴趣的频率列表。
- 对于更新调度,NEM 使用的任何附加频率都将添加到自上次完整调度以来缓存的 FOI频率集中,并发送到物理层。
- 接收完整的调度会重置所有 TDMA 调度信息。
- TDMA模型实例可以拒绝包含错误的计划。 使用以下统计信息来传达对计划的接受和拒绝:
- scheduler.scheduleAcceptFull
- scheduler.scheduleAcceptUpdate
- scheduler.scheduleRejectFrameIndexRange
- scheduler.scheduleRejectSlotIndexRange
- scheduler.scheduleRejectUpdateBeforeFull
- scheduler.scheduleRejectOther
- 使用
emaneevent-tdmaschedule
时,只有调度 XML 文件中引用的 NEM 会接收事件。 因此,必须在完整的调度内引用使用 TDMA 模型的方案中的所有 NEM。 - 收到包含一个或多个错误的完整或更新的调度将导致 TDMA 模型实例刷新所有调度信息,重置为没有调度的初始状态。
一个 XML 调度例子:
<emane-tdma-schedule >
<structure frames='4' slots='10' slotoverhead='0' slotduration='1000' bandwidth='1M'/>
<multiframe frequency='2.4G' power='0' class='0' datarate='1M'>
<frame index='0'>
<slot index='0,5' nodes='1'>
<tx/>
</slot>
<slot index='1,6' nodes='2'>
<tx/>
</slot>
<slot index='2,7' nodes='3'>
<tx/>
</slot>
<slot index='3,8' nodes='4'>
<tx power='30'/>
</slot>
<slot index='4,9' nodes='5'>
<tx/>
</slot>
</frame>
<frame index='1' datarate='11M'>
<slot index='0:4' nodes='1'>
<tx/>
</slot>
<slot index='5' nodes='2'>
<tx/>
</slot>
<slot index='6' nodes='3'>
<tx/>
</slot>
<slot index='7' nodes='4'>
<tx/>
</slot>
<slot index='8' nodes='5'>
<tx destination='2'/>
</slot>
</frame>
<frame index='2'>
<slot index='0:9' nodes='1'>
<tx frequency='2G' class='3'/>
</slot>
<slot index='0:9' nodes='2:10'>
<rx frequency='2G'/>
</slot>
</frame>
</multiframe>
</emane-tdma-schedule>
3.1.9. 发送一个 TDMA 调度
使用 TDMA 调度事件将 TDMA 调度发送到 TDMA 模型实例。emaneevent-tdmaschedule
脚本可用于处理 TDMA Schedule XML 文件。 调度事件将发送到调度 XML 中引用的每个 NEM。 每个事件仅包含收件人 NEM 的调度信息。
[me@host ~]$# emaneevent-tdmaschedule schedule-sample.xml -i lo
3.1.10. 验证 TDMA 调度
TDMA 模型实例包含统计信息,以指示接受和拒绝的完整调度和更新调度的数量。
[me@host ~]$ emanesh localhost get stat 1 mac | grep scheduler
nem 1 mac scheduler.scheduleAcceptFull = 4
nem 1 mac scheduler.scheduleAcceptUpdate = 0
nem 1 mac scheduler.scheduleRejectFrameIndexRange = 0
nem 1 mac scheduler.scheduleRejectSlotIndexRange = 0
nem 1 mac scheduler.scheduleRejectUpdateBeforeFull = 0
TDMA 模型实例维护一个时间表和结构表,该表指示当前的时间表和时隙结构。
[me@host ~]$ emanesh localhost get table 1 mac scheduler.ScheduleInfoTable scheduler.StructureInfoTable
nem 1 mac scheduler.ScheduleInfoTable
| Index | Frame | Slot | Type | Frequency | Data Rate | Power | Class | Destination |
| 0 | 0 | 0 | TX | 2400000000 | 1000000 | 0.0 | 0 | 0 |
| 1 | 0 | 1 | RX | 2400000000 | | | | |
| 2 | 0 | 2 | RX | 2400000000 | | | | |
| 3 | 0 | 3 | RX | 2400000000 | | | | |
| 4 | 0 | 4 | RX | 2400000000 | | | | |
| 5 | 0 | 5 | TX | 2400000000 | 1000000 | 0.0 | 0 | 0 |
| 6 | 0 | 6 | RX | 2400000000 | | | | |
| 7 | 0 | 7 | RX | 2400000000 | | | | |
| 8 | 0 | 8 | RX | 2400000000 | | | | |
| 9 | 0 | 9 | RX | 2400000000 | | | | |
| 10 | 1 | 0 | TX | 2400000000 | 11000000 | 0.0 | 0 | 0 |
| 11 | 1 | 1 | TX | 2400000000 | 11000000 | 0.0 | 0 | 0 |
| 12 | 1 | 2 | TX | 2400000000 | 11000000 | 0.0 | 0 | 0 |
| 13 | 1 | 3 | TX | 2400000000 | 11000000 | 0.0 | 0 | 0 |
| 14 | 1 | 4 | TX | 2400000000 | 11000000 | 0.0 | 0 | 0 |
| 15 | 1 | 5 | RX | 2400000000 | | | | |
| 16 | 1 | 6 | RX | 2400000000 | | | | |
| 17 | 1 | 7 | RX | 2400000000 | | | | |
| 18 | 1 | 8 | RX | 2400000000 | | | | |
| 19 | 1 | 9 | RX | 2400000000 | | | | |
| 20 | 2 | 0 | TX | 2000000000 | 1000000 | 0.0 | 3 | 0 |
| 21 | 2 | 1 | TX | 2000000000 | 1000000 | 0.0 | 3 | 0 |
| 22 | 2 | 2 | TX | 2000000000 | 1000000 | 0.0 | 3 | 0 |
| 23 | 2 | 3 | TX | 2000000000 | 1000000 | 0.0 | 3 | 0 |
| 24 | 2 | 4 | TX | 2000000000 | 1000000 | 0.0 | 3 | 0 |
| 25 | 2 | 5 | TX | 2000000000 | 1000000 | 0.0 | 3 | 0 |
| 26 | 2 | 6 | TX | 2000000000 | 1000000 | 0.0 | 3 | 0 |
| 27 | 2 | 7 | TX | 2000000000 | 1000000 | 0.0 | 3 | 0 |
| 28 | 2 | 8 | TX | 2000000000 | 1000000 | 0.0 | 3 | 0 |
| 29 | 2 | 9 | TX | 2000000000 | 1000000 | 0.0 | 3 | 0 |
| 30 | 3 | 0 | IDLE | | | | | |
| 31 | 3 | 1 | IDLE | | | | | |
| 32 | 3 | 2 | IDLE | | | | | |
| 33 | 3 | 3 | IDLE | | | | | |
| 34 | 3 | 4 | IDLE | | | | | |
| 35 | 3 | 5 | IDLE | | | | | |
| 36 | 3 | 6 | IDLE | | | | | |
| 37 | 3 | 7 | IDLE | | | | | |
| 38 | 3 | 8 | IDLE | | | | | |
| 39 | 3 | 9 | IDLE | | | | | |
nem 1 mac scheduler.StructureInfoTable
| Name | Value |
| bandwidth | 1000000 |
| frames | 4 |
| slotduration | 1000 |
| slotoverhead | 0 |
| slots | 10 |