⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcp.h

📁 diff serve for ns-2, work for version 2.29
💻 H
📖 第 1 页 / 共 2 页
字号:
/* -*-	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. * * @(#) $Header: /nfs/jade/vint/CVSROOT/ns-2/tcp/tcp.h,v 1.121 2005/06/20 16:30:30 sfloyd Exp $ (LBL) */#ifndef ns_tcp_h#define ns_tcp_h#include "agent.h"#include "packet.h"//class EventTrace;struct hdr_tcp {#define NSA 3	double ts_;             /* time packet generated (at source) */	double ts_echo_;        /* the echoed timestamp (originally sent by	                           the peer) */	int seqno_;             /* sequence number */	int reason_;            /* reason for a retransmit */	int sack_area_[NSA+1][2];	/* sack blocks: start, end of block */	int sa_length_;         /* Indicate the number of SACKs in this  *	                         * packet.  Adds 2+sack_length*8 bytes   */ 	int ackno_;             /* ACK number for FullTcp */	int hlen_;              /* header len (bytes) for FullTcp */	int tcp_flags_;         /* TCP flags for FullTcp */        int cwnd_;              /* current window - sent for statistic purpose SA*/        double t_rtt_;          /* current RTT - sent for statistic purpose SA*/	int last_rtt_;		/* more recent RTT measurement in ms, */				/*   for statistics only */	static int offset_;	// offset for this header	inline static int& offset() { return offset_; }	inline static hdr_tcp* access(Packet* p) {		return (hdr_tcp*) p->access(offset_);	}	/* per-field member functions */	double& ts() { return (ts_); }	double& ts_echo() { return (ts_echo_); }	int& seqno() { return (seqno_); }	int& reason() { return (reason_); }	int& sa_left(int n) { return (sack_area_[n][0]); }	int& sa_right(int n) { return (sack_area_[n][1]); }	int& sa_length() { return (sa_length_); }	int& hlen() { return (hlen_); }	int& ackno() { return (ackno_); }  	int& flags() { return (tcp_flags_); }	int& last_rtt() { return (last_rtt_); }        int& cwnd() { return (cwnd_); }        double& t_rtt() { return (t_rtt_); }};/* these are used to mark packets as to why we xmitted them */#define TCP_REASON_TIMEOUT	0x01#define	TCP_REASON_DUPACK	0x02#define	TCP_REASON_RBP		0x03   // used only in tcp-rbp.cc#define TCP_REASON_PARTIALACK   0x04/* these are reasons we adjusted our congestion window */#define	CWND_ACTION_DUPACK	1	// dup acks/fast retransmit#define	CWND_ACTION_TIMEOUT	2	// retransmission timeout#define	CWND_ACTION_ECN		3	// ECN bit [src quench if supported]#define CWND_ACTION_EXITED      4       // congestion recovery has ended					// (when previously CWND_ACTION_DUPACK)/* these are bits for how to change the cwnd and ssthresh values */#define	CLOSE_SSTHRESH_HALF	0x00000001#define	CLOSE_CWND_HALF		0x00000002#define	CLOSE_CWND_RESTART	0x00000004#define	CLOSE_CWND_INIT		0x00000008#define	CLOSE_CWND_ONE		0x00000010#define CLOSE_SSTHRESH_HALVE	0x00000020#define CLOSE_CWND_HALVE	0x00000040#define THREE_QUARTER_SSTHRESH  0x00000080#define CLOSE_CWND_HALF_WAY 	0x00000100#define CWND_HALF_WITH_MIN	0x00000200#define TCP_IDLE		0x00000400#define NO_OUTSTANDING_DATA     0x00000800/* * tcp_tick_: * default 0.1, * 0.3 for 4.3 BSD,  * 0.01 for new window algorithms, */#define NUMDUPACKS 3		/* This is no longer used.  The variable */				/* numdupacks_ is used instead. */#define TCP_MAXSEQ 1073741824   /* Number that curseq_ is set to for */				/* "infinite send" (2^30)            */#define TCP_TIMER_RTX		0#define TCP_TIMER_DELSND	1#define TCP_TIMER_BURSTSND	2#define TCP_TIMER_DELACK	3#define TCP_TIMER_Q         4#define TCP_TIMER_RESET        5 class TcpAgent;class RtxTimer : public TimerHandler {public: 	RtxTimer(TcpAgent *a) : TimerHandler() { a_ = a; }protected:	virtual void expire(Event *e);	TcpAgent *a_;};class DelSndTimer : public TimerHandler {public: 	DelSndTimer(TcpAgent *a) : TimerHandler() { a_ = a; }protected:	virtual void expire(Event *e);	TcpAgent *a_;};class BurstSndTimer : public TimerHandler {public: 	BurstSndTimer(TcpAgent *a) : TimerHandler() { a_ = a; }protected:	virtual void expire(Event *e);	TcpAgent *a_;};/* * Variables for HighSpeed TCP. *///int *hs_win_;		// array of cwnd values//int *hs_increase_;	// array of increase values//double *hs_decrease_;	// array of decrease valuesstruct hstcp {	double low_p;  // low_p	double dec1;	// for computing the decrease parameter	double dec2;    // for computing the decrease parameter	double p1;	// for computing p        double p2;	// for computing p	/* The next three parameters are for CPU overhead, for computing */	/*   the HighSpeed parameters less frequently.  A better solution */ 	/*   might be just to have a look-up array.  */	double cwnd_last_;	/* last cwnd for computed parameters */        double increase_last_;	/* increase param for cwnd_last_ */	hstcp() : low_p(0.0), dec1(0.0), dec2(0.0), p1(0.0), p2(0.0),	    cwnd_last_(0.0), increase_last_(0.0) { }};class TcpAgent : public Agent {public:	TcpAgent();	~TcpAgent() {free(tss);}        virtual void recv(Packet*, Handler*);	virtual void timeout(int tno);	virtual void timeout_nonrtx(int tno);	int command(int argc, const char*const* argv);	virtual void sendmsg(int nbytes, const char *flags = 0);	void trace(TracedVar* v);	virtual void advanceby(int delta);protected:	virtual int window();	virtual double windowd();	void print_if_needed(double memb_time);	void traceAll();	virtual void traceVar(TracedVar* v);	virtual int headersize();   // a tcp header	virtual void delay_bind_init_all();	virtual int delay_bind_dispatch(const char *varName, const char *localName, TclObject *tracer);	TracedInt t_seqno_;	/* sequence number */	/*	 * State encompassing the round-trip-time estimate.	 * srtt and rttvar are stored as fixed point;	 * srtt has 3 bits to the right of the binary point, rttvar has 2.	 */	TracedInt t_rtt_;      	/* round trip time */	TracedInt t_srtt_;     	/* smoothed round-trip time */	TracedInt t_rttvar_;   	/* variance in round-trip time */	TracedInt t_backoff_;	/* current multiplier, 1 if not backed off */	#define T_RTT_BITS 0	int T_SRTT_BITS;        /* exponent of weight for updating t_srtt_ */	int srtt_init_;		/* initial value for computing t_srtt_ */	int T_RTTVAR_BITS;      /* exponent of weight for updating t_rttvar_ */ 	int rttvar_exp_;        /* exponent of multiple for t_rtxcur_ */	int rttvar_init_;       /* initial value for computing t_rttvar_ */	double t_rtxcur_;	/* current retransmit value */	double rtxcur_init_;    /* initial value for t_rtxcur_ */	virtual void rtt_init();	virtual double rtt_timeout();	/* provide RTO based on RTT estimates */	virtual void rtt_update(double tao);	/* update RTT estimate */	virtual void rtt_backoff();		/* double multiplier */	/* End of state for the round-trip-time estimate. */	/* Timestamps. */	double ts_peer_;        /* the most recent timestamp the peer sent */	double ts_echo_;        /* the most recent timestamp the peer echoed */	int ts_option_size_;    // header bytes in a ts option        double *tss;            // To store sent timestamps, with bugfix_ts_        int tss_size_;          // Current capacity of tss	int ts_option_;		/* use RFC1323-like timestamps? */	/* End of timestamps. */	/* connection and packet dynamics */	virtual void output(int seqno, int reason = 0);	virtual void send_much(int force, int reason, int maxburst = 0);	virtual void newtimer(Packet*);	virtual void dupack_action();		/* do this on dupacks */	virtual void send_one();		/* do this on 1-2 dupacks */	double linear(double x, double x_1, double y_1, double x_2, double y_2);	/* the "linear" function is for experimental highspeed TCP */	void opencwnd();	void slowdown(int how);			/* reduce cwnd/ssthresh */	void ecn(int seqno);		/* react to quench */	virtual void set_initial_window();	/* set IW */	double initial_window();		/* what is IW? */	void reset();	void newack(Packet*);	void tcp_eln(Packet *pkt); /* reaction to ELN (usually wireless) */	void finish(); /* called when the connection is terminated */	void reset_qoption();	/* for QOption with EnblRTTCtr_ */	void rtt_counting();	/* for QOption with EnblRTTCtr_ */	int network_limited();	/* Sending limited by network? */	double limited_slow_start(double cwnd, double max_ssthresh, double increment);				/* Limited slow-start for high windows */	virtual int numdupacks(double cwnd); 	/* for getting numdupacks_ */	virtual void processQuickStart(Packet *pkt);	virtual void endQuickStart();	int lossQuickStart();	/* Helper functions. Currently used by tcp-asym */	virtual void output_helper(Packet*) { return; }	virtual void send_helper(int) { return; }	virtual void send_idle_helper() { return; }	virtual void recv_helper(Packet*) { return; }	virtual void recv_frto_helper(Packet*);	virtual void recv_newack_helper(Packet*);	virtual void partialnewack_helper(Packet*) {};	/* End of helper functions. */	int force_wnd(int num);	void spurious_timeout();	/* Timers */	RtxTimer rtx_timer_;	DelSndTimer delsnd_timer_;	BurstSndTimer burstsnd_timer_;	virtual void cancel_timers() {		rtx_timer_.force_cancel();		burstsnd_timer_.force_cancel();		delsnd_timer_.force_cancel();	}	virtual void cancel_rtx_timer() {		rtx_timer_.force_cancel();	}	virtual void set_rtx_timer();	void reset_rtx_timer(int mild, int backoff = 1);	int timerfix_;		/* set to true to update timer *after* */				/* update the RTT, instead of before   */	int rfc2988_;		/* Use updated RFC 2988 timers */	/* End of timers. */ 	double boot_time_;	/* where between 'ticks' this sytem came up */	double overhead_;	double wnd_;	double wnd_const_;	double wnd_th_;		/* window "threshold" */	double wnd_init_;	double wnd_restart_;	double tcp_tick_;	/* clock granularity */	int wnd_option_;	int wnd_init_option_;   /* 1 for using wnd_init_ */				/* 2 for using large initial windows */	double decrease_num_;   /* factor for multiplicative decrease */	double increase_num_;   /* factor for additive increase */	int tcpip_base_hdr_size_;  /* size of base TCP/IP header */	int ts_resetRTO_;	/* Un-backoff RTO after any valid RTT, */				/*   including from a retransmitted pkt?  */				/* The old version was "false". */				/* But "true" gives better performance, and */                                /* seems conformant with RFC 2988. */	int maxcwnd_;		/* max # cwnd can ever be */        int numdupacks_;	/* dup ACKs before fast retransmit */	int numdupacksFrac_;	/* for a larger numdupacks_ with large */				/* windows */	double maxrto_;		/* max value of an RTO */	double minrto_;         /* min value of an RTO */	/* For modeling SYN and SYN/ACK packets. */	int syn_;		/* 1 for modeling SYN/ACK exchange */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -