http1.0 http1.1 keepalive (转)
来源:互联网 发布:淘宝直播间在哪里 编辑:程序博客网 时间:2024/04/26 17:00
近日发现系统的测试环境在外网无法访问的问题,经查找,原来问题出现在反向代理squid2.6中,请求经过反向代理后,由于squid2.6用的是HTTP1.0,所以KeepAlive就变成了close状态,导致连接无法保持。鉴于此,查找了一下KeepAlive在HTTP1.0和HTTP1.1中的差异。
1、背景
KeepAlive是就是通常所称的长连接。KeepAlive带来的好处是可以减少tcp连接的开销,这对于短response body的请求效果更加明显。同时,可以为采用HTTP协议的交互式应用提供良好的session支持。
HAPxoxy作为一款开源的LoadBalance,其最新的1.3.22(Stable版本)不能支持KeepAlive。(其中自从1.4.dev5开始也支持Client端的KeepAlive)
2、KeepAlive的原理
在HTTP1.0和HTTP1.1协议中都有对KeepAlive的支持。其中HTTP1.0需要在request中增加”Connection: keep-alive“ header才能够支持,而HTTP1.1默认支持。
HTTP1.0 KeepAlive支持的数据交互流程如下:
a)Client发出request,其中该request的HTTP版本号为1.0。同是在request中包含一个header:”Connection: keep-alive“。
b)Web Server收到request中的HTTP协议为1.0及”Connection: keep-alive“就认为是一个长连接请求,其将在response的header中也增加”Connection: keep-alive“。同是不会关闭已建立的tcp连接。
c)Client收到Web Server的response中包含”Connection: keep-alive“,就认为是一个长连接,不close tcp连接。并用该tcp连接再发送request。(跳转到a))
HTTP1.1 KeepAlive支持的数据交互流程如下:
a)Client发出request,其中该request的HTTP版本号为1.1。
b)Web Server收到request中的HTTP协议为1.1就认为是一个长连接请求,其将在response的header中也增加”Connection: keep-alive“。同是不会关闭已建立的tcp连接。
c)Client收到Web Server的response中包含”Connection: keep-alive“,就认为是一个长连接,不close tcp连接。并用该tcp连接再发送request。(跳转到a))
3、Patch实现思路
HAProxy client KeepAlive支持的patch主要解决三个问题:
a)”Connection: keep-alive“ header处理问题
参见KeepAlive的原理,client KeepAlive对于这个header的处理是在对开启client KeepAlive的frontend上经过的response中增加”Connection: keep-alive“ header;
b)怎么处理重新触发client发过来的request的时机问题
从KeepAlive的原理中可以得知,next request是在完成before request的response被client接收的情况下才发出。因此需要在向client写完before request的response后才能触发。而写完response可以通过计算response中body的长度信息得到(Content-Length或者Chunk信息)
c)怎么触发NOT_FIRST request
在Haproxy中对于对于连接的管理是通过session这个数据结构来实现的。触发NOT_FIRST request就通过重置session这个数据结构来实现。
4、Patch的配置方式
配置方式为在每个Proxy的Front中配置添加:
option cli_keepalive
5、patch代码
附件为基于该版本的Client KeepAlive Patch。
该Patch只支持Client端的KeepAlive。
本文出自 51CTO.COM技术博客- http1.0 http1.1 keepalive (转)
- http1.0 http1.1 keepalive
- http1.0 http1.1 keepalive
- http1.0 http1.1 keepalive
- http1.0与http1.1的区别(转)
- HTTP1.0和HTTP1.1
- HTTP1.0和HTTP1.1 .
- Http1.1与Http1.0
- http1.0与http1.1
- HTTP1.0 vs HTTP1.1
- http1.0与http1.1
- HTTP1.0 VS HTTP1.1
- Http1.0和http1.1
- HTTP基本原理(http1.0与http1.1之区别)
- HTTP基本原理(http1.0与http1.1之区别)
- http1.0与http1.1 的区别
- HTTP1.0和HTTP1.1的区别
- HTTP1.0和HTTP1.1的区别
- 静态库和动态库转两篇文章
- ubuntu修改swap交换分区大小
- 图片搜索
- 规范化的C++编程方法备忘录 程序流程(3)
- 清洗衣服,整理内存
- http1.0 http1.1 keepalive (转)
- Mysql5.1中主要使用的几种表引擎?它们的区别是什么?在使用表引擎时,要注意什么问题?
- 把握机会,希望与信心并存
- linux下挂载iso文件
- Cassandra数据模型
- up and running with cassandra
- 汉诺塔与二叉树
- 女生与操作系统
- FreeMarker 自定义方法