在
NS-2
中,错误模型(
Error
Model
)用来模拟信道上的丢包,可以通过这
个来设置节点固定丢包。以下给出一些方法,详见
ns manual
第
13
章。
1
、
创建一个固定丢包率的错误模型:
#
创建一个
loss_module
,并将其分组错误率置为
1%
set loss_module [new ErrorModel]
$loss_module set rate_ 0.01
#
可选项:设置单位和随机变量
$loss_module unit pkt
;# error
单位:分组(默认)
$loss_module ranvar [new RandomVariable/Uniform]
#
为丢失的分组设置
target
$loss_module drop-target [new Agent/Null]
2
、
上面的定义只是定义单一固定的丢包率,而在
ErrorModel
类中,可
以定义更加复杂的情况,
需要定义
ErrorModel
衍生类,
重新定义其
corrupt
方法,
ErrorModel
类的详细代码见
~ns/queue/errmodel.{cc, h}
3
、
将错误模型与无线节点绑定
对于无线节点来说,
ErrorModel
就像是添加于
MAC
与
NETIF
之间,
用于控制数据分组的信息。
无线协议栈的插入可以通过调用
node-config
命令来完成,它有两个
选项:
IncomingErrrProc
和
OutgoingErrProc
。
我们可以同时使用这两个选
项或分开使用其中任何一个。这两个选项的自变量(
argument
)是可创
建错误模型对象的全局过程名,
给新建的
error
模块赋适合的必要的初始
值,最终会返回该对象的指针。以下展示了在无线协议栈中添加
error
模块的简单的
Tcl
示例脚本。
$ns
node-config
-IncomingErrProc
UniformErr
-OutgoingErrProc
UniformErr
proc UniformErr
set err [new ErrorModel]
$err unit packet
return $err
上面这个是在
tcl
文件中实现的,运用了
NS-2
中的错误模型。而也可以在
C++
中来实现固定随机丢包率,方法有几种,可以修改物理层,在物理层接收包
时进行随机丢包,也可以修改
MAC
层,在
MAC
层实现。下面以
802.11
为例,
修改
MAC-802_11.cc
,实现固定随机丢包率。
在
MAC-802_11.cc
中,接收下层数据包的函数为
void Mac802_11::recv(Packet *p, Handler *h)
其中部分代码如下:
if(tx_active_ && hdr->error() == 0) {
hdr->error() = 1;
}
if(rx_state_ == MAC_IDLE) {
setRxState(MAC_RECV);
pktRx_ = p;
/*
* Schedule the reception of this packet, in
* txtime seconds.
*/
……
..
}
修改第一段代码,实现随机丢包,如下:
if(tx_active_ && hdr->error() == 0) {
hdr->error() = 1;
}
else if(hdr->error() == 0) {
int szrandom = 0,error_rate = 10;
srand( (unsigned) time(NULL)+nodeId_);
//
产生随机数
szrandom = rand()%100;
//
限制在
1-100
以内
if (szrandom <= error_rate) {
hdr->error() = 1;
//
小于
error_rate
的包丢弃
}
}