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

通讯编程

开发平台:

Visual C++

  1. %documentstyle[11pt,fullpage]{article}
  2. %setlength{parindent}{0 in}
  3. %setlength{parskip}{.1in}
  4. %setlength{topmargin}{-0.5in}
  5. %setlength{textheight}{8.5in}
  6. %begin{document}
  7. chapter{XCP: eXplicit Congestion control Protocol}
  8. label{chap:xcp}
  9. XCP is a feedback-based congestion control system that uses direct,
  10. explicit, router feedback to avoid congestion in the network.  It is
  11. designed for both scalability and generality.  It was developed by
  12. Dina Katabi, starting from a suggestion by Mark Handley (refer
  13. to~cite{Katabi02} for detailed descriptions). 
  14. The ns{} code for XCP which was originally developed by Dina Katabi was
  15. modified, extended and integrated into ns-2.28 at USC/ISI. It still
  16. continues to evolve as of today. If you are interested in looking at
  17. Dina's original source code please go to her website at
  18. http://www.ana.lcs.mit.edu/dina/XCP/ 
  19. section{What is XCP?}
  20. label{sec:xcp?}
  21. XCP is a congestion control protocol that can be applied to any
  22. transport protocol. It performs especially well in very high
  23. delay-bandwidth product networks. Typically in large bandwidth-delay
  24. product networks, efficiency of TCP goes down in the event of multiple of
  25. packet losses and becomes unstable irrespective of queueing schemes
  26. used. However in similar environments, XCP, using a control theory
  27. based feedback
  28. model, achieves much more efficiency, stability and fairness by
  29. sending feedback from the network to the sender for setting the data
  30. flow into the network.
  31. XCP's scalability results from the fact that it requires no per-flow
  32. state in the router to calculate the feedback.  Most router-assisted
  33. congestion control systems maintain per-flow information used to
  34. allocate the resources.  XCP keeps very little information in the
  35. router, and this information is chosen to minimize both the amount of
  36. router state and the per-packet operations needed to update that state.
  37. For generality, XCP divides the resource allocation function between
  38. two controllers: a congestion controller that ensures that flows use
  39. all available capacity, and a fairness controller that ensures that
  40. flows are allocated the capacity fairly.  Most congestion control
  41. systems fail to make this division, much less to implement as two
  42. conceptually distinct systems.  This division allows a clear
  43. exposition and implementation of two basic resource allocation
  44. functions in XCP. XCP sources send additional information about their
  45. current round-trip times and router-assigned throughput in each
  46. packet. XCP routers insert feedback into the packets that is
  47. interpreted by the sources. 
  48.   
  49. Although XCP may be implemented for any transport protocol, however as an
  50. initial test it has been implemented in TCP. The next section
  51. gives details of the way XCP is implemented in ns{}.
  52. section{Implementation of XCP in NS}
  53. label{sec:xcp in ns}
  54. In ns{}, the XCP implementation can be found under nsf{xcp} directory. 
  55. The protocol needs to be deployed in the TCP end points (source and
  56. receiver) as well within the intermediate nodes which is mostly the
  57. router and may sometimes be a link-layer switch as well. The end-point
  58. part of XCP code may be found under xcp-end-sys.{cc,h} and the router
  59. portion of the code may be found under xcp.{cc,h} and xcpq.{cc,h}. 
  60. subsection{Endpoints in XCP}
  61. label{sec:endpoints}
  62. The end points consist of TCP source and sink agents using XCP as their
  63. congestion control mechanism. The
  64. intermediate node or router writes feedback in each packet header as
  65. the delta_throughput value, about the data capacity that may be
  66. incremented if feedback is positive and should be decreased if
  67. negative. When this packet reaches the receiver this delta_throughput
  68. value is returned to the sender in a reverse_feedback field of a
  69. congestion header in the returning packet, which is an ACK packet in
  70. case of TCP. 
  71.   
  72. The sender upon receiving this reverse_feedback value adjusts its
  73. sending rate by increasing or decreasing its congestion window size as
  74. the case maybe. 
  75. The packet header that is used by XCP is implemented as a structure
  76. called hdr_xcp in ns{} and is defined as follows:
  77. begin{program}
  78.   double x_; // idealized inter-packet time
  79.   double rtt_;
  80.   enum {
  81.     XCP_DISABLED = 0,
  82.     XCP_ENABLED,
  83.     XCP_ACK,
  84.   }  xcp_enabled_; // to indicate that the flow is XCP enabled
  85.   int     xcpId_; // Sender's ID (debugging only)
  86.   double cwnd_; // The current window (debugging only) 
  87.   double reverse_feedback_; 
  88.   
  89.   // --- Initialized by source and Updated by Router 
  90.   double  delta_throughput_;
  91.   unsigned int controlling_hop_;// router ID (debugging only)
  92. end{program}
  93.   
  94.     The xcp receiver is responsible for copying the delta_throughput
  95.     value into the reverse_feedback field of the ack packets. In some
  96.     cases where delayed ack is used, the receiver calculates the sum of
  97.     the delta_throughput values in arriving packets for copying into the
  98.     reverse_feedback field of the outgoing ack packet.
  99.     The controlling_hop_ field that carries the address of the router
  100.     who has last updated the feedback is used for debugging purposes only.
  101.     In case of a packet loss in the network, TCP's Van Jacobson
  102.     congestion control should most likely override XCP.  However in ns
  103.     this happens 
  104.     a little differently. With receiving of duplicate acks indicating
  105.     packet loss, the cwnd gets halved and fast retransmit and fast
  106.     recovery algorithms come into play. However xcp routers continue to send
  107.     feedback to the source based on which the source tries to open its
  108.     cwnd. So it seems to be a mish-mash of VJCC and XCP
  109.     algorithms. However for most cases this issue doesnot arise as XCP
  110.     router very rarely experiences a pkt drop as the queue is
  111.     continuously regulated and drained by XCP. Understanding the correct
  112.     behaviour of XCP in face of pkt loss is an area of current study and
  113.     shall be implemented in the future. 
  114.     subsection{XCP Router}
  115.     label {sec:xcp_wrapper}
  116.     The XCP router consists of a wrapper class that holds virtual queues
  117.     for XCP, TCP and OTHER traffic flows. OTHER flow maybe anything other
  118.     than XCP and TCP. In the current implementation, the XCP queue is a
  119.     drop-tail queue while those for TCP and OTHER use RED. 
  120.     These underlying queues are bundled in a
  121.     wrapper class XCPWrapQ that provides necessary interface to the XCP
  122.     router. The XCP/TCP/OTHER queues are serviced in a Weighted Round-Robin
  123.     manner. Each queue has a weight that determines the percentage of the
  124.     service it receives. The current queue weights of 0.5 each for the XCP
  125.     and TCP allows equal service between the two. The third queue reserved
  126.     for OTHER flows has not been used as yet and has a weight of 0.0. 
  127.     
  128.     OTCL Class Queue/XCP has a flag named tcp_xcp_on_ which is set to
  129.     a default 
  130.     value of 0. This should be set to 1 for those simulations that use
  131.     both XCP and TCP flows. This flag is used to split the link capacity
  132.     of the router between the XCP and TCP queues in simulations that
  133.     use both flow types. This is supposed to be a temporary fix and
  134.     should go away once the dynamic queue weights come into effect. A
  135.     caveat for the tcp_xcp flag is that it is set as an OTcl class variable
  136.     and not per instance variable. This might cause some 
  137.     problems in topologies that uses mix of intermittent xcp and tcp
  138.     flows for which some router would require to support both TCP and
  139.     XCP and some wouldn't.
  140.     
  141.     Every packet received by the wrapper queue class is first marked or
  142.     assigned a code point depending on the type of the packet. Packets,
  143.     for the current TCP implementation, are marked for XCP, TCP/TCP-ACK
  144.     and OTHER packets. This code point is used to enque packets in the right
  145.     queue. The wrapper class is implemented in xcp.{cc,h}.
  146.     
  147.     
  148.     subsection{XCP queue}
  149.     label{sec:xcp_queue}
  150.     The XCP queue is responsible for sending back feedback in every packet
  151.     header which is used by the sender to control rate of sending data
  152.     packets into the network. XCP uses two control algorithms, the
  153.     congestion controller and the fairness controller that are executed
  154.     once every estimation control interval, Te. 
  155.     In ns{}  the
  156.     estimation_timer is used to maintain this interval which is based on
  157.     the average rtt values of the (xcp) flows seen through the router. However
  158.     there may be better ways of defining this interval. The outstanding
  159.     queue in the router is measured at a separate interval Tq, for which a
  160.     queue_timer is used. Finally an rtt_timer is used to measure certain
  161.     parameters in the router like packet drops, queue size, utilization 
  162.     etc for a given interval Tr, that may either be set by user from tcl
  163.     scripts or it may use the highest rtt value seen for all flows in the
  164.     router. 
  165.     The rtt_timer interval value, Tr maybe set from tcl using the
  166.     following API: 
  167.     
  168.     code{ $queue queue-sample-everyrtt $rtt_value}
  169.     
  170.     where $queue is a handle to the xcp router and $rtt_value is the
  171.     interval for which xcp queue parameters like packet drop , queue size etc
  172.     shall be measured. See example script under
  173.     nsf{tcl/ex/xcp/parking_lot_topo/parking_lot_topo.tcl} for use of
  174.     this API.
  175.     
  176.     On packet arrival the total input traffic seen at the XCP queue is
  177.     incremented by the size of the packet received. The sum of inversed
  178.     throughput and sum of rtt by throughput is incremented as
  179.     well. Values for throughput and rtt are read from the xcp header as
  180.     set by the TCP source. Each value is normalised by the packet size.
  181.     
  182.     On the event of the estimation timer going off, average rtt of all
  183.     flows is estimated using the above two sums as follows
  184.     code { avg_rtt = sum_rtt_by_throughput/ sum_inv_throughput }
  185.     
  186.     The aggregate feedback is calculated based on the available bandwidth
  187.     capacity of the router, arriving traffic bandwidth and the persistent
  188.     queue length in the router. Further detailed explanation of
  189.     calculations used by the XCP router algorithm can be found in XCP
  190.     specification available from XCP's website at
  191.     http://www.isi.edu/isi-xcp/docs/draft-falk-xcp-spec-00.txt 
  192.     
  193.     Each packet carries the current throughput value of the flow and a
  194.     throughput adjustment or the delta_throughput in its header. The XCP
  195.     router based on the feedback values it calculates in the estimation
  196.     control timeout, calculates a per-packet throughput adjustment
  197.     feedback for every packet. Positive feedback is applied equally
  198.     per-flow while negative feedback is made proportional to each flow's
  199.     capacity. Also a downsream router can change the delta_throughput
  200.     value in a packet's header only if the feedback value calculated is
  201.     less than that in the header (written by an less congested upstream
  202.     router). The implementation of XCP queue in ns{} may be found in
  203.     xcpq.{cc,h}. 
  204.     
  205.   
  206.     section{XCP example script}
  207.     label{sec:example}
  208.     
  209.     Let's walk through a simple xcp script that is similar to
  210.     nsf{tcl/ex/xcp/xcp_test.tcl} 
  211.     The example uses a small dumbbell topology having 3 xcp sources
  212.     running over a bottleneck link.
  213.     
  214.     The topology is setup using the node and link creation APIs. The bottleneck
  215.     is a duplex link that has a xcp router in both directions. For
  216.     details on creating nodes, links etc in ns{} see Marc Greis' NS
  217.     tutorial at http://www.isi.edu/nsnam/ns/tutorial.
  218.   
  219.     The bottleneck link having a XCP queue is created as follows:
  220.   begin{program}
  221.     set R0 [$ns node]       ;# create Bottleneck between nodes R0 and R1 
  222.     set R1 [$ns node]
  223.     $ns duplex-link $R0 $R1 <BW>Mb <delay>ms XCP 
  224.   end{program} %$
  225.   The side links connecting source nodes to the bottleneck link have
  226.   XCP queues as well. 
  227.   The API code{queue-limit} allows users to set the buffer size in the queue.
  228.   
  229.   The xcp source and sink is created as follows (very similar to tcp):
  230.   begin{program}
  231.     set xcp [new Agent/TCP/Reno/XCP]
  232.     $ns attach-agent $src_node $xcp
  233.     set xcp_sink [new Agent/TCPSink/XCPSink]
  234.     $ns attach-agent $rcvr_node $xcp_sink
  235.     $ns connect $xcp $xcp_sink
  236.     ...
  237.     ...
  238.   end{program} %$
  239.   
  240.   There is a tcl class GeneralSender used in the example script that
  241.   sets up xcp agents in the source nodes and then connects them to the
  242.   xcp receiver in the destination node. An FTP source is used in all the
  243.   3 sources. 
  244.   Note that once the topology is set up the link bandwidth information
  245.   needs to be propagated to the xcp queue as this is used by the xcp
  246.   router for feedback calculation. So for every xcp queue use the
  247.   following tcl command:
  248.   
  249.   code{ $xcp_queue set-link-capacity <bandwidth_in_bits_per_sec>}
  250.   %$
  251.   Next we need to trace variables in the xcp router and xcp
  252.   sources. The GeneralSender class procedure trace-xcp sets up tracing
  253.   for xcp sources using variable-tracing in ns{}. 
  254.   
  255.   begin{program}
  256.     GeneralSender instproc trace-xcp parameters {
  257.       $self instvar tcp_ id_ tcpTrace_
  258.       global ftracetcp$id_ 
  259.       set ftracetcp$id_ [open  xcp$id_.tr  w]
  260.       set tcpTrace_ [set ftracetcp$id_]
  261.       $tcp_ attach-trace [set ftracetcp$id_]
  262.       if { -1 < [lsearch $parameters cwnd]  } { $tcp_ tracevar cwnd_ }
  263.       if { -1 < [lsearch $parameters seqno] } { $tcp_ tracevar t_seqno_ }
  264.       }
  265.   end{program} %$
  266.     
  267.   For tracing xcp queue it is required to attach a file descriptor to
  268.   the xcp queue.  
  269.   begin{program} 
  270.     $xcpq attach <file-descriptor> 
  271.   end{program} %$
  272.     
  273.   This is an example of how the trace at an xcp source looks like:
  274.   begin{program}
  275.     0.00000  2  0  1  0  cwnd_ 1.000 
  276.     0.00000  2  0  1  0  t_seqno_ 0
  277.     0.079 x x x x throughput 0.1
  278.     0.07900  2  0  1  0  t_seqno_ 1
  279.     0.119064 x x x x reverse_feedback_ 0
  280.     0.119064 x x x x controlling_hop_ 0
  281.     0.119064 x x x x newcwnd 1
  282.     0.11906  2  0  1  0  cwnd_ 2.000 
  283.     0.119064 x x x x throughput 50000
  284.     0.11906  2  0  1  0  t_seqno_ 2
  285.     0.119064 x x x x throughput 50000
  286.     0.11906  2  0  1  0  t_seqno_ 3
  287.   end{program} %$
  288.   
  289.   The first field gives the timestamp; the next 4 fields give the
  290.   source id (node/port) and destination id (node/port) for the xcp
  291.   flow. The next field gives the name of the variable being traced
  292.   followed by the value of the variable. Note that variables like 
  293.   cwnd_, t_seqno_ are using variable tracing which is a function
  294.   supported by the OTcl lib. While variables like throughput,
  295.   reverse_feedback use the XCPAgent class function trace_var defined
  296.   in xcp-end-sys.cc. For more on variable tracing in ns{} please read
  297.   section 3.4.3 in the ns manual at
  298.   http://www.isi.edu/nsnam/ns/doc/index.html  
  299.     
  300.     
  301.   And example of trace output at a xcp bottleneck router looks like below:
  302.   begin{program}
  303.     Tq_ 0.0472859 0.025
  304.     queue_bytes_ 0.0472859 0
  305.     routerId_ 0.0472859 0
  306.     pos_fbk 0.053544 0
  307.     neg_fbk 0.053544 0
  308.     delta_throughput 0.053544 0
  309.     Thruput2 0.053544 60000
  310.     pos_fbk 0.054024 0
  311.     neg_fbk 0.054024 0
  312.     delta_throughput 0.054024 0
  313.     Thruput2 0.054024 60000
  314.     residue_pos_fbk_not_allocated 0.0638023 0
  315.     residue_neg_fbk_not_allocated 0.0638023 0
  316.     input_traffic_bytes_ 0.0638023 2480
  317.     avg_rtt_ 0.0638023 0.04
  318.   end{program}
  319.   
  320.   Here the first field describes the name of the variable, the
  321.   second field gives the timestamp and the third field gives the
  322.   value of the variable. The XCPQueue class function code{trace_var()}
  323.   is used to trace variables in the xcp queue.
  324.   
  325.   Additionally packet traces may be created in ns{} using the following
  326.   tcl APIs:
  327.   begin{program}
  328.     set f_all [open out.tr w]
  329.     $ns trace-all $f_all
  330.   end{program}
  331.   
  332.   First open a file and then attach the file descriptor to the ns{}
  333.   trace object such that a trace of each packet as it travels through
  334.   the network is logged and dumped into the output file.
  335.   
  336.   An example of such a file would look like:
  337.   begin{program}
  338.     + 0.003 4 0 xcp 40 ------- 2 4.0 1.2 0 0
  339.     - 0.003 4 0 xcp 40 ------- 2 4.0 1.2 0 0
  340.     r 0.013016 4 0 xcp 40 ------- 2 4.0 1.2 0 0
  341.     + 0.013016 0 1 xcp 40 ------- 2 4.0 1.2 0 0
  342.     - 0.013016 0 1 xcp 40 ------- 2 4.0 1.2 0 0
  343.     r 0.023032 0 1 xcp 40 ------- 2 4.0 1.2 0 0
  344.     + 0.023032 1 0 ack 40 ------- 2 1.2 4.0 0 1
  345.     - 0.023032 1 0 ack 40 ------- 2 1.2 4.0 0 1
  346.     r 0.033048 1 0 ack 40 ------- 2 1.2 4.0 0 1
  347.     + 0.033048 0 4 ack 40 ------- 2 1.2 4.0 0 1
  348.     - 0.033048 0 4 ack 40 ------- 2 1.2 4.0 0 1
  349.     r 0.043064 0 4 ack 40 ------- 2 1.2 4.0 0 1
  350.     + 0.043064 4 0 xcp 1200 ------- 2 4.0 1.2 1 2
  351.     - 0.043064 4 0 xcp 1200 ------- 2 4.0 1.2 1 2
  352.     + 0.043064 4 0 xcp 1200 ------- 2 4.0 1.2 2 3
  353.     - 0.043544 4 0 xcp 1200 ------- 2 4.0 1.2 2 3
  354.   end{program}
  355.   Lets try to read the first line:
  356.   code{+ 0.003 4 0 xcp 40 ------- 2 4.0 1.2 0 0}
  357.   
  358.   + means a packet is enqueued in the queue (in node 4) as it hopped
  359.   between node 4 to node 0. You'll find traces showing packets enqued
  360.   (+) and then dequed (-) at the queue, after which it is transmitted
  361.   over the link to be received by the next node. packet
  362.   type is xcp and it is of size 40 bytes. The xcp flow has an id of 2
  363.   and the packet header has a source node/port id of 4.0 and dest
  364.   node/port id of 1.2 and the unique packet id is 0.
  365.     
  366.   section{Test-suites for XCP}
  367.   label{sec:test for xcp}
  368.   
  369.   The xcp test-suite uses 3 tests. The first one is similar to the one
  370.   we discussed in the earlier section. It consists of a dumb-bell
  371.   topology where 3 xcp flows share a bottleneck link. The second test
  372.   has a similar topology having 3 xcp and 1 tcp flow sharing the same
  373.   bottleneck. And finally the last test is built on Dina Katabi's
  374.   parking-lot experiment referred in her SIGCOMM'02 paper. It is a
  375.   downsized version of Dina's example. The test uses a 9-hop
  376.   link string topology. It has 10 long XCP flows that flow through the
  377.   entire length of the chain topology. Then it has 10 XCP flows that run
  378.   through each hop, starting at (n-1)th hop and ending at nth hop and so
  379.   on creating the intermittent flows. And finally there are long XCP
  380.   flows in the reverse direction, 
  381.   starting from the last (10th) node and ending in the first (1st) node.
  382.   There is a bottleneck at the middle of the chain topology. Thus the
  383.   third test employs a large and complex topology and shows the
  384.   utilization, queue length and packet drop values at every link.
  385.   
  386.   section{Commands at a glance}
  387.   label{sec:commands-xcp}
  388.   
  389.   Following is a list of commands used for xcp related simulation in ns.
  390.   begin{flushleft}
  391.     code{set xcp_src [new Agent/TCP/Reno/XCP]}\
  392.     This command creates an XCP source agent.
  393.     code{set xcp_dst [new Agent/TCPSink/XCPSink]}\
  394.     This command creates an XCP sink.
  395.     code{$ns duplex-link $R0 $R1 <BW>Mb <delay>ms XCP}\
  396.     %$
  397.     This code creates a duplex link with specified bandwidth and link
  398.     delay using an XCP router between node R0 and R1.
  399.     code{$xcp_queue set-link-capacity <bandwidth_in_bits_per_sec>}\
  400.     %$
  401.     This command propagates the link bandwidth information to the xcp
  402.     queue which uses it for the router feedback calculation.
  403.     code{ set tfile [open tfile w] } \
  404.     code{ $xcp_queue attach $tfile } \
  405.     This Tcl command allows a file to be attached for tracing xcp queue
  406.     parameters. 
  407.     
  408.     code{$xcp_src attach-trace <file-descriptor>} %$
  409.     code{$xcp_src tracevar <var-to-traced>}\
  410.     This command allows the xcp sources to trace variables.
  411.     
  412.     code{$queue queue-sample-everyrtt $rtt_value}\ %$
  413.     This command allows the user to set rtt interval values at which
  414.     variables like packet_drops and queue lengths are measured at the
  415.     xcp queue.
  416.     code{Queue/XCP set tcp_xcp_on_ 1}\
  417.     This flag lets tcp and xcp flows to use the same xcp router. This
  418.     flag is a temporary fix and should go away when dynamic queue
  419.     weights come into effect.
  420.     
  421.   end{flushleft}
  422.   %end{document}