关于keepalive的解释

Apache配置文件中有三个关于KeepAlive的配置指令:
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15

一般来讲,http请求是一次请求完毕就关闭连接的,但是有些时候,一个apache只有少数的固定的几个或几十个机器频繁的访问,这时,每次访问都重新建立tcp连接,感觉有些无聊,这时就用到KeepAlive的相关设置了:
KeepAlive 为 On,如果http请求头明确说明:Connection:keep-alive ;则一次请求结束后,如果该连接使用的次数没有超过MaxKeepAliveRequests ,服务器并不立即主动断开连接,而是等待KeepAliveTimeout 指定的时间,这时,如果客户端没有再发起http请求,则关闭连接;如果在KeepAliveTimeout时间内,客户端又使用该连接做http请求,则省去了重新建立tcp连接的消耗了。

就上面的设置而言:

———————————-

如果客户端发送http请求头:


Connection:keep-alive

则服务器端相应的http头为:


Keep-Alive: timeout=15, max=100
Connection: Keep-Alive

————————————

如果客户端发送http请求头:


Connection:close

则服务器端响应的http头为:


Connection:close

并且服务器端主动关闭连接

================================================

如果服务器端设置为:KeepAlive Off

则不管客户端的http请求头如何设置,服务器端总是每次连接只处理一个请求,并立即主动关闭,响应的http头为:


Connection:close

———————————————-

下面附一段代码:

<?php
main
();
function 
main() {
    
$host "ljj.com";
    
$port 80;
    
$url "/";
    
$fp fsockopen($host$port ,$errno$errstr10);
    if(
$fp === false) {
        die(
$errstr);
    }
    
$str "GET / HTTP/1.1\nHost: ljj.cn\nConnection:keep-alive\n\n";
    
$i 0;
    while(
$i++ < 3) {
        
$len fputs($fp,$str);
        if(
$len === false) { // 这里这么判断是没有用的,因为如果服务器端单向关闭,该连接没有完全断开,则还是可以写数据的,只是没有响应而已
            
die("fp error\n");
        }
        
$out fread($fp,2048);
        echo 
"$i:$out\n";
    }
    
fclose($fp);
}

?>

这段代码说明了多次请求可以使用同一条连接(在服务器端KeepAlive On的情况下

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据