在基礎架構部沉浸了半年,有一些認知重新整理想和童靴們交代一下, 不一定全面,僅代表此時的認知, 也歡迎筒靴們提出看法。
本文聊一聊口嗨用語:“長連接配接、短連接配接”, 文章會按照下面的思維導圖來講述:
重點圍繞這兩個難點/思維誤區來整理知識體系。
長連接配接 vs 短連接配接
Http1.1持久連接配接 vs WebSocket長連接配接
<code>長連接配接</code>是指一個連接配接上連續發送多個資料包。
<code>短連接配接</code>是指雙方要資料互動時,建立一個連接配接,資料發送完畢,則斷開連接配接,即每次連接配接隻完成一個單元的業務傳輸,有需要再建立新連接配接傳輸資料。
實際上長短連接配接都是針對TCP連接配接而言的,強調的是應用層對下層TCP連接配接的使用姿勢,采用哪種連接配接由應用根據自身情況決定。
<code>長連接配接</code>多用于操作頻繁、點對點的通信,而且連接配接數不能太多的情況。每次TCP連接配接都需要三次握手,這需要時間,如果每個操作都是短連接配接,再操作的話那麼處理速度會降低很多,是以每次操作完後都不斷開,下次處理時直接發送資料包就OK了,不用建立TCP連接配接。例如:資料庫的連接配接用長連接配接,如果用短連接配接頻繁的通信會造成socket錯誤,而且頻繁的socket 建立也是對資源的浪費。
而正常web網站一般都是短連接配接,這是由web站點的特征決定,web站點的用戶端數量大、通路時間/頻次不固定,采用短連接配接能節省伺服器資源;如果用戶端都維持長連接配接,可想而知,會占用多大的伺服器資源, 是以并發量大,但每個使用者無需頻繁操作的時候使用短連接配接較好。
早期HTTP1.0是純粹的TCP短連接配接的應用,每個連接配接完成一次Http請求/響應模型,這種方式頻繁的建立/銷毀連接配接無疑是有一定性能損耗的。
目前普遍應用的HTTP1.1的Keep-alive官方術語上叫持久連接配接(英語:HTTP persistent connection,也稱作HTTP keep-alive或HTTP connection reuse),國内口嗨稱為“HTTP長連接配接”。
HTTP1.1<code>keep-alive</code>,我認為是應用層HTTP協定對于TCP連接配接的折中使用,是在應用層對下層TCP連接配接的協商使用,這種協商以用戶端/服務端的<code>Connection:Keep-alive</code>标頭展現。
Http1.0 頻繁建立/銷毀連接配接确實給通信雙方帶來了不必要的性能損耗 #不必要#
直接使用典型的長連接配接又會給服務端帶來極大的壓力 #不允許#
故HTTP1.1的<code>keep-alive</code>一方面允許多個HTTP請求複用一個TCP連接配接, 另一方面又将這種複用時效交由用戶端/服務端在應用層協商:應用層每次請求/響應均攜帶Connection标頭滑動續約來展現。
HTTP 1.1 Keep-Alive的實質是應用層滑動續約複用TCP連接配接?

根據一些官方文檔,無論是用戶端、還是服務端,均有等待TCP連接配接活躍的逾時時間,
用戶端IE預設的KeepAliveTimeout是1分鐘;
伺服器IIS預設ConnectionTimeout時長2min
伺服器ASP.NetCore Kestrel預設的KeepAliveTimeout=130s
伺服器nginx預設的keepalive_timeout=60s
這裡面明眼人一看,1.2.4針對TCP Connection複用的滑動逾時時間是拍腦袋決定的,而第3點ASP.NET Core Kestrel作為.NETCore的寄宿伺服器為什麼是130s, 是不是有點意思。
我給你們找出來了, KestrelServerLimits.KeepAliveTimeout=130s
WebSocket是一種典型的長連接配接,通過第一個HTTP Request建立了TCP連接配接之後,之後資料互動都不需要發送HTTP Request了,但是不需要發送 HTTP header就能交換資料顯然和原有的 HTTP 協定是有差別的,是以它需要對伺服器和用戶端都進行更新才能實作,這個協商是在Websocket資料傳輸之前就已經完成。
WebSocket也有Keepalive機制,WebSocket的Keep-alive的作用是在複雜的網絡環境中探測連接配接的對端是否還存活。
長短連接配接都是針對TCP連接配接而言,強調的是應用層對于TCP連接配接的使用姿勢。
HTTP1.1 Keep-alive是對TCP連接配接的折中使用,既不是短連接配接,也不能稱為典型的長連接配接。
HTTP1.1 Keep-alive官方稱持久連接配接,我的觀點是HTTP1.1 Keep-Alive 是在應用層對TCP連接配接進行滑動續約複用。
典型的長連接配接WebSocket在資料傳輸之前就完成了長連接配接确認。
本文來自部落格園,作者:{有态度的馬甲},轉載請注明原文連結:https://www.cnblogs.com/JulianHuang/p/15564481.html
歡迎關注我的原創技術、職場公衆号, 加好友談天說地,一起進化