关于HTTP keep-alive的实验(转至 http://my.oschina.net/flashsword/blog/80037)
2020-11-19 15:18
我们知道,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头设置超时时间的做法已经不再有效。
上一篇:md5算法的java实现
文章标题:关于HTTP keep-alive的实验(转至 http://my.oschina.net/flashsword/blog/80037)
文章链接:http://soscw.com/essay/21955.html