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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /* 
  3.  * Copyright 2002, Statistics Research, Bell Labs, Lucent Technologies and
  4.  * The University of North Carolina at Chapel Hill
  5.  * 
  6.  * Redistribution and use in source and binary forms, with or without 
  7.  * modification, are permitted provided that the following conditions are met:
  8.  * 
  9.  *    1. Redistributions of source code must retain the above copyright 
  10.  * notice, this list of conditions and the following disclaimer.
  11.  *    2. Redistributions in binary form must reproduce the above copyright 
  12.  * notice, this list of conditions and the following disclaimer in the 
  13.  * documentation and/or other materials provided with the distribution.
  14.  *    3. The name of the author may not be used to endorse or promote 
  15.  * products derived from this software without specific prior written 
  16.  * permission.
  17.  * 
  18.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 
  19.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
  20.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
  21.  * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 
  22.  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
  23.  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
  24.  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
  25.  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
  26.  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
  27.  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
  28.  * POSSIBILITY OF SUCH DAMAGE.
  29.  */
  30. /*
  31.  * Reference
  32.  *     Stochastic Models for Generating Synthetic HTTP Source Traffic 
  33.  *     J. Cao, W.S. Cleveland, Y. Gao, K. Jeffay, F.D. Smith, and M.C. Weigle 
  34.  *     IEEE INFOCOM 2004.
  35.  *
  36.  * Documentation available at http://dirt.cs.unc.edu/packmime/
  37.  * 
  38.  * Contacts: Michele Weigle (mcweigle@cs.unc.edu),
  39.  *           Kevin Jeffay (jeffay@cs.unc.edu)
  40.  */
  41. #ifndef ns_packmime_h
  42. #define ns_packmime_h
  43. #include "timer-handler.h"
  44. #include "app.h"
  45. #include "node.h"
  46. #include "packmime_ranvar.h"
  47. #include <string>
  48. #include <stack>
  49. #include <queue>
  50. #include <map>
  51. #define MAX_NODES 10 
  52. class FullTcpAgent;
  53. class PackMimeHTTP;
  54. class PackMimeHTTPTimer;
  55. class PackMimeHTTPServerApp;
  56. class PackMimeHTTPClientApp;
  57. /*::::::::::::::::::::::::: TIMER HANDLER classes :::::::::::::::::::::::::::*/
  58. class PackMimeHTTPServerAppTimer : public TimerHandler {
  59.  public:
  60. PackMimeHTTPServerAppTimer(PackMimeHTTPServerApp* t) : TimerHandler(), 
  61. t_(t) {}
  62. virtual void handle(Event*);
  63. virtual void expire(Event*);
  64.  protected:
  65. PackMimeHTTPServerApp* t_;
  66. };
  67. class PackMimeHTTPClientAppTimer : public TimerHandler {
  68.  public:
  69. PackMimeHTTPClientAppTimer(PackMimeHTTPClientApp* t) : TimerHandler(), 
  70. t_(t) {}
  71. virtual void handle(Event*);
  72. virtual void expire(Event*);
  73.  protected:
  74. PackMimeHTTPClientApp* t_;
  75. };
  76. class PackMimeHTTPTimer : public TimerHandler {
  77. public:
  78. PackMimeHTTPTimer(PackMimeHTTP* mgr) : TimerHandler(), mgr_(mgr) {}
  79. inline PackMimeHTTP* mgr() {return mgr_;}
  80. protected:
  81. virtual void handle(Event* e);
  82. virtual void expire(Event* e);
  83. PackMimeHTTP* mgr_;                     // pointer to PackMimeHTTP object
  84. };
  85. /*:::::::::::::::::::::::: PACKMIME APPLICATION Classes ::::::::::::::::::::*/
  86. class PackMimeHTTPClientApp : public Application {
  87.  public:
  88. PackMimeHTTPClientApp() : Application(), id_(0), running_(0), 
  89.   persistent_(false),
  90.   totalbytes_(0), reqsize_(0), rspsize_(0), 
  91.   reqs_(0), reqsize_array_(NULL), 
  92.   rspsize_array_(NULL), reqgap_array_(NULL), 
  93.   array_ind_ (0), time_of_req_(0.0),
  94.   timer_(this), server_(NULL), mgr_(NULL) {};
  95. ~PackMimeHTTPClientApp();
  96. void timeout();
  97. void start();
  98. void stop();
  99. void recycle();
  100. inline void set_server(PackMimeHTTPServerApp* server) {server_ = server;}
  101. inline const char* get_agent_name() {return agent_->name();}
  102. inline PackMimeHTTPServerApp* get_server() {return server_;}
  103. inline void set_agent(Agent* tcp) {agent_ = tcp;}
  104. inline void set_mgr(PackMimeHTTP* mgr) {mgr_ = mgr;}
  105. inline void set_id (int id) {id_ = id;}
  106. inline int get_id () {return id_;}
  107.  protected:
  108. void recv(int bytes);
  109. int id_;
  110. int running_;
  111. bool persistent_;                // persistent connection?
  112. int totalbytes_;
  113. int reqsize_;
  114. int rspsize_;
  115. int reqs_;                      // total requests in this connection
  116. int* reqsize_array_;            // array of request sizes
  117. int* rspsize_array_;            // array of response sizes
  118. double* reqgap_array_;          // array of request intervals
  119. int array_ind_;                 // index into the arrays
  120. double time_of_req_;
  121. PackMimeHTTPClientAppTimer timer_;
  122. PackMimeHTTPServerApp* server_;     // pointer to Server
  123. PackMimeHTTP* mgr_;                 // pointer to PackMimeHTTP object
  124. };
  125. class PackMimeHTTPServerApp : public Application {
  126.  public:
  127. PackMimeHTTPServerApp() : Application(), id_(0), running_(0), 
  128.   reqsize_(0), rspsize_(0), reqs_(0),
  129.   lastreq_(false), totalbytes_(0), 
  130.   timer_(this), mgr_(NULL) {};
  131. ~PackMimeHTTPServerApp();
  132. void timeout();
  133. void stop();
  134. inline const char* get_agent_name() {return agent_->name();}
  135. inline void start() {running_ = 1;}
  136. inline void set_agent(Agent* tcp) {agent_ = tcp;}
  137. inline void set_mgr(PackMimeHTTP* mgr) {mgr_ = mgr;}
  138. inline void set_id (int id) {id_ = id;}
  139. inline int get_id () {return id_;}
  140. inline void set_reqsize(int size) {reqsize_ = size;}
  141. inline void set_rspsize(int size) {rspsize_ = size;}
  142. inline void set_reqs(int reqs) {reqs_ = reqs;}
  143. inline void set_last_req() {lastreq_ = true;}
  144. void recycle();
  145.  protected:
  146. void recv(int bytes);
  147. int id_;
  148. int running_;
  149. int reqsize_;
  150. int rspsize_;
  151. int reqs_;                    // total number of requests
  152. bool lastreq_;                // is this the last request?
  153. int totalbytes_;              // total bytes received so far
  154. PackMimeHTTPServerAppTimer timer_;
  155. PackMimeHTTP* mgr_;                 // pointer to PackMimeHTTP object
  156. };
  157. /*::::::::::::::::::::::::: class PACKMIME :::::::::::::::::::::::::::::::::*/
  158. class PackMimeHTTP : public TclObject {
  159.  public:
  160. PackMimeHTTP();
  161. ~PackMimeHTTP();
  162. void recycle (PackMimeHTTPClientApp*);
  163. void recycle (PackMimeHTTPServerApp*);
  164. void setup_connection ();
  165. void incr_pairs();
  166. inline double now() {return Scheduler::instance().clock();}
  167. inline int get_active() {return active_connections_;}
  168. inline int get_total() {return total_connections_;}
  169. inline int running() {return running_;}
  170. inline int debug() {return debug_;}
  171. inline int get_ID() {return ID_;}
  172. inline int get_warmup() {return warmup_;}
  173. inline double get_rate() {return rate_;}
  174. inline bool using_http_1_1() {return http_1_1_;}
  175. inline bool use_pm_persist_rspsz() {return use_pm_persist_rspsz_;}
  176. inline bool use_pm_persist_reqsz() {return use_pm_persist_reqsz_;}
  177. /* HTTP 1.0 random variable fns */
  178. double connection_interval();
  179. int get_reqsize();
  180. int get_rspsize();
  181. double get_server_delay();
  182. /* HTTP 1.1 random variable fns */
  183. bool is_persistent();
  184. int get_num_pages();
  185. int get_num_objs(int pages);
  186. double get_reqgap (int page, int obj);
  187. int adjust_persist_rspsz();
  188. void reset_persist_rspsz();
  189. inline FILE* get_outfp() {return outfp_;}
  190. inline FILE* get_fileszfp() {return fileszfp_;}
  191. inline FILE* get_samplesfp() {return samplesfp_;}
  192.  protected:
  193. virtual int command (int argc, const char*const* argv);
  194. void start();
  195. void stop();
  196. void cleanup();
  197. void recycle (FullTcpAgent*);
  198. FullTcpAgent* picktcp();
  199. PackMimeHTTPServerApp* pickServerApp();
  200. PackMimeHTTPClientApp* pickClientApp();
  201. PackMimeHTTPTimer timer_;
  202. double connection_interval_;  // set in setup_connection()
  203. // variables used to maintain array of server and client nodes
  204. int next_client_ind_;    
  205. int next_server_ind_;
  206. int total_nodes_;
  207. int current_node_;
  208. // TCL configurable variables
  209. Node* server_[MAX_NODES];
  210. Node* client_[MAX_NODES];
  211. char tcptype_[20];         // {Reno, Tahoe, NewReno, SACK}
  212. FILE* outfp_;              // output file for completed pairs
  213. FILE* fileszfp_;           // output file for requested pairs (@ server)
  214. FILE* samplesfp_;          // output file for requested pairs (@ client)
  215. double rate_;              // connections per second
  216. int segsize_;              // FullTCP max segment size
  217. int segsperack_;           // = 2 for delayed ACKS
  218. double interval_;          // delayed ACK interval
  219. int ID_;                   // PackMimeHTTP cloud ID
  220. int run_;                  // exp run number (for RNG stream selection)
  221. int debug_;
  222. int goal_pairs_;           // req/rsp pairs to allow
  223. int cur_pairs_;            // number of current req/rsp pairs
  224. int warmup_;               // warmup interval (s)
  225. bool http_1_1_;            // use HTTP 1.1?  (default: no)
  226. bool use_pm_persist_rspsz_; // use PM response sizes for persistent conns (def: yes)
  227. bool use_pm_persist_reqsz_; // use PM request size rule for persistent conns (def: yes)
  228. int active_connections_;   // number of active connections
  229. int total_connections_;    // number of total connections
  230. int running_;              // start new connections?
  231. // statistics objects
  232. RandomVariable* flowarrive_rv_;
  233. RandomVariable* reqsize_rv_;
  234. RandomVariable* rspsize_rv_;
  235. PackMimeHTTPPersistRspSizeRandomVariable* persist_rspsize_rv_;
  236. RandomVariable* persistent_rv_;
  237. RandomVariable* num_pages_rv_;
  238. RandomVariable* single_obj_rv_;
  239. RandomVariable* objs_per_page_rv_;
  240. RandomVariable* time_btwn_pages_rv_;
  241. RandomVariable* time_btwn_objs_rv_;
  242. RandomVariable* server_delay_rv_;
  243. RNG* flowarrive_rng_;
  244. RNG* reqsize_rng_;
  245. RNG* rspsize_rng_;
  246. RNG* persist_rspsize_rng_;
  247. RNG* persistent_rng_;
  248. RNG* num_pages_rng_;
  249. RNG* single_obj_rng_;
  250. RNG* objs_per_page_rng_;
  251. RNG* time_btwn_pages_rng_;
  252. RNG* time_btwn_objs_rng_;
  253. RNG* server_delay_rng_;
  254. // helper methods
  255. TclObject* lookup_obj(const char* name) {
  256.                 TclObject* obj = Tcl::instance().lookup(name);
  257.                 if (obj == NULL) 
  258.                         fprintf(stderr, "Bad object name %sn", name);
  259.                 return obj;
  260.         }
  261. inline int lookup_rv (RandomVariable*& rv, const char* name) {
  262. if (rv != NULL)
  263. Tcl::instance().evalf ("delete %s", rv->name());
  264. rv = (RandomVariable*) lookup_obj (name);
  265. return rv ? (TCL_OK) : (TCL_ERROR);
  266. }
  267. // Agent and App Pools
  268. std::queue<FullTcpAgent*> tcpPool_;
  269. std::queue<PackMimeHTTPClientApp*> clientAppPool_;
  270. std::queue<PackMimeHTTPServerApp*> serverAppPool_;
  271. // string = tcpAgent's name
  272. map<string, PackMimeHTTPClientApp*> clientAppActive_;
  273. map<string, PackMimeHTTPServerApp*> serverAppActive_;
  274. };
  275. #endif