worm.cc
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:9k
源码类别:

通讯编程

开发平台:

Visual C++

  1. // simple worm model based on message passing
  2. // 
  3. #include "worm.h"
  4. #include "random.h"
  5. #include "math.h"
  6. // timer for sending probes
  7. void ProbingTimer::expire(Event*) {
  8.   t_->timeout();
  9. }
  10. // base class for worm: host is invulnerable by default
  11. static class WormAppClass : public TclClass {
  12. public:
  13. WormAppClass() : TclClass("Application/Worm") {}
  14. TclObject* create(int, const char*const*) {
  15. return (new WormApp());
  16. }
  17. } class_app_worm;
  18. // Initialize static variables
  19. double WormApp::total_addr_ = pow(2, 32);
  20. int WormApp::first_probe_ = 0;
  21. WormApp::WormApp() : Application() {
  22.   // get probing rate from configuration
  23.   bind("ScanRate", &scan_rate_);
  24.   // get probing port from configuration
  25.   bind("ScanPort", &scan_port_);
  26.   // get probing port from configuration
  27.   bind("ScanPacketSize", &p_size_);
  28. }
  29. void WormApp::process_data(int nbytes, AppData* data) {
  30.   recv(nbytes);
  31. }
  32. void WormApp::recv(int nbytes) {
  33.   if (!first_probe_) {
  34.     first_probe_ = 1;
  35.     printf("D FP %.2fn", Scheduler::instance().clock());
  36.   }
  37.   //printf("D U %.2f %dn",
  38.   //       Scheduler::instance().clock(), my_addr_);
  39. }
  40. void WormApp::timeout() {
  41. }
  42. int WormApp::command(int argc, const char*const* argv) {
  43.   Tcl& tcl = Tcl::instance();
  44.   if (argc == 3) {
  45.     if (strcmp(argv[1], "attach-agent") == 0) {
  46.       agent_ = (Agent*) TclObject::lookup(argv[2]);
  47.       if (agent_ == 0) {
  48. tcl.resultf("no such agent %s", argv[2]);
  49. return(TCL_ERROR);
  50.       }
  51.       agent_->attachApp(this);
  52.       my_addr_ = agent_->addr();
  53.       //printf("%dn", my_addr_);
  54.       return(TCL_OK);
  55.     }
  56.   }
  57.   return(Application::command(argc, argv));
  58. }
  59. // Initialize stats (number of infected hosts) for DN
  60. unsigned long DnhWormApp::infect_total_ = 0;
  61. unsigned long DnhWormApp::addr_high_ = 0;
  62. unsigned long DnhWormApp::addr_low_ = 0;
  63. unsigned long DnhWormApp::default_gw_ = 0;
  64. float DnhWormApp::local_p_ = 0;
  65. // class to model vulnerable hosts in detailed network
  66. static class DnhWormAppClass : public TclClass {
  67. public:
  68. DnhWormAppClass() : TclClass("Application/Worm/Dnh") {}
  69. TclObject* create(int, const char*const*) {
  70. return (new DnhWormApp());
  71. }
  72. } class_app_worm_dnh;
  73. DnhWormApp::DnhWormApp() : WormApp() {
  74.   infected_ = false;
  75.   timer_ = NULL;
  76. }
  77. void DnhWormApp::recv(int nbytes) {
  78.   if (infected_) {
  79.     //printf("Node %d is infected already...n", my_addr_);
  80.   } else {
  81.     if (!first_probe_) {
  82.         first_probe_ = 1;
  83.         printf("D FP %.2fn", Scheduler::instance().clock());
  84.     }
  85.     printf("D C %.2f %lu %lun", 
  86.         Scheduler::instance().clock(), infect_total_, my_addr_);
  87.     
  88.     // start to probe other hosts
  89.     probe();
  90.   }
  91. }
  92. void DnhWormApp::timeout() {
  93.   timer_->resched(p_inv_);
  94.   send_probe();
  95. }
  96. void DnhWormApp::probe() {
  97.   infected_ = true;
  98.   infect_total_++;
  99.   if (scan_rate_) {
  100.     p_inv_ = 1.0 / scan_rate_;
  101.     timer_ = new ProbingTimer((WormApp *)this);
  102.     timer_->sched(p_inv_);
  103.   }
  104. }
  105. void DnhWormApp::send_probe() {
  106.   double range_low, range_high;
  107.   unsigned long d_addr;
  108.   ns_addr_t dst;
  109.   // do not probe myself
  110.   d_addr = my_addr_;
  111.   
  112.   if (Random::uniform(0.0, 1.0) < local_p_) {
  113.     range_low = addr_low_;
  114.     range_high = addr_high_;
  115.   } else {
  116.     range_low = 0;
  117.     range_high = total_addr_;
  118.   }
  119.   
  120.   while (d_addr == my_addr_)
  121.     d_addr = static_cast<unsigned long>(Random::uniform(range_low, range_high));
  122.   // probe within my AS
  123.   if (addr_low_ <= d_addr && d_addr <= addr_high_) {
  124.     //printf("D PD %.2f %d %dn", 
  125. //   Scheduler::instance().clock(), my_addr_, d_addr);
  126.   } else {
  127.     //printf("Node %d is probing node %d, within AN, send to node %dn", 
  128.     //    my_addr_, d_addr, default_gw_);
  129.   }
  130.   dst.addr_ = d_addr;
  131.   dst.port_ = scan_port_;
  132.   agent_->sendto((int)p_size_, (const char *)NULL, dst);
  133. }
  134. int DnhWormApp::command(int argc, const char*const* argv) {
  135.   if (argc == 3) {
  136.     if (strcmp(argv[1], "gw") == 0) {
  137.       default_gw_ = atol(argv[2]);
  138.       return(TCL_OK);
  139.     }
  140.     if (strcmp(argv[1], "local-p") == 0) {
  141.         local_p_ = atof(argv[2]);
  142.         return(TCL_OK);
  143.     }   
  144.   }
  145.   if (argc == 4) {
  146.     if (strcmp(argv[1], "addr-range") == 0) {
  147.       addr_low_ = atol(argv[2]);
  148.       addr_high_ = atol(argv[3]);
  149.       //printf("DN low: %d, high: %dn", addr_low_, addr_high_);
  150.       return(TCL_OK);
  151.     }
  152.   }
  153.   return(WormApp::command(argc, argv));
  154. }
  155. // class to model vulnerable hosts in detailed network
  156. static class AnWormAppClass : public TclClass {
  157. public:
  158. AnWormAppClass() : TclClass("Application/Worm/An") {}
  159. TclObject* create(int, const char*const*) {
  160. return (new AnWormApp());
  161. }
  162. } class_app_worm_an;
  163. AnWormApp::AnWormApp() : WormApp() {
  164.   // using 1 second as the unit of time step
  165.   //time_step_ = 1;
  166.   timer_ = NULL;
  167.   addr_low_ = addr_high_ = my_addr_;
  168.   s_ = i_ = 0;
  169.   v_percentage_ = 0;
  170.   beta_ = gamma_ = 0;
  171.   n_ = r_ = 1;
  172.   
  173.   probe_in = probe_out = probe_recv = 0;
  174.   // get time step from configuration
  175.   bind("TimeStep", &time_step_);
  176. }
  177. void AnWormApp::start() {
  178.   // initial value of i and s
  179.   i_ = 1;
  180.   s_ -= 1;
  181.   timer_ = new ProbingTimer((WormApp *)this);
  182.   timer_->sched((double)time_step_);
  183.   //printf("startn");
  184. }
  185. void AnWormApp::recv(int nbytes) {
  186.   probe_recv++;
  187.   
  188.   //printf("AN (%d) received probes from outside...%f n", my_addr_, probe_recv);
  189. }
  190. void AnWormApp::timeout() {
  191.   //printf("timeoutn");
  192.   timer_->resched((double)time_step_);
  193.   update();
  194. }
  195. void AnWormApp::update() {
  196.   // schedule next timeout
  197.   timer_->resched(time_step_);
  198.   probe_out = scan_rate_ * i_ * (dn_high_ - dn_low_ + 1)  * time_step_ / total_addr_;
  199.   // not every probe received has effect
  200.   probe_in = probe_recv * s_ / n_;
  201.   probe_recv = 0;
  202.   // update states in abstract networks
  203.   // update r (recovered/removed)
  204.   r_ = r_ + gamma_ * i_;
  205.   if (r_ < 0)
  206.     r_ = 0;
  207.   if (r_ > n_)
  208.     r_ = n_;
  209.   // update i (infected)
  210.   // contains four parts:
  211.   // 1. i of last time period, 2. increase due to internal probing
  212.   // 3. decrease due to internal recovery/removal,
  213.   // 4. increase due to external probing
  214.   // should use n_ or s_max_???
  215.   //i_ = i_ + beta_ * i_ * (s_ / n_) * time_step_ - gamma_ * i_ + probe_in;
  216.   i_ = i_ + beta_ * i_ * (s_ / s_max_) * time_step_ - gamma_ * i_ + probe_in;
  217.   if (i_ < 0)
  218.     i_ = 0;
  219.   if (i_ > n_ - r_)
  220.     i_ = n_ - r_;
  221.  
  222.   // update s (susceptible)
  223.   // use n = r + i + s
  224.   s_ = n_ - r_ - i_;
  225.   printf("A %.2f %d %d %d %d %dn",
  226.  Scheduler::instance().clock(),
  227.  (int)s_, (int)i_, (int)r_, (int)probe_in, (int)probe_out);
  228.   // probe outside networks
  229.   // should not be cumulated!!!
  230.   //probe_out = 2;
  231.   if (probe_out > 1) { 
  232.     //printf("ANS %.2f %d %d %d %d %dn", 
  233.     //        Scheduler::instance().clock(), 
  234.     //        (int)s_, (int)i_, (int)r_, (int)probe_in, (int)probe_out);
  235.     probe((int)(probe_out + 0.5));
  236.   }
  237. }
  238. void AnWormApp::probe(int times) {
  239.   // send out probes in a batch
  240.   int i;
  241.   unsigned long d_addr;
  242.   ns_addr_t dst;
  243.   i = 0;
  244.   while (i < times) {
  245.     d_addr = dn_low_ + (int)Random::uniform(dn_high_ - dn_low_);
  246.     // do not send to myself or AS
  247.     if (dn_low_ < d_addr && d_addr < dn_high_) {
  248.       // probe outside
  249.       //printf("AN is probing node %d, outside ANn", d_addr);
  250.       dst.addr_ = d_addr;
  251.       dst.port_ = scan_port_;
  252.       agent_->sendto((int)p_size_, (const char *)NULL, dst);
  253.       i++;
  254.     }
  255.   }
  256. }
  257. int AnWormApp::command(int argc, const char*const* argv) {
  258.   if (argc == 3) {
  259.     if (strcmp(argv[1], "v_percent") == 0) {
  260.       if (n_ == 0) {
  261. printf("space range is not specificed!n");
  262. return(TCL_ERROR);
  263.       } else {
  264. v_percentage_ = atof(argv[2]);
  265. s_ = (int)(n_ * v_percentage_);
  266. if (s_ < 1)
  267.   s_ = 1;
  268. s_max_ = s_;
  269. r_ = n_ - s_;
  270. // use the equation in Moore's Internet Quarantine paper:
  271. // beta = scan_rate * total_vulnerable / 2^32
  272. beta_ = scan_rate_ * s_max_ / total_addr_;
  273. //printf("inferred beta from scan rate: %f, %f, %d, %fn", 
  274. // beta_, scan_rate_, (int)s_max_, total_addr_);
  275. return(TCL_OK);
  276.       }
  277.     }
  278.     if (strcmp(argv[1], "beta") == 0) {
  279.       beta_ = atof(argv[2]);
  280.       //printf("beta: %fn", beta_);
  281.       return(TCL_OK);
  282.     }
  283.     if (strcmp(argv[1], "gamma") == 0) {
  284.       gamma_ = atof(argv[2]);
  285.       //printf("gamma: %fn", gamma_);
  286.       return(TCL_OK);
  287.     }
  288.   }
  289.   if (argc == 4) {
  290.     if (strcmp(argv[1], "addr-range") == 0) {
  291.       addr_low_ = atol(argv[2]);
  292.       addr_high_ = atol(argv[3]);
  293.       // initialize SIR model states
  294.       n_ = addr_high_ - addr_low_ + 1;
  295.       //printf("AN low: %d, high: %d, n: %fn", addr_low_, addr_high_, n_);
  296.       return(TCL_OK);
  297.     }
  298.     if (strcmp(argv[1], "dn-range") == 0) {
  299.       dn_low_ = atoi(argv[2]);
  300.       dn_high_ = atoi(argv[3]);
  301.       //printf("AN-DN low: %d, high: %dn", dn_low_, dn_high_);
  302.       return(TCL_OK);
  303.     }
  304.   }
  305.   return(WormApp::command(argc, argv));
  306. }