zoukankan      html  css  js  c++  java
  • opnet点对点通信模型 分类: opnet 2014-05-26 22:15 246人阅读 评论(3) 收藏

    网络包含两个节点,一个发送节点,一个接收节点。发送节点按照某种随机的规律产生数据包(包大小和包间隔可自己定义),然后发送给接收节点。传输过程中会有一些随机的差错(误包率也可自己定义)。接收节点收到正确的包之后统计吞吐量。并可将接收吞吐量与发送吞吐量进行比较,观察误包率对接收吞吐量的影响。

    模型中发送节点模型为一个处理器类的节点,其进程模型为:


    其用于产生ICI数据结构,并且使用远程中断进行发送和检错重传

    发送节点为六个状态,其中五个为强制状态一个为非强制状态,无转移函数

    Init的入口代码为

    pk_code=0;

    pk_count=0;

    pk_number=0;

    该函数作用为获得仿真属性值,参数为属性类型、属性名、指向属性值得指针

    op_ima_sim_attr_get(OPC_DOUBLE,"FailureRate",&frate);

    获得分级名称指定的对象ID

    dest_id=op_id_from_hierarchical_name("top.my_rx_node.rx_pro") ;为接收节点的进程

    统计量注册,返回统计量句柄

    transmitted_index= op_stat_reg("Transmitted Index", OPC_STAT_INDEX_NONE,OPC_STAT_GLOBAL);

    transmitted_traffic= op_stat_reg("Transmitted Traffic", OPC_STAT_INDEX_NONE,OPC_STAT_GLOBAL);

    generate_index= op_stat_reg("Generating Index", OPC_STAT_INDEX_NONE,OPC_STAT_GLOBAL);

    ack_state=1;

    该函数作用是为调用进程预设一个中断,第一个参数为预设的中断时间,第二个参数是用户自定义的代码,在头文件中有声明,op_sim_time为获取当前仿真时间

    op_intrpt_schedule_self(op_sim_time(),INTRPT_NEW_PKT);

     

     

    init状态执行完之后,进入idle状态,其入口代码为

    if(pk_count>0&& ack_state)

             op_intrpt_schedule_self(op_sim_time(),PK_SEND);

    头文件

    #defineINTRPT_NEW_PKT  0  自定义中断

    #definePK_SEND 1   自定义中断

    #defineRE_SEND 2   自定义中断

    #defineGEN (op_intrpt_type() == OPC_INTRPT_SELF && op_intrpt_code() ==INTRPT_NEW_PKT)

    GEN条件中断类型为自中断,且中断值为INTRPT_NEW_PKT,第一次中断

    #defineSEND (op_intrpt_type() == OPC_INTRPT_SELF && op_intrpt_code() ==PK_SEND && ack_state == OPC_TRUE)

    SEND条件:中断类型为自中断,且中断值为PK_SEND

    #defineACK (op_intrpt_type() == OPC_INTRPT_REMOTE && op_intrpt_code()  == pk_code)

    ACK条件中断类型为远程中断,并且中断值为pk_code

    #defineRESEND (op_intrpt_type() == OPC_INTRPT_SELF && op_intrpt_code() ==RE_SEND)

    RESEND条件:中断类型为自中断,并且中断值为RE_SEND

     

     

    第一次条件GEN成立,进入gen状态,其入口代码

    pk_count++;

    pk_number++;

    op_dist_uniform函数的作用是产生一个均匀分布的随机值,取值范围为0-0.2

    op_intrpt_schedule_self(op_sim_time()+ op_dist_uniform(0.2),INTRPT_NEW_PKT);

    op_stat_write(generate_index,pk_number);

    gen状态运行后回到init,之后满足SECD条件进入send状态,其入口代码为

    pk_code++;

    pk_count--;

    创建一个接口

    获取给定接口的某属性值

    pk_inf=op_ici_create("my_td");

    op_ici_attr_set(pk_inf,"index",pk_code);

    size_dist=op_dist_load("Normal",1000,10000);

    pk_size=op_dist_outcome(size_dist);随机生成的包大小

    if(pk_size<0)

             pk_size=0;

    elseif(pk_size>10000)

             pk_size=10000;

    op_ici_attr_set(pk_inf,"size",pk_size);

    op_ici_attr_set(pk_inf,"fal_rate",frate);

    op_ici_install(pk_inf);创建一个与输出中断相关联的接口

    op_intrpt_schedule_remote(op_sim_time(),pk_code,dest_id);预设一个远程中断

    ack_state=0;

    re_send=op_intrpt_schedule_self(op_sim_time()+0.2,RE_SEND);

    op_stat_write(transmitted_index,pk_code);

    op_stat_write(transmitted_traffic,pk_size);

    op_ici_install(OPC_NIL);  拆除当前ICI的绑定

    send 状态结束后ACK条件满足,进入ack状态,其入口代码为

    op_ev_cancel(re_send);撤销事件

    ack_state=1;

    send状态出错,就会进入resend状态,其入口代码

    op_ici_install(pk_inf);

    op_intrpt_schedule_remote(op_sim_time(),pk_code,dest_id);

    re_send=op_intrpt_schedule_self(op_sim_time()+0.2,RE_SEND);

    op_ici_install(OPC_NIL);拆除当前ICI的绑定(释放)




    接收节点为四个状态,其中三个为强制状态,一个为非强制状态,无转移函数

    Init的入口代码为

    send_id=op_id_from_hierarchical_name("top.my_tx_node.tx_pro");发送节点的ID

    获得分级名称指定的对象ID

    received_index= op_stat_reg("Received Index",OPC_STAT_INDEX_NONE, OPC_STAT_GLOBAL);

    received_traffic= op_stat_reg("Received Traffic", OPC_STAT_INDEX_NONE,OPC_STAT_GLOBAL);

    统计量注册,接收数目和索引

     

    头文件为

    #defineARRIVAL (op_intrpt_type() == OPC_INTRPT_REMOTE) 远程中断

    #defineEND (op_intrpt_type() == OPC_INTRPT_ENDSIM)  结束仿真中断

    声明了包到达的条件及仿真结束的标志

     

     

    当包到达时进入arrival状态,执行以下代码

    pk_index=op_intrpt_code();

    intrpt_ici=op_intrpt_ici();返回与当前中断相关联的接口

    op_ici_attr_get(intrpt_ici,"size",&pk_size);

    op_ici_attr_get(intrpt_ici,"fal_rate",&frate);

    if(op_dist_uniform(1)>=frate)

             {

             op_ici_destroy(intrpt_ici);

             op_intrpt_schedule_remote(op_sim_time()+op_dist_uniform(0.1),pk_index,send_id);       

             }

    op_stat_write(received_index,pk_index);

    op_stat_write(received_traffic,pk_size);

     





  • 相关阅读:
    vue项目index.html缓存
    vue刷新当前页面
    keep-alive
    JS刷算法题:二叉树
    CSS动效集锦,视觉魔法的碰撞与融合(三)
    算法:栈和队列题目集合(一)
    浅谈设计模式(二):装饰器模式|中介模式|原型模式
    聊聊JS的二进制家族:Blob、ArrayBuffer和Buffer
    浅谈设计模式(一):状态模式|外观模式|代理模式
    纵论WebAssembly,JS在性能逆境下召唤强援
  • 原文地址:https://www.cnblogs.com/galway/p/4643685.html
Copyright © 2011-2022 走看看