关于HTTP keepalive的实验 黄亿华的个人页面 开源中国社区

关于HTTP keep-alive的实验 - 黄亿华的个人页面 - 开源中国社区

    关于HTTP keep-alive的实验
    2人收藏此文章, 我要收藏 发表于6个月前(2012-09-24 11:25) , 已有514次阅读 ,共1个评论
       前面一篇文章提到,HTTP1.1中持久连接已经是默认配置,除非设置Connection为close,否则默认都会进行持久连接。但是我们知道事实标准跟教科书还是可能会有一定差距的,所以不妨自己尝试一下。

       我们知道,TCP建立连接时会进行三次握手,而握手是以一方发送一个SYN为开始的。下载抓包工具Wireshark之后,进行抓包调试。在Java里实现了一段模拟请求的代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
       
    package test;
                                            
    import java.io.IOException;
                                            
    import org.apache.commons.httpclient.HttpClient;
    import org.apache.commons.httpclient.HttpException;
    import org.apache.commons.httpclient.SimpleHttpConnectionManager;
    import org.apache.commons.httpclient.methods.GetMethod;
    import org.junit.Test;
                                            
    /**
      * TODO Comment of TestHttpClient
      *
      * @author yihua.huang
      *
      */
    public class TestHttpClient {
                                            
         @Test
         public void testHeader() {
             HttpClient httpClient = new HttpClient( new SimpleHttpConnectionManager( true ));
             httpClient.getHttpConnectionManager().getParams().setSoTimeout( 5000 );
             httpClient.getHttpConnectionManager().getParams().setConnectionTimeout( 5000 );
             GetMethod get = new GetMethod( "http://www.dianping.com" );
             try {
                 httpClient.executeMethod(get);
             } catch (HttpException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             } catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
             try {
                 Thread.sleep( 10000 );
             } catch (InterruptedException e1) {
                 // TODO Auto-generated catch block
                 e1.printStackTrace();
             }
             get = new GetMethod( "http://www.dianping.com" );
             get.setRequestHeader( "Connection" , "keep-alive" );
             try {
                 httpClient.executeMethod(get);
             } catch (HttpException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             } catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
         }
                                            
    }

       请求结果如下。可以看到,图一中共有两次HTTP请求,但是只建立了一次TCP连接,说明持久连接是有效的。而等到10秒之后(代码40行开始)的HTTP请求,又会重新建立连接,证明keep-alive已经过了超时时间。然后在头中加入Keep-Alive: 300,结果第二次请求仍然会重新连接,证明服务器端对于Keep-alive超时进行了配置,并不接受Keep-Alive: 300头。

      

    

    图1 第一次请求,keep-alive生效

    图2 10秒后第二次请求,keep-alive过期

       然后我们将Connection头设置为close,重试。发现确实建立了两次TCP连接。

    图3 设置Connection:close后,keep-alive无效

       总结:

        Keep-alive只是HTTP1.0时代对持久化连接的叫法,目前HTTP1.1已经默认所有请求都是持久化的,RFC规范是正确的。

        头部不设置Connection: keep-alive,依然会进行持久化连接。

        如果设置Connection:close,则不进行持久化连接。

        目前连接过期时间在服务端设置,Keep-Alive头设置超时时间的做法已经不再有效。

原文地址:https://www.cnblogs.com/lexus/p/2991305.html