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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1997, 2001 The 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 Network Research
  17.  *  Group at Lawrence Berkeley National 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.  * @(#) $Header: /cvsroot/nsnam/ns-2/tcp/tcp-full.h,v 1.58 2007/09/16 20:31:35 sallyfloyd Exp $ (LBL)
  35.  */
  36. #ifndef ns_tcp_full_h
  37. #define ns_tcp_full_h
  38. #include "tcp.h"
  39. #include "rq.h"
  40. /*
  41.  * most of these defines are directly from
  42.  * tcp_var.h or tcp_fsm.h in "real" TCP
  43.  */
  44. /*
  45.  * these are used in 'tcp_flags_' member variable
  46.  */
  47. #define TF_ACKNOW       0x0001          /* ack peer immediately */
  48. #define TF_DELACK       0x0002          /* ack, but try to delay it */
  49. #define TF_NODELAY      0x0004          /* don't delay packets to coalesce */
  50. #define TF_NOOPT        0x0008          /* don't use tcp options */
  51. #define TF_SENTFIN      0x0010          /* have sent FIN */
  52. #define TF_RCVD_TSTMP 0x0100 /* timestamp rcv'd in SYN */
  53. #define TF_NEEDFIN 0x0800 /* send FIN (implicit state) */
  54. /* these are simulator-specific */
  55. #define TF_NEEDCLOSE 0x10000 /* perform close on empty */
  56. /*
  57.  * these are used in state_ member variable
  58.  */
  59. #define TCPS_CLOSED             0       /* closed */
  60. #define TCPS_LISTEN             1       /* listening for connection */
  61. #define TCPS_SYN_SENT           2       /* active, have sent syn */
  62. #define TCPS_SYN_RECEIVED       3       /* have sent and received syn */
  63. #define TCPS_ESTABLISHED        4       /* established */
  64. #define TCPS_CLOSE_WAIT 5 /* rcvd fin, waiting for app close */
  65. #define TCPS_FIN_WAIT_1         6       /* have closed, sent fin */
  66. #define TCPS_CLOSING            7       /* closed xchd FIN; await FIN ACK */
  67. #define TCPS_LAST_ACK           8       /* had fin and close; await FIN ACK */
  68. #define TCPS_FIN_WAIT_2         9       /* have closed, fin is acked */
  69. #define TCP_NSTATES 10 /* total number of states */
  70. #define TCPS_HAVERCVDFIN(s) ((s) == TCPS_CLOSING || (s) == TCPS_CLOSED || (s) == TCPS_CLOSE_WAIT)
  71. #define TCPS_HAVERCVDSYN(s) ((s) >= TCPS_SYN_RECEIVED)
  72. #define TCPIP_BASE_PKTSIZE      40      /* base TCP/IP header in real life */
  73. /* these are used to mark packets as to why we xmitted them */
  74. #define REASON_NORMAL   0  
  75. #define REASON_TIMEOUT  1
  76. #define REASON_DUPACK   2
  77. #define REASON_RBP 3 /* if ever implemented */
  78. #define REASON_SACK 4 /* hole fills in SACK */
  79. /* bits for the tcp_flags field below */
  80. /* from tcp.h in the "real" implementation */
  81. /* RST and URG are not used in the simulator */
  82.  
  83. #define TH_FIN  0x01        /* FIN: closing a connection */
  84. #define TH_SYN  0x02        /* SYN: starting a connection */
  85. #define TH_PUSH 0x08        /* PUSH: used here to "deliver" data */
  86. #define TH_ACK  0x10        /* ACK: ack number is valid */
  87. #define TH_ECE  0x40        /* ECE: CE echo flag */
  88. #define TH_CWR  0x80        /* CWR: congestion window reduced */
  89. #define PF_TIMEOUT 0x04     /* protocol defined */
  90. #define TCP_PAWS_IDLE (24 * 24 * 60 * 60) /* 24 days in secs */
  91. class FullTcpAgent;
  92. class DelAckTimer : public TimerHandler {
  93. public:
  94. DelAckTimer(FullTcpAgent *a) : TimerHandler(), a_(a) { }
  95. protected:
  96. virtual void expire(Event *);
  97. FullTcpAgent *a_;
  98. };
  99. class FullTcpAgent : public TcpAgent {
  100. public:
  101. FullTcpAgent() :
  102. closed_(0), pipe_(-1), rtxbytes_(0), fastrecov_(FALSE),
  103.          last_send_time_(-1.0), infinite_send_(FALSE), irs_(-1),
  104.          delack_timer_(this), flags_(0),
  105.          state_(TCPS_CLOSED), recent_ce_(FALSE),
  106.          last_state_(TCPS_CLOSED), rq_(rcv_nxt_), last_ack_sent_(-1) { }
  107. ~FullTcpAgent() { cancel_timers(); rq_.clear(); }
  108. virtual void recv(Packet *pkt, Handler*);
  109. virtual void timeout(int tno);  // tcp_timers() in real code
  110. virtual void close() { usrclosed(); }
  111. void advanceby(int); // over-rides tcp base version
  112. void advance_bytes(int); // unique to full-tcp
  113.         virtual void sendmsg(int nbytes, const char *flags = 0);
  114.         virtual int& size() { return maxseg_; } //FullTcp uses maxseg_ for size_
  115. virtual int command(int argc, const char*const* argv);
  116.         virtual void reset();        // reset to a known point
  117. protected:
  118. virtual void delay_bind_init_all();
  119. virtual int delay_bind_dispatch(const char *varName, const char *localName, TclObject *tracer);
  120. int closed_;
  121. int ts_option_size_; // header bytes in a ts option
  122. int pipe_; // estimate of pipe occupancy (for Sack)
  123. int pipectrl_; // use pipe-style control
  124. int rtxbytes_; // retransmitted bytes last recovery
  125. int open_cwnd_on_pack_; // open cwnd on a partial ack?
  126. int segs_per_ack_;  // for window updates
  127. int spa_thresh_;    // rcv_nxt < spa_thresh? -> 1 seg per ack
  128. int nodelay_;       // disable sender-side Nagle?
  129. int fastrecov_;     // are we in fast recovery?
  130. int deflate_on_pack_; // deflate on partial acks (reno:yes)
  131. int data_on_syn_;   // send data on initial SYN?
  132. double last_send_time_; // time of last send
  133. int close_on_empty_; // close conn when buffer empty
  134. int signal_on_empty_; // signal when buffer is empty
  135. int reno_fastrecov_; // do reno-style fast recovery?
  136. int infinite_send_; // Always something to send
  137. int tcprexmtthresh_;    // fast retransmit threshold
  138. int iss_;       // initial send seq number
  139. int irs_; // initial recv'd # (peer's iss)
  140. int dupseg_fix_;    // fix bug with dup segs and dup acks?
  141. int dupack_reset_;  // zero dupacks on dataful dup acks?
  142. int halfclose_;     // allow simplex closes?
  143. int nopredict_;     // disable header predication
  144. int ecn_syn_;       // Make SYN/ACK packets ECN-Capable?
  145. int ecn_syn_wait_;  // Wait if SYN/ACK packet is ECN-marked?
  146. int dsack_;     // do DSACK as well as SACK?
  147. double delack_interval_;
  148.         int debug_;                     // Turn on/off debug output
  149. int headersize();   // a tcp header w/opts
  150. int outflags();     // state-specific tcp header flags
  151. int rcvseqinit(int, int); // how to set rcv_nxt_
  152. int predict_ok(Packet*); // predicate for recv-side header prediction
  153. int idle_restart(); // should I restart after idle?
  154. int fast_retransmit(int);  // do a fast-retransmit on specified seg
  155. inline double now() { return Scheduler::instance().clock(); }
  156. virtual void newstate(int ns);
  157. void bufferempty();    // called when sender buffer is empty
  158. void finish();
  159. void reset_rtx_timer(int);   // adjust the rtx timer
  160. virtual void timeout_action(); // what to do on rtx timeout
  161. virtual void dupack_action(); // what to do on dup acks
  162. virtual void pack_action(Packet*); // action on partial acks
  163. virtual void ack_action(Packet*); // action on acks
  164. virtual void send_much(int force, int reason, int maxburst = 0);
  165. virtual int build_options(hdr_tcp*); // insert opts, return len
  166. virtual int reass(Packet*); // reassemble: pass to ReassemblyQueue
  167. virtual void process_sack(hdr_tcp*); // process a SACK
  168. virtual int send_allowed(int); // ok to send this seq#?
  169. virtual int nxt_tseq() {
  170. return t_seqno_; // next seq# to send
  171. }
  172. virtual void sent(int seq, int amt) {
  173. if (seq == t_seqno_)
  174. t_seqno_ += amt;
  175. pipe_ += amt;
  176. if (seq < int(maxseq_))
  177. rtxbytes_ += amt;
  178. }
  179. virtual void oldack() { // what to do on old ack
  180. dupacks_ = 0;
  181. }
  182. virtual void extra_ack() { // dup ACKs after threshold
  183. if (reno_fastrecov_)
  184. cwnd_++;
  185. }
  186. virtual void sendpacket(int seq, int ack, int flags, int dlen, int why, Packet *p=0);
  187. void connect();      // do active open
  188. void listen();       // do passive open
  189. void usrclosed();    // user requested a close
  190. int need_send();     // send ACK/win-update now?
  191. int foutput(int seqno, int reason = 0); // output 1 packet
  192. void newack(Packet* pkt); // process an ACK
  193. int pack(Packet* pkt); // is this a partial ack?
  194. void dooptions(Packet*); // process option(s)
  195. DelAckTimer delack_timer_; // other timers in tcp.h
  196. void cancel_timers(); // cancel all timers
  197. void prpkt(Packet*); // print packet (debugging helper)
  198. char *flagstr(int); // print header flags as symbols
  199. char *statestr(int); // print states as symbols
  200. /*
  201. * the following are part of a tcpcb in "real" RFC793 TCP
  202. */
  203. int maxseg_;        /* MSS */
  204. int flags_;     /* controls next output() call */
  205. int state_;     /* enumerated type: FSM state */
  206. int recent_ce_; /* last ce bit we saw */
  207. int last_state_; /* FSM state at last pkt recv */
  208. int rcv_nxt_;       /* next sequence number expected */
  209. ReassemblyQueue rq_;    /* TCP reassembly queue */
  210. /*
  211. * the following are part of a tcpcb in "real" RFC1323 TCP
  212. */
  213. int last_ack_sent_; /* ackno field from last segment we sent */
  214. double recent_; // ts on SYN written by peer
  215. double recent_age_; // my time when recent_ was set
  216. /*
  217.  * setting iw, specific to tcp-full, called
  218.  * by TcpAgent::reset()
  219.  */
  220. void set_initial_window();
  221. };
  222. class NewRenoFullTcpAgent : public FullTcpAgent {
  223. public:
  224. NewRenoFullTcpAgent();
  225. protected:
  226. int save_maxburst_; // saved value of maxburst_
  227. int recov_maxburst_; // maxburst lim during recovery
  228. void pack_action(Packet*);
  229. void ack_action(Packet*);
  230. };
  231. class TahoeFullTcpAgent : public FullTcpAgent {
  232. protected:
  233. void dupack_action();
  234. };
  235. class SackFullTcpAgent : public FullTcpAgent {
  236. public:
  237. SackFullTcpAgent() :
  238. sq_(sack_min_), sack_min_(-1), h_seqno_(-1) { }
  239. ~SackFullTcpAgent() { rq_.clear(); }
  240. protected:
  241. virtual void delay_bind_init_all();
  242. virtual int delay_bind_dispatch(const char *varName, const char *localName, TclObject *tracer);
  243. virtual void pack_action(Packet*);
  244. virtual void ack_action(Packet*);
  245. virtual void dupack_action();
  246. virtual void process_sack(hdr_tcp*);
  247. virtual void timeout_action();
  248. virtual int nxt_tseq();
  249. virtual int hdrsize(int nblks);
  250. virtual int send_allowed(int);
  251. virtual void sent(int seq, int amt) {
  252. if (seq == h_seqno_)
  253. h_seqno_ += amt;
  254. FullTcpAgent::sent(seq, amt);
  255. }
  256. int build_options(hdr_tcp*); // insert opts, return len
  257. int clear_on_timeout_; // clear sender's SACK queue on RTX timeout?
  258. int sack_option_size_; // base # bytes for sack opt (no blks)
  259. int sack_block_size_; // # bytes in a sack block (def: 8)
  260. int max_sack_blocks_; // max # sack blocks to send
  261. int sack_rtx_bthresh_; // hole-fill byte threshold
  262. int sack_rtx_cthresh_; // hole-fill counter threshold
  263. int sack_rtx_threshmode_; // hole-fill mode setting
  264. void reset();
  265. //XXX not implemented?
  266. //void sendpacket(int seqno, int ackno, int pflags, int datalen, int reason, Packet *p=0);
  267. ReassemblyQueue sq_; // SACK queue, used by sender
  268. int sack_min_; // first seq# in sack queue, initializes sq_
  269. int h_seqno_; // next seq# to hole-fill
  270. };
  271. #endif