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

通讯编程

开发平台:

Visual C++

  1. chapter{TCP Agents}
  2. label{sec:tcpAgents}
  3. This section describes the operation of the TCP agents in ns.
  4. There are two major types of TCP agents: one-way agents
  5. and a two-way agent.
  6. One-way agents are further subdivided into a set of TCP senders
  7. (which obey different congestion and error control techniques)
  8. and receivers (``sinks'').
  9. The two-way agent is symmetric in the sense that it represents
  10. both a sender and receiver.
  11. It is still under development.
  12. The files described in this section are too numerous to enumerate here.
  13. Basically it covers most files matching the regular expression
  14. nsf{tcp*.{cc, h}}.
  15. The one-way TCP sending agents currently supported are:
  16. begin{itemize}itemsep0pt
  17.         item Agent/TCP - a ``tahoe'' TCP sender
  18.         item Agent/TCP/Reno - a ``Reno'' TCP sender
  19.         item Agent/TCP/Newreno - Reno with a modification
  20.         item Agent/TCP/Sack1 - TCP with selective repeat (follows RFC2018)
  21.         item Agent/TCP/Vegas - TCP Vegas
  22.         item Agent/TCP/Fack - Reno TCP with ``forward acknowledgment''
  23. item Agent/TCP/Linux - a TCP sender with SACK support that runs TCP congestion control modules from Linux kernel
  24. end{itemize}
  25. The one-way TCP receiving agents currently supported are:
  26. begin{itemize}itemsep0pt
  27.         item Agent/TCPSink - TCP sink with one ACK per packet
  28.         item Agent/TCPSink/DelAck - TCP sink with configurable delay per ACK
  29.         item Agent/TCPSink/Sack1 - selective ACK sink (follows RFC2018)
  30.         item Agent/TCPSink/Sack1/DelAck - Sack1 with DelAck
  31. end{itemize}
  32. The two-way experimental sender currently supports only a Reno form of TCP:
  33. begin{itemize}
  34.         item Agent/TCP/FullTcp
  35. end{itemize}
  36. The section comprises three parts:
  37. the first part is a simple overview and example of configuring
  38. the base TCP send/sink agents (the sink requires no configuration).
  39. The second part describes the internals of the base send agent,
  40. and last part is a description of the extensions
  41. for the other types of agents that have been included in the
  42. simulator.
  43. section{One-Way TCP Senders}
  44. label{sec:oneWayTcp}
  45. The simulator supports several versions of an abstracted TCP sender.
  46. These objects attempt to capture the essence of the TCP congestion
  47. and error control behaviors, but are not intended to be faithful
  48. replicas of real-world TCP implementations.
  49. They do not contain a dynamic window advertisement, they do segment
  50. number and ACK number computations entirely in packet units,
  51. there is no SYN/FIN connection establishment/teardown, and no
  52. data is ever transferred (e.g. no checksums or urgent data).
  53. subsection{The Base TCP Sender (Tahoe TCP)}
  54. label{sec:tahoetcp}
  55. The ``Tahoe'' TCP agent code{Agent/TCP} performs congestion
  56. control and round-trip-time estimation
  57. in a way similar to the version of TCP released with the
  58. 4.3BSD ``Tahoe'' UN'X system release from UC Berkeley.
  59. The congestion window is increased by one packet per new ACK received
  60. during slow-start (when $cwnd_ < ssthresh_$) and is increased
  61. by $frac{1}{cwnd_}$ for each new ACK received during congestion avoidance
  62. (when $cwnd_ geq ssthresh_$).
  63. paragraph{Responses to Congestion}
  64. Tahoe TCP assumes a packet has been lost (due to congestion)
  65. when it observes {tt NUMDUPACKS} (defined in code{tcp.h}, currently 3)
  66. duplicate ACKs, or when a retransmission timer expires.
  67. In either case, Tahoe TCP reacts by setting {tt ssthresh_} to half
  68. of the current window size (the minimum of {tt cwnd_} and {tt window_})
  69. or 2, whichever is larger.
  70. It then initializes {tt cwnd_} back to the value of
  71. {tt windowInit_}.  This will typically cause the TCP to
  72. enter slow-start.
  73. paragraph{Round-Trip Time Estimation and RTO Timeout Selection}
  74. Four variables are used to estimate the round-trip time and
  75. set the retransmission timer: {tt rtt_, srtt_, rttvar_, tcpTick_,
  76. and backoff_}.
  77. TCP initializes rttvar to $3/tcpTick_$ and backoff to 1.
  78. When any future retransmission timer is set, it's timeout
  79. is set to the current time plus $max(bt(a+4v+1), 64)$ seconds,
  80. where $b$ is the current backoff value, $t$ is the value of tcpTick,
  81. $a$ is the value of srtt, and $v$ is the value of rttvar.
  82. Round-trip time samples arrive with new ACKs.
  83. The RTT sample is computed as the difference between the current
  84. time and a ``time echo'' field in the ACK packet.
  85. When the first sample is taken, its value is used as the initial
  86. value for {tt srtt_}.  Half the first sample is used as the initial
  87. value for {tt rttvar_}.
  88. For subsequent samples, the values are updated as follows:
  89. [ srtt = frac{7}{8} times srtt + frac{1}{8} times sample ]
  90. [ rttvar = frac{3}{4} times rttvar + frac{1}{4} times |sample-srtt| ]
  91. subsection{Configuration}
  92. label{sec:tcp-config}
  93. Running an TCP simulation requires
  94. creating and configuring the agent,
  95. attaching an application-level data source (a traffic generator), and
  96. starting the agent and the traffic generator.
  97. subsection{Simple Configuration}
  98. paragraph{Creating the Agent}
  99. begin{program}
  100. set ns [new Simulator]                  ; preamble initialization;
  101. set node1 [$ns node]                     ; agent to reside on this node;
  102. set node2 [$ns node]                     ; agent to reside on this node;
  103. {bfseries{}set tcp1 [$ns create-connection TCP $node1 TCPSink $node2 42]}
  104. $tcp  set window_ 50                   ; configure the TCP agent;
  105. {bfseries{}set ftp1 [new Application/FTP]}
  106. {bfseries{}$ftp1 attach-agent $tcp1}
  107. $ns at 0.0 "$ftp start"
  108. end{program}
  109. This example illustrates the use of the simulator built-in
  110. function {tt create-connection}.
  111. The arguments to this function are: the source agent to create,
  112. the source node, the target agent to create, the target node, and
  113. the flow ID to be used on the connection.
  114. The function operates by creating the two agents, setting the
  115. flow ID fields in the agents, attaching the source and target agents
  116. to their respective nodes, and finally connecting the agents
  117. (i.e. setting appropriate source and destination addresses and ports).
  118. The return value of the function is the name of the source agent created.
  119. paragraph{TCP Data Source}
  120. The TCP agent does not generate any application data on its own;
  121. instead, the simulation user can connect any traffic generation
  122. module to the TCP agent to generate data.
  123. Two applications are commonly used for TCP: FTP and Telnet.
  124. FTP represents a bulk data transfer of large size, and telnet chooses
  125. its transfer sizes randomly from tcplib (see the file
  126. code{tcplib-telnet.cc}.
  127. Details on configuring these application source objects are in
  128. Section~ref{sec:simapps}.
  129. subsection{Other Configuration Parameters}
  130. label{sec:other-tcp-config}
  131. In addition to the code{window_} parameter listed above,
  132. the TCP agent supports additional configuration variables.
  133. Each of the variables described in this subsection is
  134. both a class variable and an instance variable.
  135. Changing the class variable changes the default value
  136. for all agents that are created subsequently.
  137. Changing the instance variable of a particular agent
  138. only affects the values used by that agent.
  139. For example,
  140. begin{program}
  141.   Agent/TCP set window_ 100     ; Changes the class variable;
  142.   $tcp set window_ 2.0          ; Changes window_ for the $tcp object only;
  143. end{program}
  144. The default parameters for each TCP agent are:
  145. begin{program}
  146. Agent/TCP set window_   20              ; max bound on window size;
  147. Agent/TCP set windowInit_ 1             ; initial/reset value of cwnd;
  148. Agent/TCP set windowOption_ 1           ; cong avoid algorithm (1: standard);
  149. Agent/TCP set windowConstant_ 4         ; used only when windowOption != 1;
  150. Agent/TCP set windowThresh_ 0.002       ; used in computing averaged window;
  151. Agent/TCP set overhead_ 0               ; !=0 adds random time between sends;
  152. Agent/TCP set ecn_ 0                    ; TCP should react to ecn bit ;
  153. Agent/TCP set packetSize_ 1000          ; packet size used by sender (bytes);
  154. Agent/TCP set bugFix_ true              ; see explanation;
  155. Agent/TCP set slow_start_restart_ true  ; see explanation;
  156. Agent/TCP set tcpTick_ 0.1              ; timer granulatiry in sec (.1 is NONSTANDARD);
  157. Agent/TCP set maxrto_ 64                ; bound on RTO (seconds);
  158. Agent/TCP set dupacks_ 0                ; duplicate ACK counter;
  159. Agent/TCP set ack_ 0                    ; highest ACK received;
  160. Agent/TCP set cwnd_ 0                   ; congestion window (packets);
  161. Agent/TCP set awnd_ 0                   ; averaged cwnd (experimental);
  162. Agent/TCP set ssthresh_ 0               ; slow-stat threshold (packets);
  163. Agent/TCP set rtt_ 0                    ; rtt sample;
  164. Agent/TCP set srtt_ 0                   ; smoothed (averaged) rtt;
  165. Agent/TCP set rttvar_ 0                 ; mean deviation of rtt samples;
  166. Agent/TCP set backoff_ 0                ; current RTO backoff factor;
  167. Agent/TCP set maxseq_ 0                 ; max (packet) seq number sent;
  168. end{program}
  169. For many simulations, few of the configuration parameters are likely
  170. to require modification.
  171. The more commonly modified parameters include: {tt window_} and
  172. {tt packetSize_}.
  173. The first of these bounds the window TCP uses, and is considered
  174. to play the role of the receiver's advertised window in real-world
  175. TCP (although it remains constant).
  176. The packet size essentially functions like the MSS size in real-world
  177. TCP.
  178. Changes to these parameters can have a profound effect on the behavior
  179. of TCP.
  180. Generally, those TCPs with larger packet sizes, bigger windows, and
  181. smaller round trip times (a result of the topology and congestion) are
  182. more agressive in acquiring network bandwidth.
  183. subsection{Other One-Way TCP Senders}
  184. paragraph{Reno TCP}
  185. The Reno TCP agent is very similar to the Tahoe TCP agent,
  186. except it also includes {em fast recovery}, where the current
  187. congestion window is ``inflated'' by the number of duplicate ACKs
  188. the TCP sender has received before receiving a new ACK.
  189. A ``new ACK'' refers to any ACK with a value higher than the higest
  190. seen so far.
  191. In addition, the Reno TCP agent does not return to slow-start during
  192. a fast retransmit.
  193. Rather, it reduces sets the congestion window to half the current
  194. window and resets {tt ssthresh_} to match this value.
  195. paragraph{Newreno TCP}
  196. This agent is based on the Reno TCP agent, but which modifies the
  197. action taken when receiving new ACKS.
  198. In order to exit fast recovery, the sender must receive an ACK for the
  199. highest sequence number sent.
  200. Thus, new ``partial ACKs'' (those which represent new ACKs but do not
  201. represent an ACK for all outstanding data) do not deflate the window
  202. (and possibly lead to a stall, characteristic of Reno).
  203. paragraph{Vegas TCP}
  204. This agent implements ``Vegas'' TCP (cite{Brak94:TCP,Brak94a:TCP}).
  205. It was contributed by Ted Kuo.
  206. paragraph{Sack TCP}
  207. This agent implements selective repeat, based on selective ACKs provided
  208. by the receiver.
  209. It follows the ACK scheme described in cite{rfc2018}, and was developed
  210. with Matt Mathis and Jamshid Mahdavi.
  211. paragraph{Fack TCP}
  212. This agent implements ``forward ACK'' TCP, a modification of Sack
  213. TCP described in cite{Math96:Forward}.
  214. paragraph{Linux TCP}
  215. This agent runs TCP congestion control modules imported from Linux kernel.
  216. The agent generates simulation results that are consistent, in congestion window trajectory level, with the behavior of Linux hosts.
  217. Simulation users can update or import new congestion control modules from Linux kernel source code for this agent.
  218. The Linux congestion control modules are compiled into the NS-2 binary. Users can select different congestion control algorithms, different
  219. congestion control module parameters, and different Linux TCP parameters for different instances of this agent.
  220. This agent supports SACK. A receiver that supports SACK is recommended to work with this agent.
  221. There is a tutorial for using this agent in cite{Wei07NSLinuxTutorial}.
  222. The implementation of this agent loosely follows the Linux TCP packet processing routine and calls the congestion control source
  223. codes from Linux kernel to change congestion control related parameters (e.g. congestion window, slow start threshold and etc).
  224. The design and implementation details are described in cite{WeiCao06NSLinuxTCP}.
  225. To achieve simulation results close to Linux performance, this agent changes the default values of the following parameters
  226. according to the Linux parameters: 
  227. begin{program}
  228. Agent/TCP/Linux set maxrto_ 120
  229. Agent/TCP/Linux set ts_resetRTO_ true
  230. Agent/TCP/Linux set delay_growth_ false
  231. end{program}
  232. section{TCP Receivers (sinks)}
  233. The TCP senders described above represent one-way data senders.
  234. They must peer with a ``TCP sink'' object.
  235. subsection{The Base TCP Sink}
  236. The base TCP sink object ({tt Agent/TCPSink})
  237. is responsible for returning ACKs to
  238. a peer TCP source object.
  239. It generates one ACK per packet received.
  240. The size of the ACKs may be configured.
  241. The creation and configuration of the TCP sink object
  242. is generally performed automatically by a library
  243. call (see {tt create-connection} above).
  244. paragraph{configuration parameters}
  245. begin{program}
  246.         Agent/TCPSink set packetSize_ 40
  247. end{program}
  248. subsection{Delayed-ACK TCP Sink}
  249. A delayed-ACK sink object ({tt Agent/Agent/TCPSink/DelAck}) is available
  250. for simulating a TCP receiver that ACKs less than once per packet received.
  251. This object contains a bound variable {tt interval_} which gives the
  252. number of seconds to wait between ACKs.
  253. The delayed ACK sink implements an agressive ACK policy whereby
  254. only ACKs for in-order packets are delayed.
  255. Out-of-order packets cause immediate ACK generation.
  256. paragraph{configuration parameters}
  257. begin{program}
  258.         Agent/TCPSink/DelAck set interval_ 100ms
  259. end{program}
  260. subsection{Sack TCP Sink}
  261. The selective-acknowledgment TCP sink ({tt Agent/TCPSink/Sack1}) implements
  262. SACK generation modeled after the description of SACK in RFC 2018.
  263. This object includes a bound variable {tt maxSackBlocks_} which gives
  264. the maximum number of blocks of information in an ACK available for
  265. holding SACK information.
  266. The default value for this variable is 3, in accordance with the expected
  267. use of SACK with RTTM (see RFC 2018, section 3).
  268. Delayed and selective ACKs together are implemented by
  269. an object of type {tt Agent/TCPSink/Sack1/DelAck}.
  270. paragraph{configuration parameters}
  271. begin{program}
  272.         Agent/TCPSink set maxSackBlocks_ 3
  273. end{program}
  274. section{Two-Way TCP Agents (FullTcp)}
  275. label{sec:fulltcp}
  276. The {tt Agent/TCP/FullTcp} object is a new addition to the suite of
  277. TCP agents supported in the simulator and is still under development.
  278. It is different from (and incompatible with) the other agents, but
  279. does use some of the same architecture.
  280. It differs from these agents in the following ways:
  281. following ways:
  282. begin{itemize}itemsep0pt
  283. item connections may be establised and town down
  284. (SYN/FIN packets are exchanged)
  285. item bidirectional data transfer is supported
  286. item sequence numbers are in bytes rather than packets
  287. end{itemize}
  288. The generation of SYN packets (and their ACKs) can be
  289. of critical importance in trying to model real-world behavior
  290. when using many very short data transfers.
  291. This version of TCP currently defaults to sending
  292. data on the 3rd segment of an initial 3-way handshake, a behavior
  293. somewhat different than common real-world TCP implementations.
  294. A ``typical'' TCP connection proceeds with an active opener
  295. sending a SYN, the passive opener responding with a SYN+ACK,
  296. the active opener responding with an ACK, and then some time later
  297. sending the first segment with data (corresponding to the first
  298. application write).
  299. Thus, this version of TCP sends data at a time somewhat earlier
  300. than typical implementations.
  301. This TCP can also be configured to send data on the initial SYN
  302. segment.
  303. Future changes to FullTCP may include a modification to send the
  304. first data segment later, and possibly to implement T/TCP functionality.
  305. Currently FullTCP is only implemented with Reno congestion control,
  306. but ultimately it should be available with the full range of
  307. congestion control algorithms (e.g., Tahoe, SACK, Vegas, etc.).
  308. subsection{Simple Configuration}
  309. label{sec:simpleconfig}
  310. Running an Full TCP simulation requires
  311. creating and configuring the agent,
  312. attaching an application-level data source (a traffic generator), and
  313. starting the agent and the traffic generator.
  314. paragraph{Creating the Agent}
  315. begin{program}
  316. # {cf set up connection (do not use "create-connection" method because }
  317. # {cf we need a handle on the sink object)}
  318. set src [new Agent/TCP/FullTcp] ; create agent;
  319. set sink [new Agent/TCP/FullTcp] ; create agent;
  320. $ns_ attach-agent $node_(s1) $src ; bind src to node;
  321. $ns_ attach-agent $node_(k1) $sink ; bind sink to node;
  322. $src set fid_ 0   ; set flow ID field;
  323. $sink set fid_ 0  ; set flow ID field;
  324. $ns_ connect $src $sink ; active connection src to sink;
  325. # {cf set up TCP-level connections}
  326. $sink listen ; will figure out who its peer is;
  327. $src set window_ 100;
  328. end{program}
  329. The creation of the FullTcp agent is similar to the other agents,
  330. but the sink is placed in a listening state by the {tt listen} method.
  331. Because a handle to the receiving side is required in order to make
  332. this call, the {tt create-connection} call used above cannot be used.
  333. paragraph{Configuration Parameters}
  334. The following configuration parameters are available through Tcl
  335. for the FullTcp agent:
  336. begin{program}
  337. Agent/TCP/FullTcp set segsperack_ 1 ; segs received before generating ACK;
  338. Agent/TCP/FullTcp set segsize_ 536  ; segment size (MSS size for bulk xfers);
  339. Agent/TCP/FullTcp set tcprexmtthresh_ 3 ; dupACKs thresh to trigger fast rexmt;
  340. Agent/TCP/FullTcp set iss_ 0 ; initial send sequence number;
  341. Agent/TCP/FullTcp set nodelay_ false ; disable sender-side Nagle algorithm;
  342. Agent/TCP/FullTcp set data_on_syn_ false ; send data on initial SYN?;
  343. Agent/TCP/FullTcp set dupseg_fix_ true ; avoid fast rxt due to dup segs+acks;
  344. Agent/TCP/FullTcp set dupack_reset_ false ; reset dupACK ctr on !0 len data segs containing dup ACKs;
  345. Agent/TCP/FullTcp set interval_ 0.1 ; as in TCP above, (100ms is non-std);
  346. end{program}
  347. subsection{BayFullTcp}
  348. label{sec:bayfulltcp}
  349. A different implementation of two-way TCP has been ported into ns from Kathy Nicholes/Van Jacobson's group. It is called BayFullTcp. The basic difference between BayFullTcp and FullTcp (the two-way tcp version already present in ns) are as follows:
  350. begin{itemize}
  351. item BayTcp supports a client-server application model while FullTcp makes no assumption about its application layer.
  352. item The tcp-application interface is different for both;
  353. item FullTcp supports partial ack (BayTcp doesn't).
  354. item FullTcp supports different flavors of tcp (tahoe, reno etc) which is not the case for baytcp.
  355. item Both implementations have different set of API's .
  356. end{itemize}
  357. There might be other finer differences between the two as well.
  358. One of our future plans is to redefine the APIs to allow fulltcp to use
  359. baytcp's client-server model.
  360. section{Architecture and Internals}
  361. label{sec:tcparchitecture}
  362. The base TCP agent (class {tt Agent/TCP}) is constructed
  363. as a collection of routines for sending packets, processing ACKs,
  364. managing the send window, and handling timeouts.
  365. Generally, each of these routines may be over-ridden by a
  366. function with the same name in a derived class (this is how
  367. many of the TCP sender variants are implemented).
  368. paragraph{The TCP header}
  369. The TCP header is defined by the {tt hdr_tcp} structure
  370. in the file nsf{tcp.h}.
  371. The base agent only makes use of the following subset of the fields:
  372. begin{program}
  373. ts_     * current time packet was sent from source */
  374. ts_echo_ * for ACKs: timestamp field from packet associated with this ACK */
  375. seqno_ * sequence number for this data segment or ACK (Note: overloading!) */
  376. reason_ * set by sender when (re)transmitting to trace reason for send */
  377. end{program}
  378. paragraph{Functions for Sending Data}
  379. Note that generally the sending TCP never actually sends
  380. data (it only sets the packet size).
  381. {bf send_much(force, reason, maxburst)} - this function
  382. attempts to send as many packets as the current sent window allows.
  383. It also keeps track of how many packets it has sent, and limits to the
  384. total to {em maxburst}. \
  385. The function {tt output(seqno, reason)} sends one packet
  386. with the given sequence number and updates the maximum sent sequence
  387. number variable ({tt maxseq_}) to hold the given sequence number if
  388. it is the greatest sent so far.
  389. This function also assigns the various fields in the TCP
  390. header (sequence number, timestamp, reason for transmission).
  391. This function also sets a retransmission timer if one is not already
  392. pending.
  393. paragraph{Functions for Window Management}
  394. The usable send window at any time is given by the function {bf window()}.
  395. It returns the minimum of the congestion window and the variable {tt wnd_},
  396. which represents the receiver's advertised window.
  397. {bf opencwnd()} - this function opens the congestion window.  It is invoked
  398. when a new ACK arrives.
  399. When in slow-start, the function merely increments {tt cwnd_} by each
  400. ACK received.
  401. When in congestion avoidance, the standard configuration increments {tt cwnd_}
  402. by its reciprocal.
  403. Other window growth options are supported during congestion avoidance,
  404. but they are experimental (and not documented; contact Sally Floyd for
  405. details).
  406. {bf closecwnd(int how)} - this function reduces the congestion window. It
  407. may be invoked in several ways: when entering fast retransmit, due to
  408. a timer expiration, or due to a congestion notification (ECN bit set).
  409. Its argument {tt how} indicates how the congestion window should
  410. be reduced.  The value {bf 0} is used for retransmission timeouts and
  411. fast retransmit in Tahoe TCP.  It typically causes the TCP to enter
  412. slow-start and reduce {tt ssthresh_} to half the current window.
  413. The value {bf 1} is used by Reno TCP for implementing fast recovery
  414. (which avoids returning to slow-start).
  415. The value {bf 2} is used for reducing the window due to an ECN indication.
  416. It resets the congestion window to its initial value (usually causing
  417. slow-start), but does not alter {tt ssthresh_}.
  418. paragraph{Functions for Processing ACKs}
  419. {bf recv()} - this function is the main reception path for ACKs.
  420. Note that because only one direction of data flow is in use, this function
  421. should only ever be invoked with a pure ACK packet (i.e. no data).
  422. The function stores the timestamp from the ACK in {tt ts_peer_}, and
  423. checks for the presence of the ECN bit (reducing the send window if
  424. appropriate).
  425. If the ACK is a new ACK, it calls {bf newack()}, and otherwise
  426. checks to see if it is a duplicate of the last ACK seen.
  427. If so, it enters fast retransmit by closing the window, resetting the
  428. retransmission timer, and sending a packet by calling {tt send_much}.
  429. {bf newack()} - this function processes a ``new'' ACK (one that contains
  430. an ACK number higher than any seen so far).
  431. The function sets a new retransmission timer by calling {bf newtimer()},
  432. updates the RTT estimation by calling {bf rtt_update}, and updates
  433. the highest and last ACK variables.
  434. paragraph{Functions for Managing the Retransmission Timer}
  435. These functions serve two purposes: estimating the round-trip time
  436. and setting the actual retransmission timer.
  437. {bf rtt_init} - this function initializes {tt srtt_} and {tt rtt_}
  438. to zero, sets {tt rttvar_} to $3/tcp_tick_$, and sets the backoff
  439. multiplier to one.
  440. {bf rtt_timeout} - this function gives the timeout value in seconds that
  441. should be used to schedule the next retransmission timer.
  442. It computes this based on the current estimates of the mean and deviation
  443. of the round-trip time.  In addition, it implements Karn's
  444. exponential timer backoff for multiple consecutive retransmission timeouts.
  445. {bf rtt_update} - this function takes as argument the measured RTT
  446. and averages it in to the running mean and deviation estimators
  447. according to the description above.
  448. Note that {tt t_srtt_} and {tt t_rttvar} are both
  449. stored in fixed-point (integers).
  450. They have 3 and 2 bits, respectively, to the right of the binary
  451. point.
  452. {bf reset_rtx_timer} -  This function is invoked during fast retransmit
  453. or during a timeout.
  454. It sets a retransmission timer
  455. by calling {tt set_rtx_timer} and if invoked by a timeout also calls
  456. {tt rtt_backoff}.
  457. {bf rtt_backoff} - this function backs off the retransmission timer
  458. (by doubling it).
  459. {bf newtimer} - this function called only when a new ACK arrives.
  460. If the sender's left window edge is beyond the ACK, then
  461. {tt set_rtx_timer} is called, otherwise if a retransmission timer
  462. is pending it is cancelled.
  463. section{Tracing TCP Dynamics}
  464. label{sec:traceTcpdyn}
  465. The behavior of TCP is often observed by constructing a
  466. sequence number-vs-time plot.
  467. Typically, a trace is performed by enabling tracing on a link
  468. over which the TCP packets will pass.
  469. Two trace methods are supported: the default one (used for tracing
  470. TCP agents), and an extension used only for FullTcP.
  471. section{One-Way Trace TCP Trace Dynamics}
  472. label{sec:trace1WayTcpdyn}
  473. TCP packets generated by one of the one-way TCP agents and destined for
  474. a TCP sink agent
  475. passing over a traced link (see section~ref{chap:trace})
  476. will generate a trace file lines of the form:
  477. begin{verbatim}
  478. + 0.94176 2 3 tcp 1000 ------ 0 0.0 3.0 25 40
  479. + 0.94276 2 3 tcp 1000 ------ 0 0.0 3.0 26 41
  480. d 0.94276 2 3 tcp 1000 ------ 0 0.0 3.0 26 41
  481. + 0.95072 2 0 ack 40 ------ 0 3.0 0.0 14 29
  482. - 0.95072 2 0 ack 40 ------ 0 3.0 0.0 14 29
  483. - 0.95176 2 3 tcp 1000 ------ 0 0.0 3.0 21 36
  484. + 0.95176 2 3 tcp 1000 ------ 0 0.0 3.0 27 42
  485. end{verbatim}
  486. The exact format of this trace file is given in section~ref{sec:traceformat}.
  487. When tracing TCP, packets of type {sf tcp} or {sf ack} are relevant.
  488. Their type, size, sequence number (ack number for ack packets),
  489. and arrival/depart/drop time are given by field positions
  490. 5, 6, 11, and 2, respectively.
  491. The {sf +} indicates a packet arrival, {sf d} a drop, and {sf -} a
  492. departure.
  493. A number of scripts process this file to produce graphical output or
  494. statistical summaries (see,  for example, nsf{test-suite.tcl}, the
  495. {tt finish} procedure.
  496. section{One-Way Trace TCP Trace Dynamics}
  497. label{sec:tcpdyn}
  498. TCP packets generated by FullTcp and
  499. passing over a traced link contain additional information not displayed
  500. by default using the regular trace object.
  501. By enabling the flag {tt show_tcphdr_} on the trace object
  502. (see section~ref{sec:traceformat}), 3 additional header fields are
  503. written to the trace file: ack number, tcp-specific flags, and header length.
  504. section{Commands at a glance}
  505. label{sec:tcpcommand}
  506. The following is a list of commands used to setup/manipulate TCP flows
  507. for simulations:
  508. begin{flushleft}
  509. code{set tcp0 [new Agent/TCP]}\
  510. This creates an instance of a TCP agent. There are several flavors of
  511. TCP-sender and TCP-receiver (or sink) agent currently implemented in ns.
  512. TCP-senders currently available are:
  513. Agent/TCP, Agent/TCP/Reno, Agent/TCP/Newreno, Agent/TCP/Sack1, Agent/TCP/Vegas,
  514. Agent/TCP/Fack. \
  515. TCP-receivers currently available are:
  516. Agent/TCPSink, Agent/TCPSink/DelAck, Agent/TCPSink/Sack1,
  517. Agent/TCPSink/Sack1/DelAck.\
  518. There is also a two-way implementation of tcp called Agent/TCP/FullTcp. For
  519. details on the different TCP flavors see earlier sections of this chapter.
  520. Configuration parameters for TCP flows maybe set as follows:\
  521. code{$tcp set window_ <wnd-size>}\
  522. For all possible configuration parameters available for TCP see section
  523. ref{sec:other-tcp-config}. The default configuration values can also be
  524. found in ns/tcl/lib/ns-default.tcl.
  525. Following is an example of a simple TCP connection setup:
  526. begin{program}
  527. set tcp [new Agent/TCP] ; create tcp agent;
  528. $ns_ attach-agent $node_(s1) $tcp ; bind src to node;
  529. $tcp set fid_ 0   ; set flow ID field;
  530. set ftp [new Application/FTP]   ; create ftp traffic;
  531. $ftp attach-agent $tcp  ; bind ftp traffic to tcp agent;
  532. set sink [new Agent/TCPSink] ; create tcpsink agent;
  533. $ns_ attach-agent $node_(k1) $sink ; bind sink to node;
  534. $sink set fid_ 0  ; set flow ID field;
  535. $ns_ connect $ftp $sink ; active connection src to sink;
  536. $ns_ at $start-time "$ftp start"  ; start ftp flow;
  537. end{program}
  538. For an example of setting up a full-tcp connection see section
  539. ref{sec:simpleconfig}.
  540. end{flushleft}
  541. endinput