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

通讯编程

开发平台:

Visual C++

  1. /* -*- Mode:C++; c-basic-offset:8; tab-width:8; indent-tabs-mode:t -*- */
  2. /*
  3.  * Copyright (c) 1996-1997 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 Daedalus 
  17.  *      Research Group at the University of California, Berkeley.
  18.  * 4. Neither the name of the University nor of the Research Group 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.  * ack-recons.cc: contributed by the Daedalus Research Group, 
  35.  * UC Berkeley (http://daedalus.cs.berkeley.edu).
  36.  *
  37.  * $Header: /cvsroot/nsnam/ns-2/tcp/ack-recons.h,v 1.4 2000/09/01 03:04:05 haoboy Exp $
  38.  */
  39. /*
  40.  * TCP Ack reconstructor.  This object sits on the other end of a constrained 
  41.  * link and intersperses TCP acks to the source (without violating the e2e 
  42.  * semantics of TCP acks).  This allows us to get good performance for TCP 
  43.  * over various asymmetric networks, in conjunction with techniques to reduce 
  44.  * the frequency of acks (such as ack filtering) with making any changes to 
  45.  * the TCP source (e.g., like those implemented in tcp-asym.cc).  
  46.  */
  47. #ifndef ns_ack_recons_h
  48. #define ns_ack_recons_h
  49. #include "semantic-packetqueue.h"
  50. class AckReconsController : public TclObject {
  51. public:
  52. AckReconsController() : spq_(0) {}
  53. void recv(Packet *p, Handler *h=0);
  54. SemanticPacketQueue *spq_;
  55. };
  56. class AckRecons : public Agent {
  57. public:
  58. AckRecons(nsaddr_t src, nsaddr_t dst) :
  59. Agent(PT_TCP), spq_(0), src_(src), dst_(dst),
  60. ackTemplate_(0), ackPending_(0), lastAck_(0), 
  61. lastRealAck_(0) {
  62. bind("lastTime_", &lastTime_);
  63. bind("lastAck_", &lastAck_);
  64. bind("lastRealTime_", &lastRealTime_);
  65. bind("lastRealAck_", &lastRealAck_);
  66. bind("ackInterArr_", &ackInterArr_);
  67. bind("ackSpacing_", &ackSpacing_);
  68. bind("deltaAckThresh_", &deltaAckThresh_);
  69. bind("delack_", &delack_);
  70. bind("adaptive_", &adaptive_);
  71. bind("alpha_", &alpha_);
  72. bind("size_", &size_);
  73. }
  74. int command(int argc, const char*const* argv);
  75. void handle(Event *e);
  76. void recv(Packet *p);
  77. SemanticPacketQueue *spq_; /* the corresponding queue of packets */
  78. private:
  79. void sendack(int ack, double t); /* send ack pkt at time t */
  80. nsaddr_t src_; /* src addr:port */
  81. nsaddr_t dst_; /* dst addr:port */
  82. Packet *ackTemplate_; /* used as a template for generated acks */
  83. int ackPending_;
  84. int lastAck_; /* last ack sent by recons, maybe generated */
  85. int lastRealAck_; /* last ack actually received on link */
  86. double lastTime_; /* time when last ack was sent */
  87. double lastRealTime_; /* time when last ack arrived on link */
  88. int dupacks_; /* number of dup acks seen so far */
  89. int size_; /* TCP packet size -- needed because TCP
  90.  * acks are in terms of packets */
  91. /* knobs/policies */
  92. int deltaAckThresh_; /* threshold for reconstruction to kick in */
  93. double ackInterArr_; /* estimate of arrival rate of acks */
  94. double ackSpacing_; /* time duration between acks sent by recons */
  95. int delack_; /* generate ack at least every delack_ acks */
  96. int adaptive_; /* whether to adapt ack bandwidth? */
  97. double alpha_; /* used in linear filter for ack rate est. */
  98. };
  99. #endif