http 连接复用
定义
Http/1.0每次请求都需要建立新的TCP连接,连接不能复用。Http/1.1新的请求可以在上次建立的tcp连接之上发送,连接可以复用。
优点
减少重复进行tcp三次握手的开销,提高效率。注意:在同一个tcp连接中,新的请求需要等上次请求收到响应后,才能发送。
实现
自己写了一个http下载页面的工具,url是以文件的形式批量的进行下载的。支持连接复用下载。
主要的思路
在发送http的请求头中设置Connection: keep-alive。
当前的url与上一次下载的url之间进行对比,如果host相同的话,则用上一次的socket_id。否则关闭上一次的socket,重新连接服务器,获取新的socket。所以,url的文件,需要进行排序,将同一个站点的url放在一起即可。
ps:这里实现的形式比较的简单。复杂一点,可以用一个map,std::map<std::string host,int socket_id>,对host的socket_id进行映射。但是这里需要关注map的<host,socket_id>的失效时间,不能昨天建立的连接一直不关闭,今天仍然在使用,服务器端会有最大的连接时间的限制。例如tomcat中有个 maxKeepAliveRequests属性.默认值是100,该属性表示当同一个连接的请求达到maxKeepAliveRequests的值时会自动断开这个连接. 。多线程的话,还需要关注该socket_id是否正在使用,发送和接收数据。
测试集合
http://news.qq.com/a/20130824/006645.htm
http://news.qq.com/a/20130825/000112.htm
http://news.qq.com/a/20130824/005661.htm
http://view.news.qq.com/intouchtoday/index.htm?2529
http://www.163.com/
测试结果
第二条和第三条url是使用第一条的socket_id进行下载,下载成功。
服务器端超时关闭测试
用了比较笨的方法,在下载每个url中间sleep的方法,来测试长连接关闭的时间,因为本客户端在url下载完之前是不会close(socket_id)的,所以出现连接关闭,应该是服务器端主动关闭的。
测试站点:news.qq.com
当sleep的时间超过30s,tcp连接的状态会从ESTABLISHED变成CLOSE_WAIT。同时用这个socket_id再向服务器端发送数据,也不会收到服务器端的响应。
当sleep的时间为29s,或者小于29s。复用连接下载正常。
由于程序有其他的一些运行的耗时,所以推测news.qq.com的长连接的超时时间是30s。对于长连接来说,超过30s之后,服务器端就会主动断开连接。Http的连接复用也就无法获取结果了。
所以,对于http连接复用,最大的难点也就是准确的获取每个站点的长连接的最大限制时间。超过最大限制时间就必须进行重连,不然会导致请求无反映的情况。
原创文章,转载请注明: 转载自成长的企鹅
本文链接地址: http 连接复用
关于我:成长的企鹅简介
最新文章
- Java面试连环炮问题收集记录贴【JVM方面】
- java基础知识点复习
- Python安装指南
- 每日会议<;第二天>;
- BBOSS框架使用jquery方式传參到后台的时候,要注意的事项
- python .whl文件与.egg文件用法
- 指针 v.s. 引用
- Python基础学习7---异常处理
- Hibernate最简单教程
- 使用CefSharp 在C#用户控件中嵌入Chrome浏览器使用方法
- 编译和解释性语言和python运行方式
- 【Numpy应用】--对于图片处理的机器学习库的应用
- 安装PackageControl
- POJ 2391 Ombrophobic Bovines (二分答案+floyd+最大流)
- PTA8
- Git-用 cherry-pick 挑好看的小樱桃
- linux 开放80端口
- echarts中tooltip提示框位置控制
- 7、zabbix使用进阶(03)
- python中建模分析零息票收益率曲线--复利和连续复利
热门文章
- C++之sort函数
- http://qt-project.org/wiki/Category:Developing_with_Qt::QtWebKit#ff7c0fcd6a31e735a61c001f75426961
- 查看Oracle有哪些表或者视图
- codeforces 464C. Substitutes in Number
- [Python]小笔记-queue
- 运用Python语言编写获取Linux基本系统信息(二):文件系统使用情况获取
- Eclipse中DTD验证导致无法进行代码提示的问题(转)
- 再次复习数据结构:c语言链表的简单操作
- ASP.NET JQuery 随笔-搜索框默认提示
- Android Camera调用过程分析