原來:HTTP可以復用TCP連接


問題

線上的一個項目會和微信服務器有API請求(目的是獲取用戶的微信信息),但會有偶發的報錯:

'Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))

原因是微信那邊認為我頻繁建立TCP連接是不對,很消耗他們的連接資源,所以把我的連接中斷了。

 

概念

HTTP 的header里有一個“Keep-Alive”參數,用來告知服務器:我想要保存此次連接,我稍后還會請求,這樣我們可以避免再次TCP三次握手。

python的requests庫為我們提供了session來實現“Keep-Alive”,引入一段官方文檔介紹:

The Session object allows you to persist certain parameters across requests. It also persists cookies across all requests made from the Session instance, and will use urllib3’s connection pooling. So if you’re making several requests to the same host, the underlying TCP connection will be reused, which can result in a significant performance increase (see HTTP persistent connection).

 

結果

我使用requests庫的session來管理我和微信服務器間的請求,確實再也沒有過上面的報錯。

 

擴展

保持存活(Keep Alive)不僅僅是HTTP中的概念,TCP中也有。不追究實現原理,單是它們所想達到的目的也是不同的:

  HTTP中叫做“Keep-Alive”, 是為了連接復用,即減少多余的TCP請求

  TCP中叫做“KeepAlive”,是為了保證連接是健康的,如即時通訊技術需要用到

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM