关于HTTP keep-alive的实验

转载:http://www.cnblogs.com/kobe8/p/3702071.html

前面一篇文章提到,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无效

   总结:

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值