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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1991-1997 Regents of the University of California.
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  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. All advertising materials mentioning features or use of this software
  15.  *    must display the following acknowledgement:
  16.  * This product includes software developed by the Computer Systems
  17.  * Engineering Group at Lawrence Berkeley Laboratory.
  18.  * 4. Neither the name of the University nor of the Laboratory may be used
  19.  *    to endorse or promote products derived from this software without
  20.  *    specific prior written permission.
  21.  *
  22.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25.  * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32.  * SUCH DAMAGE.
  33.  *
  34.  */
  35. #include "agent.h"
  36. #include "packet.h"
  37. #include "ip.h"
  38. #include "timer-handler.h"
  39. #include "random.h"
  40. #define SMALLFLOAT 0.0000001
  41. /* receiver response */ 
  42. #define DECREASE 1
  43. #define NORMAL 2
  44. #define INCREASE 3
  45. #define MAXSEQ 1073741824   /* Number that curseq_ is set to for */
  46.                                 /* "infinite send" (2^30)            */
  47. /* modes of rate change */
  48. #define SLOW_START 1
  49. #define CONG_AVOID 2
  50. #define RATE_DECREASE  3
  51. #define OUT_OF_SLOW_START 4 
  52. struct hdr_tfrc {
  53. // RFC 3448 specifies that the data packet include the sequence
  54. // number, timestamp, and RTT estimate.
  55. int seqno; //data sequence number
  56. double timestamp;  //time this message was sent
  57. double rtt;   //RTT estimate of sender
  58. // "rate" is used by one of the experimental algorithms, RBPH.
  59. double rate; //sender's current rate
  60. // In a real implementation, tzero, psize, and fsize
  61. // would not be in the packet header.
  62. // They are here for convenience.
  63. double tzero;   //RTO in Umass eqn
  64. int psize; //Packet size.
  65. int fsize; //The default large packet size for VoIP.  
  66.   // UrgentFlag is used to request that a loss report be sent
  67. //  immediately.
  68. int UrgentFlag; //Urgent Flag
  69. // "round_id" is used by PreciseLoss_, a variant for more
  70. //  precise loss events that is on by default.
  71. int round_id ;  //round id.
  72. static int offset_; // offset for this header
  73. inline static int& offset() { 
  74. return offset_; 
  75. }
  76. inline static hdr_tfrc* access(const Packet* p) {
  77. return (hdr_tfrc*) p->access(offset_);
  78. }
  79. };
  80. struct hdr_tfrc_ack {
  81. // RFC 3448 specifies that feedback packets must include the
  82. // timestamp_echo, timestamp_offset, flost, and 
  83. // rate_since_last_report. 
  84. double timestamp_offset; //offset since we received data packet
  85. double timestamp_echo; //timestamp from the last data packet
  86. double flost; //frequency of loss indications
  87. double rate_since_last_report; //what it says ...
  88. // Used in optional variants:
  89. int losses; // number of losses in last RTT
  90. double NumFeedback_; //number of times/RTT feedback is to be sent 
  91. // Used for statistics-reporting only:
  92. double true_loss; // true loss event rate.  
  93. // Not used:
  94. int seqno;   // not sure yet
  95. double timestamp; //time this nack was sent
  96. static int offset_;  // offset for this header
  97. inline static int& offset() { 
  98. return offset_; 
  99. }
  100. inline static hdr_tfrc_ack* access(const Packet* p) {
  101. return (hdr_tfrc_ack*) p->access(offset_);
  102. }
  103. };
  104. class TfrcAgent; 
  105. class TfrcSendTimer : public TimerHandler {
  106. public:
  107. TfrcSendTimer(TfrcAgent *a) : TimerHandler() { a_ = a; }
  108. virtual void expire(Event *e);
  109. protected:
  110. TfrcAgent *a_;
  111. };
  112. class TfrcNoFeedbackTimer : public TimerHandler {
  113. public:
  114. TfrcNoFeedbackTimer(TfrcAgent *a) : TimerHandler() { a_ = a; }
  115. virtual void expire(Event *e);
  116. protected:
  117. TfrcAgent *a_;
  118. }; 
  119. class TfrcAgent : public Agent {
  120. friend class TfrcSendTimer;
  121. friend class TfrcNoFeedbackTimer;
  122. public:
  123. TfrcAgent();
  124. void recv(Packet*, Handler*);
  125. void sendpkt();
  126. void nextpkt();
  127. int command(int argc, const char*const* argv);
  128. void start();
  129. void stop();
  130. void update_rtt(double tao, double now); 
  131. void increase_rate(double p);
  132. void decrease_rate();
  133. double rfc3390(int size);
  134. double initial_rate();
  135. void slowstart();
  136. void reduce_rate_on_no_feedback();
  137. void advanceby(int delta); 
  138. void sendmsg(int nbytes, const char *flags = 0);
  139. protected:
  140. TfrcSendTimer send_timer_;
  141. TfrcNoFeedbackTimer NoFeedbacktimer_;
  142. /* "accurate" estimates for formula */
  143. double rtt_; /*EWMA version*/
  144. double rttcur_; /*Instantaneous version*/
  145. double rttvar_;
  146. double tzero_;
  147. double sqrtrtt_; /*The mean of the sqrt of the RTT*/
  148. int ca_; //Enable Sqrt(RTT) based congestion avoidance mode
  149. /* TCP variables for tracking RTT */
  150. int t_srtt_; 
  151. int t_rtt_;
  152. int t_rttvar_;
  153. int rttvar_exp_;
  154. double t_rtxcur_;
  155. double tcp_tick_;
  156. int T_SRTT_BITS; 
  157. int T_RTTVAR_BITS;
  158. int srtt_init_; 
  159. int rttvar_init_;
  160. double rtxcur_init_;
  161. /* End of TCP variables for tracking RTT */
  162. // Dynamic state:
  163. int maxseq_;            // max seq produced by the app so far
  164. int seqno_;             // next seq to be sent 
  165. int psize_;
  166. double rate_; // send rate
  167. double oldrate_; // allows rate to be changed gradually
  168. double delta_; // allows rate to be changed gradually
  169. int rate_change_;  // slow start, cong avoid, decrease ...
  170. double last_change_; // time last change in rate was made
  171. double rcvrate  ;  // TCP friendly rate based on current RTT 
  172. //  and recever-provded loss estimate
  173. double maxrate_; // prevents sending at more than 2 times the 
  174. //  rate at which the receiver is _receving_ 
  175. double ss_maxrate_; // max rate for during slowstart
  176. TracedInt ndatapack_; // number of packets sent
  177. TracedInt ndatabytes_; // number of bytes sent
  178. TracedDouble true_loss_rate_; // true loss event rate,
  179. int active_; // have we shut down? 
  180. int round_id ; // round id
  181. int first_pkt_rcvd ; // first ack received yet?
  182. double last_pkt_time_; // time the last data packet was sent
  183. int maxqueue_; // max queue from application
  184. int UrgentFlag; // urgent flag
  185. int all_idle_; // has the sender been idle since the
  186. //  nofeedback timer was set?
  187.         double lastlimited_; // time sender was last datalimited.
  188. // End of dynamic state.
  189. // Parameters:
  190. int InitRate_; // initial send rate
  191. double df_; // decay factor for accurate RTT estimate
  192. double ssmult_; // during slow start, increase rate by this 
  193. //  factor every rtt
  194. int bval_; // value of B for the formula
  195. double overhead_; // if > 0, dither outgoing packets 
  196. int ecn_ ; // Set to 1 for an ECN-capable connection.
  197. double minrto_ ; // for experimental purposes, for a minimum
  198. //  RTO value (for use in the TCP-friendly
  199. //  equation).
  200. double rate_init_; // Static value for initial rate, in 
  201. //   packets per RTT.
  202. // for statistics only
  203. int SndrType_;          // 0 -> infinite sender, 1 -> need FTP
  204.   int printStatus_; // to print status reports
  205.         // End of parameters:
  206. /* Variants in the TFRC algorithms.  */
  207. // int standard_; // 1 for RFC 3448 algorithms.
  208.                                 // 2 for RFC 4342 algorithms.
  209.                                 // 3 for RFC 3448bis algorithms.
  210.         int rate_init_option_;  /* 1 for using static rate_init_ */
  211.                                 /* 2 for using RFC 3390 */
  212. int slow_increase_; // To use slow increases in the rate during
  213. //  slow-start.
  214. int datalimited_; // to send immediately when a new packet
  215. //   arrives after a data-limited period
  216. int oldCode_; // set to 1 not to use "datalimited_"
  217. //   parameter.
  218. int heavyrounds_; // the number of RTTs so far when the
  219. //  sending rate > 2 * receiving rate
  220. int maxHeavyRounds_; // the number of allowed rounds for
  221. //  sending rate > 2 * receiving rate
  222.         int useHeaders_;        /* boolean: Add DCCP/IP header sizes */  
  223. int idleFix_; // 1 for fix for receive rate limits
  224. //   when sender has been idle
  225. /* End of variants.  */
  226. /* Responses to heavy congestion. */
  227. int conservative_; // set to 1 for an experimental, conservative 
  228. //   response to heavy congestion
  229. double scmult_;         // self clocking parameter for conservative_
  230. /* End of responses to heavy congestion.  */
  231. /* VoIP mode, for using small packets. */
  232. int voip_; // 1 for voip mode.
  233. int voip_max_pkt_rate_ ; // Max pkt rate in pps, for voip mode.
  234. int fsize_; // Default size for large TCP packets 
  235. //  (e.g., 1460 bytes).
  236.         int headersize_; // Size for packet headers.
  237. /* end of VoIP mode. */
  238. };