Hello everyone,

It could be that I've identified a bug in Apache that prevents large
files from being downloaded successfully when a 'lower than default'
Timeout setting is used in httpd.conf. Per the standard bug guidelines
I'd like to check on the list first to see whether someone else has
experienced similar issues.

A roundup of the issue:

- We publish the following file:

115120550 (size) May 22 17:21 Syllable-0.6.1-dev4.zip

When this file is downloaded, the download halts intermediately, at
around 24 MB. From the point of view of the server, it looks like the
download completed succesfully. This is the same on the client side.

This was tested and identified as an issue with Apache 1.3.24, 2.0.58
(both with added modules) and Apache 2.2.2 (clean install per bug
reporting requirements, no additional modules). This was on the same
server, running RedHat 7.1 with Apache installed from source. A test
with another Apache 2.0.58 on a separate server showed the same issue,
but at a different point in the download.

This interruption occurred on one server after approximately 7 minutes,
when the transfer had completed 24 MB. On the other server I tested,
this happened after 9 minutes, with a 20 MB completion rate. Downloads
from faster connections (less than 6 minutes of transfer time) went
smoothly and without interruption.

The issue only occurs when the Timeout parameter in httpd.conf is
lowered from its default of 300 seconds to 60 seconds. Note that this is
a common change, made to either improve performance or mitigate the
impact of certain types of denial of service attacks against the server.
When changing the value back to its default of 300 seconds the download
does complete correctly.

No entry appears in the error log, but a regular 200 request appears in
the access_log:

203.59.90.155 - - [16/Jun/2006:08:19:14 +0000] "GET
/Syllable-0.6.1-dev4.zip HTTP/1.1" 200 115120550

This was tested with Firefox, Internet Explorer and Wget, which all gave
identical results (with wget automatically retrying using a specified
byte-range so it did in fact complete the download).

Apache documentation mentions that Timeout defines the amount of time
Apache will wait for any of the following three things:

- The total amount of time it takes to receive a GET request.
- The amount of time between receipt of TCP packets on a POST or PUT
request.
- The amount of time between ACKs on transmissions of TCP packets in
responses.

I've made a PCAP file of an interrupted transfer:

http://www.daemon.be/apache-failed-down.cap

If you look at this file you can see that everything seems to go fine,
and then suddenly at frame 25947, 7.35 minutes after the connection was
established, the Apache server suddenly sends a packet with the fin,
push and ack flags set. This disrupts the connection.

As such, none of the above conditions apply: (1) a GET request was
received and is being served, (2) I don't really see any of both parties
in the transaction being unresponsive. This shouldn't match the Timeout
value. It appears somewhere in the download code the counter used to
measure this timeout isn't being increased.

If you have issues replicating it with a different file, the original
which caused us issues for quite a while prior us discovering the link
with the Timeout option can be found here:

http://www.cilinder.be/syllable/Syllable-0.6.1-dev4.zip

Looking forward to your responses. If anyone has any ideas before I
create a bug report for this issue, please let me know.

Cheers,
Maarten

-- 
Maarten Van Horenbeeck, CISSP GCIA GCIH
[EMAIL PROTECTED] - http://www.daemon.be/maarten

---------------------------------------------------------------------
The official User-To-User support forum of the Apache HTTP Server Project.
See <URL:http://httpd.apache.org/userslist.html> for more info.
To unsubscribe, e-mail: [EMAIL PROTECTED]
   "   from the digest: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to