Apache Timeout,apachetimeout


timeout官方解析
http://httpd.apache.org/docs/2.2/mod/core.html#timeout
我的理解是这个超时参数只是前后两次tcp传输包的间隔,如果大于这个间隔,apache就主动关闭tcp连接.
(中文文档翻译有出入,被坑爹了)
-------------------------------------------------------------------------
httpd.conf设置:
Timeout 10

(1)测试原理:写个脚本与apache三次握手建立tcp连接之后,发送一个不完整的http GET请求,也就是最后的一个"\r\n"不传送,然后每隔5秒发送一个垃圾包.
测试结果:该apache线程一直被这个连接hold住,在大致过了2分钟才返回400错误(Size of a request header field exceeds server limit),断开tcp连接.
注意:这儿返回400是 LimitRequestFieldSize 这个参数的作用,这个参数默认为 8k,表示最多能接收的request header的大小,因为我一直在发垃圾包,所以最终导致request header大于了这个默认值,apache返回了400.(这儿的响应时间跟包的流量有关)

(2)测试方法同(1),不过间隔时间改为 15s 发送一个包,大于timetout的设置.
测试结果:该apache线程10s后就返回了400错误,断开tcp连接. 响应时间与设置的timeout值相同.

结论:
(1)timeout并不是接受一个GET请求耗费的总时间,而只是指两个tcp包之间的超时时间.
(2)如果客户端以小于timeout的时间间隔一直发错误包,这个apache线程将被一直hold住,直到LimitRequestFieldSize所指大小.   测试代码
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use Socket;
  4. use IO::Handle;
  5. use threads;
  6. sub connect {
  7.     my $host = '172.23.181.160';
  8.     my $port = '80';
  9.     my $protocol = getprotobyname('TCP');
  10.     $host = inet_aton($host);
  11.     socket(SOCK, AF_INET, SOCK_STREAM, $protocol) or die ;
  12.     my $dest_addr = sockaddr_in($port, $host);
  13.     connect(SOCK, $dest_addr) or die;
  14.     SOCK->autoflush(1);
  15. # print SOCK "POST /member/login.jhtml HTTP/1.1\r\nHost:login.taobao.com\r\nContent-Length: 100\r\n\r\n";
  16.     print SOCK "GET /member/login.jhtml HTTP/1.1\r\nHost:login.taobao.com\r\n";
  17.     while (1) {
  18.          print SOCK "hello world!";
  19.          sleep(5);
  20.     }
  21.     close SOCK;
  22. }
  23. my $child = 0;
  24. for ( my $i = 0; $i< 1; $i++) {
  25.           $child = threads->new(\&connect);
  26. }
  27. $child->join;
转载:http://blog.chinaunix.net/uid-20767124-id-3013076.html

相关内容

    暂无相关文章