关于HTTP keep-alive的实验(转至 http://my.oschina.net/flashsword/blog/80037)
前面一篇文章提到,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 { public void testHeader() { HttpClient httpClient = new HttpClient( new SimpleHttpConnectionManager( true )); httpClient.getHttpConnectionManager().getParams().setSoTimeout( 5000 ); httpClient.getHttpConnectionManager().getParams().setConnectionTimeout( 5000 ); 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.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头设置超时时间的做法已经不再有效。
关于HTTP keep-alive的实验(转至 http://my.oschina.net/flashsword/blog/80037)的更多相关文章
- LAMP平台搭建菜鸟入门级实验
LAMP平台搭建(菜鸟入门级) mysql 安装: (1)二进制安装 二进制安装 ,执行解压配置即可.无须执行三布安装. (2)源码编译安装 安装准备工作: (1)查看系统配置:#uname -a/ ...
- cas 单点登录(SSO)实验之二: cas-client
cas 单点登录(SSO)实验之二: cas-client 参考文章: http://my.oschina.net/indestiny/blog/200768#comments http://wenk ...
- 转】MongoDB主从复制实验 master/slave
原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/4/ 感谢! Posted: May 31, 2013 Ta ...
- SEED缓冲区溢出实验笔记
缓冲区溢出实验(Linux 32位) 参考教程与材料:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Buffer_Overflow/ (本 ...
- 关于ucore实验一的资料查找
任务:阅读实验一makefile 搞清楚ucore.img是如何构建的 $@ $< $^ 这三个变量分别是什么意思 https://blog.csdn.net/YEYUANGEN/arti ...
- Spring Cloud微服务开发笔记5——Ribbon负载均衡策略规则定制
上一篇文章单独介绍了Ribbon框架的使用,及其如何实现客户端对服务访问的负载均衡,但只是单独从Ribbon框架实现,没有涉及spring cloud.本文着力介绍Ribbon的负载均衡机制,下一篇文 ...
- 从linux源码看socket(tcp)的timeout
从linux源码看socket(tcp)的timeout 前言 网络编程中超时时间是一个重要但又容易被忽略的问题,对其的设置需要仔细斟酌.在经历了数次物理机宕机之后,笔者详细的考察了在网络编程(tcp ...
- 转载文章——从HelloWorld学习操作系统
转载地址:https://my.oschina.net/hosee/blog/673628?p=%7b%7bcurrentPage+1%7d%7d 本文就将系统性的串联起那些知识点,方便复习和回顾.本 ...
- 分布式一致性算法--Paxos
Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法.Paxos算法解决的问题是一个分布式系统如何就某个值(决议)达成一致.在工程实践意义上来说, ...
随机推荐
- 使用Spring boot开发RestFul 风格项目PUT/DELETE方法不起作用
在使用Spring boot 开发restful 风格的项目,put.delete方法不起作用,解决办法. 实体类Student @Data public class Student { privat ...
- unity 获得父子节点
与常识不同,unity中获得父子节点需要通过transform.即先获得父/子节点的transform,然后再通过父/子节点的transform获得父/子节点. 获得父节点gameObject: Ga ...
- object-c 获得目录(包括子目录)下所有文件和文件夹路径
void getAllPathNameInDirectory(vector<string>&filePathList,vector<string>&direct ...
- 安装composer slim(php web api micro services)
1. 安装php7 2. 下载 https://getcomposer.org/composer.phar 3. 开启ssh, 在 php.ini中.extension=C:\Program File ...
- [svc][op]LVS+keepalived
lvs是一种负载均衡技术.注意区分负载均衡和高可用的区别. keepalive是lvs的管理工具 ipvsadm也是lvs的管理工具 keepalive借助ipvsadm管理lvs.所以通常说lvs+ ...
- iptables进行DNAT(目标地址转换)
前言:对于Linux服务器而言,一般服务器不会直接提供公网地址给用户访问,服务器在企业防火墙后面,通常只是暴露一个公网给用户,下面已80端口进行实现. 演示环境:VM (1)host: 172.16. ...
- Sqli-LABS通关笔录-8[延时注入]
通过该关卡我学习到了 1.if语句的三目运算符(其实说白了也就是php里的三位运算符) 2.sleep函数 3.substring函数(其实和substr一样) 4.limit的灵活运用 5. Sta ...
- jQuery (一)选择器
上一章开始了jQuery的安装,这一张需要开始学习选择器了,不然不进行选择,就无法使用jQuery提供的库的功能不是. 常用的,就列举这么多吧 <!DOCTYPE html> <ht ...
- plot-sin-02
draw sin 02 设置数据区域的边界线颜色 设置坐标轴的位置 code #!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as ...
- 解决 Plugin with id 'com.github.dcendents.android-maven' not found.
在Android studio中引用第三方库的时候,报这个错. Error:(2, 0) Plugin with id 'com.github.dcendents.android-maven' not ...