关于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 {

                                        

     @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),码迷,mamicode.com

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

时间: 2024-10-05 07:10:58

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

SEED缓冲区溢出实验笔记

缓冲区溢出实验(Linux 32位) 参考教程与材料:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Buffer_Overflow/ (本文记录了做SEED缓冲区溢出实验的体会与问题,侧重实践,而不是讲解缓冲区溢出原理的详细教程) 1. 准备工作 使用SEED ubuntu虚拟机进行缓冲区溢出实验,首先要关闭一些针对此攻击的防御机制来简化实验. (1)内存地址随机化(Address Space Randomization):基于Lin

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

cas 单点登录(SSO)实验之二: cas-client 參考文章: http://my.oschina.net/indestiny/blog/200768#comments http://wenku.baidu.com/view/0bcc0d01e87101f69e319595.html 接上一篇文章: cas 单点登录(SSO)实验之中的一个: jasig cas-server 安装 本文说明怎样写一个web服务(cas-study).使用cas-server提供的验证服务.当用户訪问这个

lamp实验作业详细过程

1.请描述一次完整的http请求处理过程:由客户端发起请求给服务端,服务端接收到请求后解析http报文内容,把处理完成后的内容反馈给客户端,再将每次请求记录在日志中.2.httpd所支持的处理模型有哪些,他们的分别使用于哪些环境.prefork:多进程模型,一个进程响应一个请求:worker:多进程多线程模型,一个线程响应一个请求:event:事件驱动模型,一个进程响应n个请求:3.源码编译安装LAMP环境(基于wordpress程序),并写出详细的安装.配置.测试过程.一.编译安装httpd2

挂载宿主机共享文件实验

挂载宿主机共享文件实验 本实验的目的是挂载Windows中的共享文件夹,然后在虚拟机的Linux中使用.该实验分为被挂载端和挂载端,被挂载端就是Windows(服务器端),挂载端是Linux(客户端).Windows要做的就是共享Everyone文件夹,解禁Guest,设置本地策略.Linux要做的就是扫描Windows中的共享文件夹并进行挂载.接下来进行实验: 匿名共享首先我们可以在自己的电脑里新建一个空的文件夹(不是空的也可以),在这里我用的是en_visio2016这个文件夹(该文件夹里是

关于ucore实验一的资料查找

任务:阅读实验一makefile 搞清楚ucore.img是如何构建的 [email protected]  $<  $^  这三个变量分别是什么意思 https://blog.csdn.net/YEYUANGEN/article/details/36898505 =和:=的区别 https://stackoverflow.com/questions/448910/what-is-the-difference-between-the-gnu-makefile-variable-assignmen

dns搭建及实验

DNS服务器的搭建及实验一.DNS全程是域名解析系统简单的解释为域名地址经过DNS服务器解析后,得到对应的IP地址,通过该IP地址访问到服务器获取我们要访问的内容.二.DNS服务器的搭建Server2016一台具体步骤如下图:三.实验1.实验背景同一网址同一端口号前提下通过DNS域名解析增加多个ftp站点并实现访问(注意web网页只能一个ip地址对应一个网站不可以用dns解析)2.先建指定用户3.再新建主机名4.通过filezilla软件访问server2016上test-a.test-b.te

实验:实现ineternet dns架构

前期准备:我使用的是192.168.141.xx网段,centos6做localdns,centos7做www.magedu.com,需要7台机器,分别是:client,ldns,rootdns,comdns,magedumasterdns,mageduslavedns,webserver(www.magedu.com)A.搭建centos7的网站并编辑各部分的IP地址:[root@centos7 ~]# yum install httpd[root@centos7 ~]# vim /var/w

GNS3实验环境优化与安装

GNS3概述 GNS3是一款具有图形化界面可以运行在多平台(包括Windows, Linux, and MacOS等)的网络虚拟软件.Cisco网络设备管理员或是想要通过CCNA,CCNP,CCIE等Cisco认证考试的相关人士可以通过它来完成相关的实验模拟操作.同时它也可以用于虚拟体验Cisco网际操作系统IOS或者是检验将要在真实的路由器上部署实施的相关配置. 一.安装实验环境 软件安装详细过程:https://blog.51cto.com/14307755/2426131 --------

LVM逻辑卷(理论实验结合学习更高效!)

本章和大家分享的是Linux系统中LVM逻辑卷的相关内容,接下来我们会从以下几个内容中进行详细说明:1.LVM概述2.LVM的管理命令3.LVM应用实例 LVM概述:Logical Volume Manager,逻辑卷管理:1.动态调整磁盘容量,从而提高磁盘管理的灵活性2./boot分区用于存放引导文件,不能基于LVM创建3.图形界面管理工具:system-config-lvm LVM机制的基本概念:1.PV(物理卷)最基本的结构单元2.VG(卷组)3.LV(逻辑卷) 主要命令: 功能 物理卷管