home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 November / CMCD1104.ISO / Software / Complet / Apache / apache_2.0.52-win32-x86-no_ssl.msi / Data.Cab / F277894_fin_wait_2.html.en < prev    next >
Extensible Markup Language  |  2004-02-20  |  21KB  |  422 lines

  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head><!--
  4.         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  5.               This file is generated from xml source: DO NOT EDIT
  6.         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  7.       -->
  8. <title>Connections in the FIN_WAIT_2 state and Apache - Apache HTTP Server</title>
  9. <link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
  10. <link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
  11. <link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
  12. <link href="../images/favicon.ico" rel="shortcut icon" /></head>
  13. <body id="manual-page"><div id="page-header">
  14. <p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="../faq/">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p>
  15. <p class="apache">Apache HTTP Server Version 2.0</p>
  16. <img alt="" src="../images/feather.gif" /></div>
  17. <div class="up"><a href="./"><img title="<-" alt="<-" src="../images/left.gif" /></a></div>
  18. <div id="path">
  19. <a href="http://www.apache.org/">Apache</a> > <a href="http://httpd.apache.org/">HTTP Server</a> > <a href="http://httpd.apache.org/docs-project/">Documentation</a> > <a href="../">Version 2.0</a> > <a href="./">Miscellaneous Documentation</a></div><div id="page-content"><div id="preamble"><h1>Connections in the FIN_WAIT_2 state and Apache</h1>
  20. <div class="toplang">
  21. <p><span>Available Languages: </span><a href="../en/misc/fin_wait_2.html" title="English"> en </a></p>
  22. </div>
  23.  
  24.  
  25.     <div class="warning"><h3>Warning:</h3>
  26.       <p>This document has not been fully updated
  27.       to take into account changes made in the 2.0 version of the
  28.       Apache HTTP Server. Some of the information may still be
  29.       relevant, but please use it with care.</p>
  30.     </div>
  31.  
  32.         <p>Starting with the Apache 1.2 betas, people are reporting
  33.         many more connections in the FIN_WAIT_2 state (as reported
  34.         by <code>netstat</code>) than they saw using older
  35.         versions. When the server closes a TCP connection, it sends
  36.         a packet with the FIN bit set to the client, which then
  37.         responds with a packet with the ACK bit set. The client
  38.         then sends a packet with the FIN bit set to the server,
  39.         which responds with an ACK and the connection is closed.
  40.         The state that the connection is in during the period
  41.         between when the server gets the ACK from the client and
  42.         the server gets the FIN from the client is known as
  43.         FIN_WAIT_2. See the <a href="ftp://ds.internic.net/rfc/rfc793.txt">TCP RFC</a> for
  44.         the technical details of the state transitions.</p>
  45.  
  46.         <p>The FIN_WAIT_2 state is somewhat unusual in that there
  47.         is no timeout defined in the standard for it. This means
  48.         that on many operating systems, a connection in the
  49.         FIN_WAIT_2 state will stay around until the system is
  50.         rebooted. If the system does not have a timeout and too
  51.         many FIN_WAIT_2 connections build up, it can fill up the
  52.         space allocated for storing information about the
  53.         connections and crash the kernel. The connections in
  54.         FIN_WAIT_2 do not tie up an httpd process.</p>
  55.  
  56.   </div>
  57. <div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#why">Why Does It Happen?</a></li>
  58. <li><img alt="" src="../images/down.gif" /> <a href="#what">What Can I Do About it?</a></li>
  59. <li><img alt="" src="../images/down.gif" /> <a href="#appendix">Appendix</a></li>
  60. </ul></div>
  61. <div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
  62. <div class="section">
  63. <h2><a name="why" id="why">Why Does It Happen?</a></h2>
  64.  
  65.     <p>There are numerous reasons for it happening, some of them
  66.     may not yet be fully clear. What is known follows.</p>
  67.  
  68.     <h3><a name="buggy" id="buggy">Buggy Clients and Persistent 
  69.                                Connections</a></h3>
  70.  
  71.         <p>Several clients have a bug which pops up when dealing with
  72.         persistent connections (aka
  73.         keepalives). When the connection is idle and the server
  74.         closes the connection (based on the <code class="directive"><a href="../mod/core.html#keepalivetimeout">KeepAliveTimeout</a></code>),
  75.         the client is programmed so that the client does not send
  76.         back a FIN and ACK to the server. This means that the
  77.         connection stays in the FIN_WAIT_2 state until one of the
  78.         following happens:</p>
  79.  
  80.         <ul>
  81.           <li>The client opens a new connection to the same or a
  82.           different site, which causes it to fully close the older
  83.           connection on that socket.</li>
  84.  
  85.           <li>The user exits the client, which on some (most?)
  86.           clients causes the OS to fully shutdown the
  87.           connection.</li>
  88.  
  89.           <li>The FIN_WAIT_2 times out, on servers that have a
  90.           timeout for this state.</li>
  91.         </ul>
  92.  
  93.         <p>If you are lucky, this means that the buggy client will
  94.         fully close the connection and release the resources on
  95.         your server. However, there are some cases where the socket
  96.         is never fully closed, such as a dialup client
  97.         disconnecting from their provider before closing the
  98.         client. In addition, a client might sit idle for days
  99.         without making another connection, and thus may hold its
  100.         end of the socket open for days even though it has no
  101.         further use for it. <strong>This is a bug in the browser or
  102.         in its operating system's TCP implementation.</strong></p>
  103.  
  104.         <p>The clients on which this problem has been verified to
  105.         exist:</p>
  106.  
  107.         <ul>
  108.           <li>Mozilla/3.01 (X11; I; FreeBSD 2.1.5-RELEASE
  109.           i386)</li>
  110.  
  111.           <li>Mozilla/2.02 (X11; I; FreeBSD 2.1.5-RELEASE
  112.           i386)</li>
  113.  
  114.           <li>Mozilla/3.01Gold (X11; I; SunOS 5.5 sun4m)</li>
  115.  
  116.           <li>MSIE 3.01 on the Macintosh</li>
  117.  
  118.           <li>MSIE 3.01 on Windows 95</li>
  119.         </ul>
  120.  
  121.         <p>This does not appear to be a problem on:</p>
  122.  
  123.         <ul>
  124.           <li>Mozilla/3.01 (Win95; I)</li>
  125.         </ul>
  126.  
  127.         <p>It is expected that many other clients have the same
  128.         problem. What a client <strong>should do</strong> is
  129.         periodically check its open socket(s) to see if they have
  130.         been closed by the server, and close their side of the
  131.         connection if the server has closed. This check need only
  132.         occur once every few seconds, and may even be detected by a
  133.         OS signal on some systems (<em>e.g.</em>, Win95 and NT
  134.         clients have this capability, but they seem to be ignoring
  135.         it).</p>
  136.  
  137.         <p>Apache <strong>cannot</strong> avoid these FIN_WAIT_2
  138.         states unless it disables persistent connections for the
  139.         buggy clients, just like we recommend doing for Navigator
  140.         2.x clients due to other bugs. However, non-persistent
  141.         connections increase the total number of connections needed
  142.         per client and slow retrieval of an image-laden web page.
  143.         Since non-persistent connections have their own resource
  144.         consumptions and a short waiting period after each closure,
  145.         a busy server may need persistence in order to best serve
  146.         its clients.</p>
  147.  
  148.         <p>As far as we know, the client-caused FIN_WAIT_2 problem
  149.         is present for all servers that support persistent
  150.         connections, including Apache 1.1.x and 1.2.</p>
  151.  
  152.     
  153.  
  154.     <h3><a name="code" id="code">A necessary bit of code 
  155.                               introduced in 1.2</a></h3>
  156.  
  157.         <p>While the above bug is a problem, it is not the whole
  158.         problem. Some users have observed no FIN_WAIT_2 problems
  159.         with Apache 1.1.x, but with 1.2b enough connections build
  160.         up in the FIN_WAIT_2 state to crash their server. The most
  161.         likely source for additional FIN_WAIT_2 states is a
  162.         function called <code>lingering_close()</code> which was
  163.         added between 1.1 and 1.2. This function is necessary for
  164.         the proper handling of persistent connections and any
  165.         request which includes content in the message body
  166.         (<em>e.g.</em>, PUTs and POSTs). What it does is read any
  167.         data sent by the client for a certain time after the server
  168.         closes the connection. The exact reasons for doing this are
  169.         somewhat complicated, but involve what happens if the
  170.         client is making a request at the same time the server
  171.         sends a response and closes the connection. Without
  172.         lingering, the client might be forced to reset its TCP
  173.         input buffer before it has a chance to read the server's
  174.         response, and thus understand why the connection has
  175.         closed. See the <a href="#appendix">appendix</a> for more
  176.         details.</p>
  177.  
  178.         <p>The code in <code>lingering_close()</code> appears to
  179.         cause problems for a number of factors, including the
  180.         change in traffic patterns that it causes. The code has
  181.         been thoroughly reviewed and we are not aware of any bugs
  182.         in it. It is possible that there is some problem in the BSD
  183.         TCP stack, aside from the lack of a timeout for the
  184.         FIN_WAIT_2 state, exposed by the
  185.         <code>lingering_close</code> code that causes the observed
  186.         problems.</p>
  187.  
  188.     
  189.   </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
  190. <div class="section">
  191. <h2><a name="what" id="what">What Can I Do About it?</a></h2>
  192.  
  193.     <p>There are several possible workarounds to the problem, some
  194.      of which work better than others.</p>
  195.  
  196.     <h3><a name="add_timeout" id="add_timeout">Add a timeout for FIN_WAIT_2</a></h3>
  197.  
  198.         <p>The obvious workaround is to simply have a timeout for the
  199.         FIN_WAIT_2 state. This is not specified by the RFC, and
  200.         could be claimed to be a violation of the RFC, but it is
  201.         widely recognized as being necessary. The following systems
  202.         are known to have a timeout:</p>
  203.  
  204.         <ul>
  205.           <li><a href="http://www.freebsd.org/">FreeBSD</a>
  206.           versions starting at 2.0 or possibly earlier.</li>
  207.  
  208.           <li><a href="http://www.netbsd.org/">NetBSD</a> version
  209.           1.2(?)</li>
  210.  
  211.           <li><a href="http://www.openbsd.org/">OpenBSD</a> all
  212.           versions(?)</li>
  213.  
  214.           <li><a href="http://www.bsdi.com/">BSD/OS</a> 2.1, with
  215.           the <a href="ftp://ftp.bsdi.com/bsdi/patches/patches-2.1/K210-027">
  216.           K210-027</a> patch installed.</li>
  217.  
  218.           <li><a href="http://www.sun.com/">Solaris</a> as of
  219.           around version 2.2. The timeout can be tuned by using
  220.           <code>ndd</code> to modify
  221.           <code>tcp_fin_wait_2_flush_interval</code>, but the
  222.           default should be appropriate for most servers and
  223.           improper tuning can have negative impacts.</li>
  224.  
  225.           <li><a href="http://www.linux.org/">Linux</a> 2.0.x and
  226.           earlier(?)</li>
  227.  
  228.           <li><a href="http://www.hp.com/">HP-UX</a> 10.x defaults
  229.           to terminating connections in the FIN_WAIT_2 state after
  230.           the normal keepalive timeouts. This does not refer to the
  231.           persistent connection or HTTP keepalive timeouts, but the
  232.           <code>SO_LINGER</code> socket option which is enabled by
  233.           Apache. This parameter can be adjusted by using
  234.           <code>nettune</code> to modify parameters such as
  235.           <code>tcp_keepstart</code> and <code>tcp_keepstop</code>.
  236.           In later revisions, there is an explicit timer for
  237.           connections in FIN_WAIT_2 that can be modified; contact
  238.           HP support for details.</li>
  239.  
  240.           <li><a href="http://www.sgi.com/">SGI IRIX</a> can be
  241.           patched to support a timeout. For IRIX 5.3, 6.2, and 6.3,
  242.           use patches 1654, 1703 and 1778 respectively. If you have
  243.           trouble locating these patches, please contact your SGI
  244.           support channel for help.</li>
  245.  
  246.           <li><a href="http://www.ncr.com/">NCR's MP RAS Unix</a>
  247.           2.xx and 3.xx both have FIN_WAIT_2 timeouts. In 2.xx it
  248.           is non-tunable at 600 seconds, while in 3.xx it defaults
  249.           to 600 seconds and is calculated based on the tunable
  250.           "max keep alive probes" (default of 8) multiplied by the
  251.           "keep alive interval" (default 75 seconds).</li>
  252.  
  253.           <li><a href="http://www.sequent.com">Sequent's ptx/TCP/IP
  254.           for DYNIX/ptx</a> has had a FIN_WAIT_2 timeout since
  255.           around release 4.1 in mid-1994.</li>
  256.         </ul>
  257.  
  258.         <p>The following systems are known to not have a
  259.         timeout:</p>
  260.  
  261.         <ul>
  262.           <li><a href="http://www.sun.com/">SunOS 4.x</a> does not
  263.           and almost certainly never will have one because it as at
  264.           the very end of its development cycle for Sun. If you
  265.           have kernel source should be easy to patch.</li>
  266.         </ul>
  267.  
  268.         <p>There is a <a href="http://www.apache.org/dist/httpd/contrib/patches/1.2/fin_wait_2.patch">
  269.         patch available</a> for adding a timeout to the FIN_WAIT_2
  270.         state; it was originally intended for BSD/OS, but should be
  271.         adaptable to most systems using BSD networking code. You
  272.         need kernel source code to be able to use it.</p>
  273.  
  274.     
  275.  
  276.     <h3><a name="no_lingering" id="no_lingering">Compile without using
  277.                              <code>lingering_close()</code></a></h3>
  278.  
  279.         <p>It is possible to compile Apache 1.2 without using the
  280.         <code>lingering_close()</code> function. This will result
  281.         in that section of code being similar to that which was in
  282.         1.1. If you do this, be aware that it can cause problems
  283.         with PUTs, POSTs and persistent connections, especially if
  284.         the client uses pipelining. That said, it is no worse than
  285.         on 1.1, and we understand that keeping your server running
  286.         is quite important.</p>
  287.  
  288.         <p>To compile without the <code>lingering_close()</code>
  289.         function, add <code>-DNO_LINGCLOSE</code> to the end of the
  290.         <code>EXTRA_CFLAGS</code> line in your
  291.         <code>Configuration</code> file, rerun
  292.         <code>Configure</code> and rebuild the server.</p>
  293.  
  294.     
  295.  
  296.     <h3><a name="so_linger" id="so_linger">Use <code>SO_LINGER</code> as 
  297.                 an alternative to <code>lingering_close()</code></a></h3>
  298.  
  299.         <p>On most systems, there is an option called
  300.         <code>SO_LINGER</code> that can be set with
  301.         <code>setsockopt(2)</code>. It does something very similar
  302.         to <code>lingering_close()</code>, except that it is broken
  303.         on many systems so that it causes far more problems than
  304.         <code>lingering_close</code>. On some systems, it could
  305.         possibly work better so it may be worth a try if you have
  306.         no other alternatives.</p>
  307.  
  308.         <p>To try it, add <code>-DUSE_SO_LINGER
  309.         -DNO_LINGCLOSE</code> to the end of the
  310.         <code>EXTRA_CFLAGS</code> line in your
  311.         <code>Configuration</code> file, rerun
  312.         <code>Configure</code> and rebuild the server.</p>
  313.  
  314.         <div class="note"><h3>NOTE</h3>Attempting to use
  315.         <code>SO_LINGER</code> and <code>lingering_close()</code>
  316.         at the same time is very likely to do very bad things, so
  317.         don't.</div>
  318.  
  319.     
  320.  
  321.     <h3><a name="increase_mem" id="increase_mem">Increase the amount of memory 
  322.                            used for storing connection state</a></h3>
  323.  
  324.         <dl>
  325.           <dt>BSD based networking code:</dt>
  326.  
  327.           <dd>
  328.             BSD stores network data, such as connection states, in
  329.             something called an mbuf. When you get so many
  330.             connections that the kernel does not have enough mbufs
  331.             to put them all in, your kernel will likely crash. You
  332.             can reduce the effects of the problem by increasing the
  333.             number of mbufs that are available; this will not
  334.             prevent the problem, it will just make the server go
  335.             longer before crashing. 
  336.  
  337.             <p>The exact way to increase them may depend on your
  338.             OS; look for some reference to the number of "mbufs" or
  339.             "mbuf clusters". On many systems, this can be done by
  340.             adding the line <code>NMBCLUSTERS="n"</code>, where
  341.             <code>n</code> is the number of mbuf clusters you want
  342.             to your kernel config file and rebuilding your
  343.             kernel.</p>
  344.           </dd>
  345.         </dl>
  346.  
  347.     
  348.  
  349.     <h3><a name="disable" id="disable">Disable KeepAlive</a></h3>
  350.  
  351.         <p>If you are unable to do any of the above then you
  352.         should, as a last resort, disable KeepAlive. Edit your
  353.         httpd.conf and change "KeepAlive On" to "KeepAlive
  354.         Off".</p>
  355.  
  356.     
  357.   </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
  358. <div class="section">
  359. <h2><a name="appendix" id="appendix">Appendix</a></h2>
  360.  
  361.    <p>Below is a message from Roy Fielding, one of the authors
  362.    of HTTP/1.1.</p>
  363.  
  364.    <h3><a name="message" id="message">Why the lingering close 
  365.                      functionality is necessary with HTTP</a></h3>
  366.  
  367.         <p>The need for a server to linger on a socket after a close
  368.         is noted a couple times in the HTTP specs, but not
  369.         explained. This explanation is based on discussions between
  370.         myself, Henrik Frystyk, Robert S. Thau, Dave Raggett, and
  371.         John C. Mallery in the hallways of MIT while I was at W3C.</p>
  372.  
  373.         <p>If a server closes the input side of the connection
  374.         while the client is sending data (or is planning to send
  375.         data), then the server's TCP stack will signal an RST
  376.         (reset) back to the client. Upon receipt of the RST, the
  377.         client will flush its own incoming TCP buffer back to the
  378.         un-ACKed packet indicated by the RST packet argument. If
  379.         the server has sent a message, usually an error response,
  380.         to the client just before the close, and the client
  381.         receives the RST packet before its application code has
  382.         read the error message from its incoming TCP buffer and
  383.         before the server has received the ACK sent by the client
  384.         upon receipt of that buffer, then the RST will flush the
  385.         error message before the client application has a chance to
  386.         see it. The result is that the client is left thinking that
  387.         the connection failed for no apparent reason.</p>
  388.  
  389.         <p>There are two conditions under which this is likely to
  390.         occur:</p>
  391.  
  392.         <ol>
  393.           <li>sending POST or PUT data without proper
  394.           authorization</li>
  395.  
  396.           <li>sending multiple requests before each response
  397.           (pipelining) and one of the middle requests resulting in
  398.           an error or other break-the-connection result.</li>
  399.         </ol>
  400.  
  401.         <p>The solution in all cases is to send the response, close
  402.         only the write half of the connection (what shutdown is
  403.         supposed to do), and continue reading on the socket until
  404.         it is either closed by the client (signifying it has
  405.         finally read the response) or a timeout occurs. That is
  406.         what the kernel is supposed to do if SO_LINGER is set.
  407.         Unfortunately, SO_LINGER has no effect on some systems; on
  408.         some other systems, it does not have its own timeout and
  409.         thus the TCP memory segments just pile-up until the next
  410.         reboot (planned or not).</p>
  411.  
  412.         <p>Please note that simply removing the linger code will
  413.         not solve the problem -- it only moves it to a different
  414.         and much harder one to detect.</p>
  415.     
  416.   </div></div>
  417. <div class="bottomlang">
  418. <p><span>Available Languages: </span><a href="../en/misc/fin_wait_2.html" title="English"> en </a></p>
  419. </div><div id="footer">
  420. <p class="apache">Copyright 1999-2004 The Apache Software Foundation.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
  421. <p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="../faq/">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p></div>
  422. </body></html>