📄 tfrc.h
字号:
/* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- *//* * Copyright (c) 1991-1997 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the Computer Systems * Engineering Group at Lawrence Berkeley Laboratory. * 4. Neither the name of the University nor of the Laboratory may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * */#include "agent.h"#include "packet.h"#include "ip.h"#include "timer-handler.h"#include "random.h"#define SMALLFLOAT 0.0000001/* receiver response */ #define DECREASE 1#define NORMAL 2#define INCREASE 3#define MAXSEQ 1073741824 /* Number that curseq_ is set to for */ /* "infinite send" (2^30) *//* modes of rate change */#define SLOW_START 1#define CONG_AVOID 2#define RATE_DECREASE 3#define OUT_OF_SLOW_START 4 struct hdr_tfrc { // RFC 3448 specifies that the data packet include the sequence // number, timestamp, and RTT estimate. int seqno; //data sequence number double timestamp; //time this message was sent double rtt; //RTT estimate of sender // "rate" is used by one of the experimental algorithms, RBPH. double rate; //sender's current rate // In a real implementation, tzero, psize, and fsize // would not be in the packet header. // They are here for convenience. double tzero; //RTO in Umass eqn int psize; //Packet size. int fsize; //The default large packet size for VoIP. // UrgentFlag is used to request that a loss report be sent // immediately. int UrgentFlag; //Urgent Flag // "round_id" is used by PreciseLoss_, a variant for more // precise loss events that is on by default. int round_id ; //round id. static int offset_; // offset for this header inline static int& offset() { return offset_; } inline static hdr_tfrc* access(const Packet* p) { return (hdr_tfrc*) p->access(offset_); }};struct hdr_tfrc_ack { // RFC 3448 specifies that feedback packets must include the // timestamp_echo, timestamp_offset, flost, and // rate_since_last_report. double timestamp_offset; //offset since we received data packet double timestamp_echo; //timestamp from the last data packet double flost; //frequency of loss indications double rate_since_last_report; //what it says ... // Used in optional variants: int losses; // number of losses in last RTT double NumFeedback_; //number of times/RTT feedback is to be sent // Used for statistics-reporting only: double true_loss; // true loss event rate. // Not used: int seqno; // not sure yet double timestamp; //time this nack was sent static int offset_; // offset for this header inline static int& offset() { return offset_; } inline static hdr_tfrc_ack* access(const Packet* p) { return (hdr_tfrc_ack*) p->access(offset_); }};class TfrcAgent; class TfrcSendTimer : public TimerHandler {public: TfrcSendTimer(TfrcAgent *a) : TimerHandler() { a_ = a; } virtual void expire(Event *e);protected: TfrcAgent *a_;}; class TfrcNoFeedbackTimer : public TimerHandler {public: TfrcNoFeedbackTimer(TfrcAgent *a) : TimerHandler() { a_ = a; } virtual void expire(Event *e);protected: TfrcAgent *a_;}; class TfrcAgent : public Agent { friend class TfrcSendTimer; friend class TfrcNoFeedbackTimer;public: TfrcAgent(); void recv(Packet*, Handler*); void sendpkt(); void nextpkt(); int command(int argc, const char*const* argv); void start(); void stop(); void update_rtt(double tao, double now); void increase_rate(double p); void decrease_rate(); double initial_rate(); void slowstart(); void reduce_rate_on_no_feedback(); void advanceby(int delta); void sendmsg(int nbytes, const char *flags = 0);protected: TfrcSendTimer send_timer_; TfrcNoFeedbackTimer NoFeedbacktimer_; int SndrType_; // 0 -> infinite sender, 1 -> need FTP int maxseq_; // max seq produced by the app so far int seqno_; // next seq to be sent int psize_; double rate_; // send rate double oldrate_; // allows rate to be changed gradually double delta_; // allows rate to be changed gradually int rate_change_; // slow start, cong avoid, decrease ... double rcvrate ; // TCP friendly rate based on current RTT // and recever-provded loss estimate double maxrate_; // prevents sending at more than 2 times the // rate at which the receiver is _receving_ double ss_maxrate_; // max rate for during slowstart int printStatus_; // to print status reports int datalimited_; // to send immediately when a new packet // arrives after a data-limited period int oldCode_; // set to 1 not to use "datalimited_" // parameter. double last_pkt_time_; // time the last data packet was sent int maxqueue_; // max queue from application /* "accurate" estimates for formula */ double rtt_; /*EWMA version*/ double rttcur_; /*Instantaneous version*/ double rttvar_; double tzero_; double sqrtrtt_; /*The mean of the sqrt of the RTT*/ int ca_; //Enable Sqrt(RTT) based congestion avoidance mode /* TCP variables for tracking RTT */ int t_srtt_; int t_rtt_; int t_rttvar_; int rttvar_exp_; double t_rtxcur_; double tcp_tick_; int T_SRTT_BITS; int T_RTTVAR_BITS; int srtt_init_; int rttvar_init_; double rtxcur_init_; /* End of TCP variables for tracking RTT */ int InitRate_; // initial send rate double df_; // decay factor for accurate RTT estimate double last_change_; // time last change in rate was made double ssmult_; // during slow start, increase rate by this // factor every rtt int bval_; // value of B for the formula double overhead_; // if > 0, dither outgoing packets TracedInt ndatapack_; // number of packets sent TracedInt ndatabytes_; // number of bytes sent TracedDouble true_loss_rate_; // true loss event rate, int UrgentFlag; // urgent flag int active_; // have we shut down? int round_id ; // round id int first_pkt_rcvd ; // first ack received yet? int ecn_ ; // Set to 1 for an ECN-capable connection. double minrto_ ; // for experimental purposes, for a minimum // RTO value (for use in the TCP-friendly // equation). double rate_init_; // Static value for initial rate, in // packets per RTT. // for statistics only /* Variants in the TFRC algorithms. */ int rate_init_option_; /* 1 for using static rate_init_ */ /* 2 for using RFC 3390 */ int slow_increase_; // To use slow increases in the rate during // slow-start. int ss_changes_; // To use changes in the slow-start code // to enable higher initial sending rates. /* End of variants. */ /* Responses to heavy congestion. */ int conservative_; // set to 1 for an experimental, conservative // response to heavy congestion double scmult_; // self clocking parameter for conservative_ /* End of responses to heavy congestion. */ int heavyrounds_; // the number of RTTs so far when the // sending rate > 2 * receiving rate int maxHeavyRounds_; // the number of allowed rounds for // sending rate > 2 * receiving rate /* VoIP mode, for using small packets. */ int voip_; // 1 for voip mode. int voip_max_pkt_rate_ ; // Max pkt rate in pps, for voip mode. int fsize_; // Default size for large TCP packets // (e.g., 1460 bytes). /* end of VoIP mode. */ int useHeaders_; /* boolean: Add DCCP/IP header sizes */ int headersize_; // Size for packet headers.};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -