CSMA网络的仿真

其实CSMA网络的仿真原理很简单,就是产生一个随机的退避时间加上一个网络是否空间的侦听,我看别人写的程序中是给$bus给定一个0或者1,当bus为0时表示信道是空闲的,此时退避到0的网络节点就可以发送数据,反之,如果检测到信道是忙的情况下,那么就继续原地“数羊”。那么究竟能不能用程序语言去仿真实现这个过程呢,that is a problem…让我头疼的问题,这个随机的退避时间如何产生,如果采用单一的总线 ,那么怎么将模型和我建设的四个节点的模型连接起来呢?难道需要四条总线?

现在的毕业设计已经顺利的答辩了。仿真的程序也搞出来了,我实现的是利用php仿真实现无线CSMA协议CSMA/CA协议。代码如下,给以后有需要的人看看吧。

<?php
//use php to simulink ICN
header("Content-Type:text/html;charset=utf-8");
$start_time = time();
set_time_limit(0);//忽略系统的执行时间
//设定每次传输的时间是0s;
//退避时间的产生是rand(1,15)秒,给四个节点一次性生成,四个节点分别是n1,n2,n3,n4,四条总线分别是l1,l2,l3,l4
//设定一次发送的过程是100s
//开始生成初始状态的退避时间
$p1 = $p2 = $p3 = $p4 = 0;//设计每个节点发送的数据量是0
function sleep2($num)
{
     $sleeptime = $num;
         for($i=0;$i<$sleeptime*1000;$i++)
         {
              //空循环1000的被数次
         }
}
for($i=1;$i<5;$i++)
{
     $s[$i] = rand(1,5);
}
    //生成完了随机的退避时间,开始传输
     $l1 = $l2 = $l3 = $l4 =0;//设定四条总线都是空闲的
     for($j=0;$s[1]>-1,$s[2]>-1,$s[3]>-1,$s[4]>-1,$j<10000;$s[1]--,$s[2]--,$s[3]--,$s[4]--,$j++)//最多循环100次
         {
             if($s[1] == 0)
                 {
                         //此时要检测 3 4 是否传输
                         if($s[3] == 0)
                         {
                             //$p3++;
                                 $s[3] = rand(1,5);
                         }
                         if($s[4] == 0)
                         {
                             //$p4 ++ ;
                                 $s[4] = rand(1,5);
                         }
                         sleep2(rand(1,5));
                         $p1++;
                         $s[1] = rand(1,5);
                 }
                 
                 if($s[2] == 0)
                 {
                         //此时 1 3 4 都不可能处在传输状态
                         $p2++;
                         sleep2(rand(1,18));
                         $s[1] = rand(1,5);
                 }
                 
                 if($s[3] == 0)
                 {
                     $p3++;
                         $s[3] = rand(1,5);
                         //检测1
                         if($s[1] == 0)
                         {
                             //$p1++;
                                 $s[1] = rand(1,5);
                         }
                         sleep2(rand(1,5));
                 }
                 
                 if($s[4] == 0)
                 {
                     $p4++;
                         $s[4] = rand(1,5);
                         //检测1
                         if($s[1] == 0)
                         {
                             //$p1++;
                                 $s[1] = rand(1,5);
                         }
                         sleep2(rand(1,5));
                 }
         }
$end_time = time();
$total_time = $end_time - $start_time;
echo "Node 1-4 transmit date number are:\n";
var_dump($p1,$p2,$p3,$p4);
echo "\n";
echo "Total run time is:".$total_time.'s';
echo "\n";
?>