定义tomcat
Http/1.0每次请求都须要创建新的TCP链接,链接不能复用。Http/1.1新的请求能够在上次创建的tcp链接之上发送,链接能够复用。服务器
优势多线程
减小重复进行tcp三次握手的开销,提升效率。注意:在同一个tcp链接中,新的请求须要等上次请求收到响应后,才能发送。socket
实现tcp
本身写了一个http下载页面的工具,url是以文件的形式批量的进行下载的。支持链接复用下载。工具
主要的思路测试
在发送http的请求头中设置Connection: keep-alive。url
当前的url与上一次下载的url之间进行对比,若是host相同的话,则用上一次的socket_id。不然关闭上一次的socket,从新链接服务器,获取新的socket。因此,url的文件,须要进行排序,将同一个站点的url放在一块儿便可。spa
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 链接复用
关于我:成长的企鹅简介