前面一篇文章提到,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头设置超时时间的做法已经不再有效。

关于HTTP keep-alive的实验(转至 http://my.oschina.net/flashsword/blog/80037)的更多相关文章

  1. LAMP平台搭建菜鸟入门级实验

    LAMP平台搭建(菜鸟入门级) mysql 安装: (1)二进制安装  二进制安装 ,执行解压配置即可.无须执行三布安装. (2)源码编译安装 安装准备工作: (1)查看系统配置:#uname -a/ ...

  2. cas 单点登录(SSO)实验之二: cas-client

    cas 单点登录(SSO)实验之二: cas-client 参考文章: http://my.oschina.net/indestiny/blog/200768#comments http://wenk ...

  3. 转】MongoDB主从复制实验 master/slave

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/4/ 感谢! Posted: May 31, 2013 Ta ...

  4. SEED缓冲区溢出实验笔记

    缓冲区溢出实验(Linux 32位) 参考教程与材料:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Buffer_Overflow/ (本 ...

  5. 关于ucore实验一的资料查找

    任务:阅读实验一makefile 搞清楚ucore.img是如何构建的 $@  $<  $^  这三个变量分别是什么意思 https://blog.csdn.net/YEYUANGEN/arti ...

  6. Spring Cloud微服务开发笔记5——Ribbon负载均衡策略规则定制

    上一篇文章单独介绍了Ribbon框架的使用,及其如何实现客户端对服务访问的负载均衡,但只是单独从Ribbon框架实现,没有涉及spring cloud.本文着力介绍Ribbon的负载均衡机制,下一篇文 ...

  7. 从linux源码看socket(tcp)的timeout

    从linux源码看socket(tcp)的timeout 前言 网络编程中超时时间是一个重要但又容易被忽略的问题,对其的设置需要仔细斟酌.在经历了数次物理机宕机之后,笔者详细的考察了在网络编程(tcp ...

  8. 转载文章——从HelloWorld学习操作系统

    转载地址:https://my.oschina.net/hosee/blog/673628?p=%7b%7bcurrentPage+1%7d%7d 本文就将系统性的串联起那些知识点,方便复习和回顾.本 ...

  9. 分布式一致性算法--Paxos

    Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法.Paxos算法解决的问题是一个分布式系统如何就某个值(决议)达成一致.在工程实践意义上来说, ...

随机推荐

  1. 江南白衣 Java性能优化PPT

    会后江南白衣花费数日整理PPT,到1.4版本共66页,内容翔实且旁征博引,不断校正且力求做到极致的匠艺精神值得尊敬! 技术大牛飒然Hang如是说到: “技术大神中,除了陈皓就是白衣了,四十岁还能钻研. ...

  2. css常用标签及属性

    css样式表常用的形式有三种,一.行内样式表.二.内部样式表.三.外部样式表 一. <p style="color:red;">nice to meet you< ...

  3. java Webservice(一)HttpClient使用(二)

    HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.虽然在 JDK 的 java.net 包中已经提供了 ...

  4. 【Android】20.0 第20章 音频、视频、拍照、语音合成

    分类:C#.Android.VS2015: 创建日期:2016-03-11 一.简介 Android提供了常见的多媒体文件编码.解码机制,你可以直接调用Android提供的API,实现相册.播放器.录 ...

  5. jdk初始安装配置

    Eclipse 3.7:http://www.eclipse.org/downloads/ JDK 6:http://www.oracle.com/technetwork/java/javase/do ...

  6. Oracle PLSQL Demo - 03.流程判断[IF ELEIF ELSE]

    declare v_job ) := 'Programmer'; v_sal number; begin if v_job = 'Programmer' then v_sal :; elsif v_j ...

  7. Ubuntu 12.04下mysql的安装与配置

    转自:http://blog.csdn.net/ichsonx/article/details/9285935 准备  0. 获取 mysql-5.5.15-linux2.6-i686.tar.gz ...

  8. Logstash5.3借助临时字段修改@timestamp为北京时间,方便按天生成output文件

    $more config/first-pipeline.conf input { beats { port => " } } filter { if [type] == "s ...

  9. 深入浅出c++之---this指针

    前言:C语言中的数组指针和指针数组 数组指针,是指向数组的指针的缩写:指针数组,是存放指针的数组的缩写.其实很多时候,往往因为简写和缩写带给我们很多困惑.我曾想过不用简称去学习,但在很多时候,我们查询 ...

  10. c#的static什么时候使用

    C# 什么时候用static? 2011-10-14 14:37江户川奈叶 | 浏览 1733 次  Perl 在static void Main()的方法外面设一个 static int amoun ...