http 鏈接複用

定義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進行下載,下載成功。

1

服務器端超時關閉測試

用了比較笨的方法,在下載每一個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鏈接複用,最大的難點也就是準確的獲取每一個站點的長鏈接的最大限制時間。超過最大限制時間就必須進行重連,否則會致使請求無反映的狀況。

代碼下載,請看博客

weixin

原創文章,轉載請註明: 轉載自成長的企鵝

本文連接地址: http 鏈接複用

關於我:成長的企鵝簡介

相關文章
相關標籤/搜索