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

📄 tcp.h

📁 这个是目前国际上比较怪异的一种长距离高带宽环境下的拥塞控制算法
💻 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.107 2003/02/12 04:16:10 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 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_); }};/* 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]/* 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 SOFT_CLOSE_CWND 0x00000400/* * 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_;};class TcpAgent : public Agent {public:	TcpAgent();		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);	/*	 * 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_seqno_; /* sequence number */#define T_RTT_BITS 0	TracedInt t_rtt_;       /* round trip time */	int T_SRTT_BITS;        /* exponent of weight for updating t_srtt_ */	TracedInt t_srtt_;      /* smoothed round-trip time */	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_ */	TracedInt t_rttvar_;    /* variance in round-trip time */	int rttvar_init_;       /* initial value for computing t_rttvar_ */	double t_rtxcur_;   /* current retransmit value */	double rtxcur_init_;    /* initial value for t_rtxcur_ */	TracedInt t_backoff_;   /* current multiplier, 1 if not backed off */	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 */	double ts_peer_;        /* the most recent timestamp the peer sent */	/* 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();	/* 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_newack_helper(Packet*);	virtual void partialnewack_helper(Packet*) {};	/* 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 */	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 */	double k_parameter_;     /* k parameter in binomial controls */	double l_parameter_;     /* l parameter in binomial controls */	int precision_reduce_;  /* non-integer reduction of cwnd */	int syn_;       /* 1 for modeling SYN/ACK exchange */	int delay_growth_;      /* delay opening cwnd until 1st data recv'd */	int tcpip_base_hdr_size_;  /* size of base TCP/IP header */	int ts_option_size_;    // header bytes in a ts option	int bug_fix_;       /* 1 for multiple-fast-retransmit fix */

⌨️ 快捷键说明

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