首页 > 代码库 > tcp.h
tcp.h
1 /* 2 * Copyright (c) 1991-1997 Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by the Computer Systems 16 * Engineering Group at Lawrence Berkeley Laboratory. 17 * 4. Neither the name of the University nor of the Laboratory may be used 18 * to endorse or promote products derived from this software without 19 * specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS‘‘ AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * @(#) $Header: /cvsroot/nsnam/ns-2/tcp/tcp.h,v 1.132 2011/08/26 19:29:57 tom_henderson Exp $ (LBL) 34 */ 35 #ifndef ns_tcp_h 36 #define ns_tcp_h 37 38 #include "agent.h" 39 #include "packet.h" 40 41 //class EventTrace; 42 43 struct hdr_tcp { 44 #define NSA 3 45 double ts_; /* time packet generated (at source) */ 46 double ts_echo_; /* the echoed timestamp (originally sent by 47 the peer) */ 48 int seqno_; /* sequence number */ 49 int reason_; /* reason for a retransmit */ 50 int sack_area_[NSA+1][2]; /* sack blocks: start, end of block */ 51 int sa_length_; /* Indicate the number of SACKs in this * 52 * packet. Adds 2+sack_length*8 bytes */ 53 int ackno_; /* ACK number for FullTcp */ 54 int hlen_; /* header len (bytes) for FullTcp */ 55 int tcp_flags_; /* TCP flags for FullTcp */ 56 int last_rtt_; /* more recent RTT measurement in ms, */ 57 /* for statistics only */ 58 // Advertised Window, Shigeyuki Osada 2012/01/08 59 double wnd_; 60 61 static int offset_; // offset for this header 62 inline static int& offset() { return offset_; } 63 inline static hdr_tcp* access(Packet* p) { 64 return (hdr_tcp*) p->access(offset_); 65 } 66 67 /* per-field member functions */ 68 double& ts() { return (ts_); } 69 double& ts_echo() { return (ts_echo_); } 70 int& seqno() { return (seqno_); } 71 int& reason() { return (reason_); } 72 int& sa_left(int n) { return (sack_area_[n][0]); } 73 int& sa_right(int n) { return (sack_area_[n][1]); } 74 int& sa_length() { return (sa_length_); } 75 int& hlen() { return (hlen_); } 76 int& ackno() { return (ackno_); } 77 int& flags() { return (tcp_flags_); } 78 int& last_rtt() { return (last_rtt_); } 79 double& wnd() {return (wnd_);} // Shigeyuki Osada 80 }; 81 82 /* these are used to mark packets as to why we xmitted them */ 83 #define TCP_REASON_TIMEOUT 0x01 84 #define TCP_REASON_DUPACK 0x02 85 #define TCP_REASON_RBP 0x03 // used only in tcp-rbp.cc 86 #define TCP_REASON_PARTIALACK 0x04 87 88 /* these are reasons we adjusted our congestion window */ 89 90 #define CWND_ACTION_DUPACK 1 // dup acks/fast retransmit 91 #define CWND_ACTION_TIMEOUT 2 // retransmission timeout 92 #define CWND_ACTION_ECN 3 // ECN bit [src quench if supported] 93 #define CWND_ACTION_EXITED 4 // congestion recovery has ended 94 // (when previously CWND_ACTION_DUPACK) 95 96 /* these are bits for how to change the cwnd and ssthresh values */ 97 98 #define CLOSE_SSTHRESH_HALF 0x00000001 99 #define CLOSE_CWND_HALF 0x00000002100 #define CLOSE_CWND_RESTART 0x00000004101 #define CLOSE_CWND_INIT 0x00000008102 #define CLOSE_CWND_ONE 0x00000010103 #define CLOSE_SSTHRESH_HALVE 0x00000020104 #define CLOSE_CWND_HALVE 0x00000040105 #define THREE_QUARTER_SSTHRESH 0x00000080106 #define CLOSE_CWND_HALF_WAY 0x00000100107 #define CWND_HALF_WITH_MIN 0x00000200108 #define TCP_IDLE 0x00000400109 #define NO_OUTSTANDING_DATA 0x00000800110 111 /*112 * tcp_tick_:113 * default 0.1,114 * 0.3 for 4.3 BSD, 115 * 0.01 for new window algorithms,116 */117 118 #define NUMDUPACKS 3 /* This is no longer used. The variable */119 /* numdupacks_ is used instead. */120 #define TCP_MAXSEQ 1073741824 /* Number that curseq_ is set to for */121 /* "infinite send" (2^30) */122 123 #define TCP_TIMER_RTX 0124 #define TCP_TIMER_DELSND 1125 #define TCP_TIMER_BURSTSND 2126 #define TCP_TIMER_DELACK 3127 #define TCP_TIMER_Q 4128 #define TCP_TIMER_RESET 5 129 130 class TcpAgent;131 132 class RtxTimer : public TimerHandler {133 public: 134 RtxTimer(TcpAgent *a) : TimerHandler() { a_ = a; }135 protected:136 virtual void expire(Event *e);137 TcpAgent *a_;138 };139 140 class DelSndTimer : public TimerHandler {141 public: 142 DelSndTimer(TcpAgent *a) : TimerHandler() { a_ = a; }143 protected:144 virtual void expire(Event *e);145 TcpAgent *a_;146 };147 148 class BurstSndTimer : public TimerHandler {149 public: 150 BurstSndTimer(TcpAgent *a) : TimerHandler() { a_ = a; }151 protected:152 virtual void expire(Event *e);153 TcpAgent *a_;154 };155 156 /*157 * Variables for HighSpeed TCP.158 */159 //int *hs_win_; // array of cwnd values160 //int *hs_increase_; // array of increase values161 //double *hs_decrease_; // array of decrease values162 struct hstcp {163 double low_p; // low_p164 double dec1; // for computing the decrease parameter165 double dec2; // for computing the decrease parameter166 double p1; // for computing p167 double p2; // for computing p168 /* The next three parameters are for CPU overhead, for computing */169 /* the HighSpeed parameters less frequently. A better solution */170 /* might be just to have a look-up array. */171 double cwnd_last_; /* last cwnd for computed parameters */172 double increase_last_; /* increase param for cwnd_last_ */173 hstcp() : low_p(0.0), dec1(0.0), dec2(0.0), p1(0.0), p2(0.0),174 cwnd_last_(0.0), increase_last_(0.0) { }175 };176 177 class TcpAgent : public Agent {178 friend class XcpEndsys;179 public:180 TcpAgent();181 virtual ~TcpAgent() {free(tss);}182 virtual void recv(Packet*, Handler*);183 virtual void timeout(int tno);184 virtual void timeout_nonrtx(int tno);185 int command(int argc, const char*const* argv);186 virtual void sendmsg(int nbytes, const char *flags = 0);187 188 void trace(TracedVar* v);189 virtual void advanceby(int delta);190 191 virtual void reset();192 193 /* These two functions aid Tmix one-way TCP agents */194 int is_closed() {return closed_;} 195 void clr_closed() {closed_ = 0;}196 protected:197 virtual int window();198 virtual double windowd();199 void print_if_needed(double memb_time);200 void traceAll();201 virtual void traceVar(TracedVar* v);202 virtual int headersize(); // a tcp header203 204 virtual void delay_bind_init_all();205 virtual int delay_bind_dispatch(const char *varName, const char *localName, TclObject *tracer);206 207 double boot_time_; /* where between ‘ticks‘ this sytem came up */208 double overhead_;209 double wnd_;210 double wnd_const_;211 double wnd_th_; /* window "threshold" */212 double wnd_init_;213 double wnd_restart_;214 double tcp_tick_; /* clock granularity */215 int wnd_option_;216 int wnd_init_option_; /* 1 for using wnd_init_ */217 /* 2 for using large initial windows */218 double decrease_num_; /* factor for multiplicative decrease */219 double increase_num_; /* factor for additive increase */220 int tcpip_base_hdr_size_; /* size of base TCP/IP header */221 int maxcwnd_; /* max # cwnd can ever be */222 int numdupacks_; /* dup ACKs before fast retransmit */223 int numdupacksFrac_; /* for a larger numdupacks_ with large */224 /* windows */225 226 /* connection and packet dynamics */227 virtual void output(int seqno, int reason = 0);228 virtual void send_much(int force, int reason, int maxburst = 0);229 virtual void newtimer(Packet*);230 virtual void dupack_action(); /* do this on dupacks */231 virtual void send_one(); /* do this on 1-2 dupacks */232 virtual void opencwnd();233 void update_window(Packet*); // Shigeyuki Osada 2012/01/08234 235 void slowdown(int how); /* reduce cwnd/ssthresh */236 void ecn(int seqno); /* react to quench */237 virtual void set_initial_window(); /* set IW */238 double initial_window(); /* what is IW? */239 void newack(Packet*);240 void finish(); /* called when the connection is terminated */241 int network_limited(); /* Sending limited by network? */242 double limited_slow_start(double cwnd, int max_ssthresh, double increment);243 /* Limited slow-start for high windows */244 virtual int numdupacks(double cwnd); /* for getting numdupacks_ */245 /* End of section of connection and packet dynamics. */246 247 /* General dynamic state. */248 TracedInt t_seqno_; /* sequence number */249 TracedInt dupacks_; /* number of duplicate acks */250 TracedInt curseq_; /* highest seqno "produced by app" */251 TracedInt highest_ack_; /* not frozen during Fast Recovery */252 TracedDouble cwnd_; /* current window */253 TracedInt ssthresh_; /* slow start threshold */254 TracedInt maxseq_; /* used for Karn algorithm */255 /* highest seqno sent so far */256 int last_ack_; /* largest consecutive ACK, frozen during257 * Fast Recovery */258 int recover_; /* highest pkt sent before dup acks, */259 /* timeout, or source quench/ecn */260 int last_cwnd_action_; /* CWND_ACTION_{TIMEOUT,DUPACK,ECN} */261 int count_; /* used in window increment algorithms */262 int rtt_active_; /* 1 if a rtt sample is pending */263 int rtt_seq_; /* seq # of timed seg if rtt_active_ is 1 */264 double rtt_ts_; /* time at which rtt_seq_ was sent */265 double firstsent_; /* When first packet was sent --Allman */266 double lastreset_; /* W.N. Last time connection was reset - for */267 /* detecting pkts from previous incarnations */268 int closed_; /* whether this connection has closed */269 /* End of general dynamic state. */270 271 /*272 * State encompassing the round-trip-time estimate.273 * srtt and rttvar are stored as fixed point;274 * srtt has 3 bits to the right of the binary point, rttvar has 2.275 */276 TracedInt t_rtt_; /* round trip time */277 TracedInt t_srtt_; /* smoothed round-trip time */278 TracedInt t_rttvar_; /* variance in round-trip time */279 TracedInt t_backoff_; /* current multiplier of RTO, */280 /* 1 if not backed off */281 #define T_RTT_BITS 0282 int T_SRTT_BITS; /* exponent of weight for updating t_srtt_ */283 int srtt_init_; /* initial value for computing t_srtt_ */284 int T_RTTVAR_BITS; /* exponent of weight for updating t_rttvar_ */ 285 int rttvar_exp_; /* exponent of multiple for t_rtxcur_ */286 int rttvar_init_; /* initial value for computing t_rttvar_ */287 double t_rtxcur_; /* current retransmit value */288 double rtxcur_init_; /* initial value for t_rtxcur_ */289 virtual void rtt_init();290 virtual double rtt_timeout(); /* provide RTO based on RTT estimates */291 virtual void rtt_update(double tao); /* update RTT estimate */292 virtual void rtt_backoff(); /* double multiplier */293 /* End of state for the round-trip-time estimate. */294 295 /* RTOs: */296 double maxrto_; /* max value of an RTO */297 double minrto_; /* min value of an RTO */298 int ts_resetRTO_; /* Un-backoff RTO after any valid RTT, */299 /* including from a retransmitted pkt? */300 /* The old version was "false". */301 /* But "true" gives better performance, and */302 /* seems conformant with RFC 2988. */303 /* End of section for RTOs. */304 305 /* Timestamps. */306 double ts_peer_; /* the most recent timestamp the peer sent */307 double ts_echo_; /* the most recent timestamp the peer echoed */308 int ts_option_size_; // header bytes in a ts option309 double *tss; // To store sent timestamps, with bugfix_ts_310 int tss_size_; // Current capacity of tss311 int ts_option_; /* use RFC1323-like timestamps? */312 /* End of timestamps. */313 314 /* Helper functions. Used by tcp-asym */315 virtual void output_helper(Packet*) { return; }316 virtual void send_helper(int) { return; }317 virtual void send_idle_helper() { return; }318 virtual void recv_helper(Packet*);319 virtual void recv_frto_helper(Packet*);320 virtual void recv_newack_helper(Packet*);321 virtual void partialnewack_helper(Packet*) {};322 /* End of helper functions. */323 324 int force_wnd(int num);325 void spurious_timeout();326 327 /* Timers */328 RtxTimer rtx_timer_;329 DelSndTimer delsnd_timer_;330 BurstSndTimer burstsnd_timer_;331 virtual void cancel_timers() {332 rtx_timer_.force_cancel();333 burstsnd_timer_.force_cancel();334 delsnd_timer_.force_cancel();335 }336 virtual void cancel_rtx_timer() {337 rtx_timer_.force_cancel();338 }339 virtual void set_rtx_timer();340 void reset_rtx_timer(int mild, int backoff = 1);341 int timerfix_; /* set to true to update timer *after* */342 /* update the RTT, instead of before */343 int rfc2988_; /* Use updated RFC 2988 timers */344 /* End of timers. */ 345 346 347 /* For modeling SYN and SYN/ACK packets. */348 int syn_; /* 1 for modeling SYN/ACK exchange */349 int delay_growth_; /* delay opening cwnd until 1st data recv‘d */350 int max_connects_; /* max number of transmits for syn packet */351 /* -1 to allow infinite number of transmits */352 /* End of modeling SYN and SYN/ACK packets. */353 354 /* Dynamic state for SYN packet retransmissions. */355 int syn_connects_; /* number of transmits of syn packet */356 /* End of dynamic state for SYN packet retransmissions. */357 358 /* F-RTO */359 int frto_enabled_; /* != 0 to enable F-RTO */360 int sfrto_enabled_; /* != 0 to enabled SACK-based F-RTO */361 int spurious_response_; /* Response variant to spurious RTO */362 /* End of R-RTO */363 364 /* Parameters for backwards compatility with old code. */ 365 int bug_fix_; /* 1 for multiple-fast-retransmit fix */366 int less_careful_; /* 1 for Less Careful variant of bug_fix_, */367 /* for illustration only */368 int exitFastRetrans_; /* True to clean exits of Fast Retransmit */ 369 /* False for buggy old behavior */370 int bugfix_ack_; // 1 to enable ACK heuristic, to allow371 // multiple-fast-retransmits in special cases.372 // From Andrei Gurtov373 int bugfix_ts_; // 1 to enable timestamp heuristic, to allow374 // multiple-fast-retransmits in special cases.375 // From Andrei Gurtov376 // Not implemented yet.377 int old_ecn_; /* For backwards compatibility with the 378 * old ECN implementation, which never379 * reduced the congestion window below380 * one packet. */ 381 int bugfix_ss_; // 1 to use window of one when SYN382 // packet is dropped383 /* End of parameters for backwards compatility. */384 385 /* Parameters for alternate congestion control mechanisms. */386 double k_parameter_; /* k parameter in binomial controls */387 double l_parameter_; /* l parameter in binomial controls */388 int precision_reduce_; /* non-integer reduction of cwnd */389 int maxburst_; /* max # packets can send back-2-back */390 int aggressive_maxburst_; /* Send on a non-valid ack? */391 /* End of parameters for alternate congestion control mechanisms. */392 393 FILE *plotfile_;394 395 /* Dynamic state used for alternate congestion control mechanisms */396 double awnd_; /* averaged window */397 int first_decrease_; /* First decrease of congestion window. */398 /* Used for decrease_num_ != 0.5. */399 double fcnt_; /* used in window increment algorithms */400 double base_cwnd_; /* base window (for experimental purposes) */401 /* End of state for alternate congestion control mechanisms */402 403 /* Dynamic state only used for monitoring */404 int trace_all_oneline_; /* TCP tracing vars all in one line or not? */405 int nam_tracevar_; /* Output nam‘s variable trace or just plain 406 text variable trace? */407 TracedInt ndatapack_; /* number of data packets sent */408 TracedInt ndatabytes_; /* number of data bytes sent */409 TracedInt nackpack_; /* number of ack packets received */410 TracedInt nrexmit_; /* number of retransmit timeouts 411 when there was data outstanding */412 TracedInt nrexmitpack_; /* number of retransmited packets */413 TracedInt nrexmitbytes_; /* number of retransmited bytes */414 TracedInt necnresponses_; /* number of times cwnd was reduced415 in response to an ecn packet -- sylvia */416 TracedInt ncwndcuts_; /* number of times cwnd was reduced 417 for any reason -- sylvia */418 TracedInt ncwndcuts1_; /* number of times cwnd was reduced 419 due to congestion (as opposed to idle420 periods */421 /* end of dynamic state for monitoring */422 423 /* Specifying variants in TCP algorithms. */424 int slow_start_restart_; /* boolean: re-init cwnd after connection 425 goes idle. On by default. */426 int restart_bugfix_; /* ssthresh is cut down because of427 timeouts during a connection‘s idle period.428 Setting this boolean fixes this problem.429 For now, it is off by default. */ 430 TracedInt singledup_; /* Send on a single dup ack. */431 int LimTransmitFix_; /* To fix a bug in Limited Transmit. */432 int noFastRetrans_; /* No Fast Retransmit option. */433 int oldCode_; /* Use old code. */434 int useHeaders_; /* boolean: Add TCP/IP header sizes */435 /* end of specifying variants */436 437 /* Used for ECN */438 int ecn_; /* Explicit Congestion Notification */439 int cong_action_; /* Congestion Action. True to indicate440 that the sender responded to congestion. */441 int ecn_burst_; /* True when the previous ACK packet442 * carried ECN-Echo. */443 int ecn_backoff_; /* True when retransmit timer should begin444 to be backed off. */445 int ect_; /* turn on ect bit now? */446 int SetCWRonRetransmit_; /* True to allow setting CWR on */447 /* retransmitted packets. Affects */448 /* performance for Reno with ECN. */449 int use_rtt_; /* Use RTT for timeout for ECN-marked SYN-ACK */450 /* end of ECN */451 452 /* used for Explicit Loss Notification */453 void tcp_eln(Packet *pkt); /* reaction to ELN (usually wireless) */454 int eln_; /* Explicit Loss Notification (wireless) */455 int eln_rxmit_thresh_; /* Threshold for ELN-triggered rxmissions */456 int eln_last_rxmit_; /* Last packet rxmitted due to ELN info */457 /* end of Explicit Loss Notification */458 459 /* for High-Speed TCP, RFC 3649 */460 double linear(double x, double x_1, double y_1, double x_2, double y_2);461 /* the "linear" function is for experimental highspeed TCP */462 /* These four parameters define the HighSpeed response function. */463 int low_window_; /* window for turning on high-speed TCP */464 int high_window_; /* target window for new response function */465 double high_p_; /* target drop rate for new response function */466 double high_decrease_; /* decrease rate at target window */467 /* The next parameter is for Limited Slow-Start. */468 int max_ssthresh_; /* max value for ssthresh_ */469 470 /* These two functions are just an easy structuring of the code. */ 471 double increase_param(); /* get increase parameter for current cwnd */472 double decrease_param(); /* get decrease parameter for current cwnd */473 int cwnd_range_; /* for determining when to recompute params. */474 hstcp hstcp_; /* HighSpeed TCP variables */475 /* end of section for experimental high-speed TCP */476 477 /* for Quick-Start, RFC 4782 */478 virtual void processQuickStart(Packet *pkt);479 virtual void endQuickStart();480 int lossQuickStart();481 int rate_request_; /* Rate request in KBps, for QuickStart. */482 int qs_enabled_; /* to enable QuickStart. */483 int qs_requested_;484 int qs_approved_;485 int qs_window_; /* >0: there are outstanding non-acked segments486 from QS window */487 int qs_cwnd_; /* Initial window for Quick-Start */488 int tcp_qs_recovery_; /* != 0 if we apply slow start on packet489 losses during QS window */490 int qs_request_mode_; /* 1 = Try to avoid unnecessary QS requests491 for short flows. Use qs_rtt_ as the RTT492 used in window calculation.493 Other: Always request ‘rate_request_‘ bytes,494 regardless of flow size */495 int qs_thresh_; /* Do not use QS if there are less data to send496 than this. Applies only if497 qs_request_mode_ == 1 */498 int qs_rtt_; /* QS needs some assumption of the RTT in499 in order to be able to determine how much500 it needs for rate request with given amount501 of data to send. milliseconds. */502 int print_request_; /* true to print Quick-Start request */503 int ttl_diff_;504 /* end of section for Quick-Start. */505 506 /* F-RTO: !=0 when F-RTO recovery is underway, N:th round-trip507 * since RTO. Can have values between 0-2 */508 int frto_;509 int pipe_prev_; /* window size when timeout last occurred */510 511 /* support for event-tracing */512 //EventTrace *et_;513 void trace_event(char *eventtype);514 515 /* these function are now obsolete, see other above */516 void closecwnd(int how);517 void quench(int how);518 519 /* TCP quiescence, reducing cwnd after an idle period */520 void process_qoption_after_send() ;521 void process_qoption_after_ack(int seqno) ;522 void reset_qoption(); /* for QOption with EnblRTTCtr_ */523 void rtt_counting(); /* for QOption with EnblRTTCtr_ */524 int QOption_ ; /* TCP quiescence option */525 int EnblRTTCtr_ ; /* are we using a corase grained timer? */526 int T_full ; /* last time the window was full */527 int T_last ;528 int T_prev ;529 int T_start ;530 int RTT_count ;531 int RTT_prev ;532 int RTT_goodcount ;533 int F_counting ;534 int W_used ; 535 int W_timed ;536 int F_full ; 537 int Backoffs ;538 int control_increase_ ; /* If true, don‘t increase cwnd if sender */539 /* is not window-limited. */540 int prev_highest_ack_ ; /* Used to determine if sender is */541 /* window-limited. */542 /* end of TCP quiescence */543 };544 545 /* TCP Reno */546 class RenoTcpAgent : public virtual TcpAgent {547 public:548 RenoTcpAgent();549 virtual int window();550 virtual double windowd();551 virtual void recv(Packet *pkt, Handler*);552 virtual void timeout(int tno);553 virtual void dupack_action();554 protected:555 int allow_fast_retransmit(int last_cwnd_action_);556 unsigned int dupwnd_;557 };558 559 /* TCP New Reno */560 class NewRenoTcpAgent : public virtual RenoTcpAgent {561 public:562 NewRenoTcpAgent();563 virtual void recv(Packet *pkt, Handler*);564 virtual void partialnewack_helper(Packet* pkt);565 virtual void dupack_action();566 protected:567 int newreno_changes_; /* 0 for fixing unnecessary fast retransmits */568 /* 1 for additional code from Allman, */569 /* to implement other algorithms from */570 /* Hoe‘s paper, including sending a new */571 /* packet for every two duplicate ACKs. */572 /* The default is set to 0. */573 int newreno_changes1_; /* Newreno_changes1_ set to 0 gives the */574 /* Slow-but-Steady variant of NewReno from */575 /* RFC 2582, with the retransmit timer reset */576 /* after each partial new ack. */ 577 /* Newreno_changes1_ set to 1 gives the */578 /* Impatient variant of NewReno from */579 /* RFC 2582, with the retransmit timer reset */580 /* only for the first partial new ack. */581 /* The default is set to 0 */582 void partialnewack(Packet *pkt);583 int allow_fast_retransmit(int last_cwnd_action_);584 int acked_, new_ssthresh_; /* used if newreno_changes_ == 1 */585 double ack2_, ack3_, basertt_; /* used if newreno_changes_ == 1 */586 int firstpartial_; /* For the first partial ACK. */ 587 int partial_window_deflation_; /* 0 if set cwnd to ssthresh upon */588 /* partial new ack (default) */589 /* 1 if deflate (cwnd + dupwnd) by */590 /* amount of data acked */591 /* "Partial window deflation" is */592 /* discussed in RFC 2582. */593 int exit_recovery_fix_; /* 0 for setting cwnd to ssthresh upon */594 /* leaving fast recovery (default) */595 /* 1 for setting cwnd to min(ssthresh, */596 /* amnt. of data in network) when leaving */597 };598 599 /* TCP vegas (VegasTcpAgent) */600 class VegasTcpAgent : public virtual TcpAgent {601 public:602 VegasTcpAgent();603 ~VegasTcpAgent();604 virtual void recv(Packet *pkt, Handler *);605 virtual void timeout(int tno);606 protected:607 double vegastime() {608 return(Scheduler::instance().clock() - firstsent_);609 }610 virtual void output(int seqno, int reason = 0);611 virtual void recv_newack_helper(Packet*);612 int vegas_expire(Packet*); 613 void reset();614 void vegas_inflate_cwnd(int win, double current_time);615 616 virtual void delay_bind_init_all();617 virtual int delay_bind_dispatch(const char *varName, const char *localName, TclObject *tracer);618 619 double t_cwnd_changed_; // last time cwnd changed620 double firstrecv_; // time recv the 1st ack621 622 int v_alpha_; // vegas thruput thresholds in pkts623 int v_beta_; 624 625 int v_gamma_; // threshold to change from slow-start to626 // congestion avoidance, in pkts627 628 int v_slowstart_; // # of pkts to send after slow-start, deflt(2)629 int v_worried_; // # of pkts to chk after dup ack (1 or 2)630 631 double v_timeout_; // based on fine-grained timer632 double v_rtt_; 633 double v_sa_; 634 double v_sd_; 635 636 int v_cntRTT_; // # of rtt measured within one rtt637 double v_sumRTT_; // sum of rtt measured within one rtt638 639 double v_begtime_; // tagged pkt sent640 int v_begseq_; // tagged pkt seqno641 642 double* v_sendtime_; // each unacked pkt‘s sendtime is recorded.643 int* v_transmits_; // # of retx for an unacked pkt644 645 int v_maxwnd_; // maxwnd size for v_sendtime_[]646 double v_newcwnd_; // record un-inflated cwnd647 648 double v_baseRTT_; // min of all rtt649 650 double v_incr_; // amount cwnd is increased in the next rtt651 int v_inc_flag_; // if cwnd is allowed to incr for this rtt652 653 double v_actual_; // actual send rate (pkt/s; needed for tcp-rbp)654 655 int ns_vegas_fix_level_; // see comment at end of tcp-vegas.cc for details of fixes656 };657 658 // Local Variables:659 // mode:c++660 // c-basic-offset: 8661 // End:662 663 #endif
tcp.h
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。