博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于HTTP keep-alive的实验
阅读量:6258 次
发布时间:2019-06-22

本文共 2181 字,大约阅读时间需要 7 分钟。

hot3.png

   前面一篇文章提到,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
 
*
 
* yihua.huang
 
*
 
*/
public
class
TestHttpClient {
                                         
    
    
public
void
testHeader() {
        
HttpClient httpClient =
new
HttpClient(
new
SimpleHttpConnectionManager(
true
));
        
httpClient.getHttpConnectionManager().getParams().setSoTimeout(
5000
);
        
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(
5000
);
        
GetMethod get =
new
GetMethod(
""
);
        
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(
""
);
        
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头。

   

 27074230_0fsu.jpeg

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

27074230_aUSk.jpeg

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

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

27074230_Eslg.jpeg

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

   总结:

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

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

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

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

转载于:https://my.oschina.net/flashsword/blog/80037

你可能感兴趣的文章
Mongodb(2)创建数据库,删除数据库,创建集合,删除集合,显示文档内容
查看>>
Tomcat禁止显示目录和文件列表
查看>>
linux mmap 详解【转】
查看>>
注释中不允许出现字符串 "--"。
查看>>
client 如何找到正确的RegionServer(HBase -ROOT-和.META.表)
查看>>
协议森林16 小美的桌号(DHCP协议)
查看>>
简单的ajax封装
查看>>
PHP初学者必须掌握的10个知识点
查看>>
[Asp.Net]获取客户端ip和mac地址
查看>>
Arcengine设置坐标系(转载)
查看>>
php字符串操作集锦
查看>>
【WPF】C#代码动态改变控件的样式
查看>>
P1115 最大子段和
查看>>
【翻译自mos文章】检查$ORACLE_HOME是否是RAC的HOME的方法以及relink RAC的Oracle binary的方法...
查看>>
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
查看>>
php max_execution_time执行时间问题
查看>>
Hystrix系列-5-Hystrix的资源隔离策略
查看>>
005-ant design -结合echart
查看>>
TCP交互数据流 成块数据流
查看>>
位置+推荐
查看>>