无线网络模拟中分组在节点内部的流程

模拟仿真时在OTcl脚本中建立一个数据发送代理并绑定到一个节点,再建立一个数据接收代理并绑定到另一个节点,然后连接两个代理即可以在两个节点之间建立业务联系,OTcl脚本中类似于如下的代码:

 set udp0 [new Agent/UDP]   ;#建立一个UDP数据发送代理

 $ns attach-agent $n(0) $udp0   ;#将数据发送代理绑定到发送节点

 set null0 [new Agent/Null]    ;#建立一个数据接收代理

 $ns attach-agent $n(2) $null0   ;#将接收代理绑定到接收节点

 $ns connect $udp0 $null0      ;#连接两个代理

在此基础上建立某种业务流并将该业务流绑定到数据发送代理上,节点之间就会以该业务流所设定的规律传送分组。

#UDP代理上建立CBR

set cbr0 [new Application/Traffic/CBR] ;#建立一个FTP业务流

$cbr0 attach-agent $udp0    ;#FTP业务流与UDP代理相绑定

CBR业务流的C++代码定时发送信号给UDP数据发送代理,UDP数据发送代理接收到信号以后,分配内存空间生成一个分组,UDP代理将这个分组交到下一层,在apps/udp.cc源文件中的sendmsg函数中有一句代码:

  target_->recv(p);

target_代表下一层的对象指针,但这个target_对象实际上是CMUTrace类的一个实例对象。CMUTrace类的功能就是专门对无线网络的分组进行跟踪和记录,并将该记录写入模拟过程中生成的".tr"文件。因此分组从UDP代理往下传递的活动会被记录到跟踪文件中。CMU类的recv函数中有一句代码:

 send(p,h)

调用的这个send函数是Connector类的send函数,send函数将分组交付给Classifier类的recv函数。Classifier类的recv函数中有一句代码:

 node->recv(p,h);

Node指针调用的recv函数仍旧是CMUTrace类的recv函数,分组的活动被再次记录到Trace文件中。CMUTrace类调用Connector类的send函数将分组传递给路由协议的recv函数。假定使用的无线路由协议是AODV路由协议,AODV类的forward函数中有一句代码:

Scheduler::instance().schedule(target_,p,delay);

这句代码将分组加入调度器中等待调度,调度时刻到来分组会被CMUTrace类的recv函数所接收进行活动记录,记录完毕再调用Connector类的send函数将分组传递给LL类的recv函数,recv函数调用sendDown函数接收分组,sendDown函数调用ARPTable类的arpresolve函数进行地址解析。sendDown函数中有一句代码:

s.schedule(downtarget_,p,delay_);

downtarget_指针是队列的对象实例,分组将由队列的recv函数接收。假定所使用的队列是PriQueue,PriQueue类的recv函数调用recvHighPriority函数接收分组,recvHighPriority
函数中一段代码

target_->recv(q,&qh_);

这一段代码将分组交给MAC层的recv函数。MAC层会将分组交给CMUTrace类的recv函数进行活动记录,然后再传送给物理层。无线信道经过相应的传播延迟,发送给邻居层节点的物理层接收。

你可能感兴趣的:(c,网络,活动,脚本,null,delay)