TCP keepalive 和 http keep-alive 以及心跳保活

HTTP的長連接和短連接本質上是TCP長連接和短連接。

短連接
短連接,顧名思義,與長連接的區別就是,客戶端收到服務端的響應后,立刻發送FIN消息,主動釋放連接。也有服務端主動斷連的情況,凡是在一次消息交互(發請求-收響應)之后立刻斷開連接的情況都稱為短連接。

長連接/http keep-alive
也叫持久連接,即一個TCP連接服務多次請求,在TCP層握手成功后,不立即斷開連接,并在此連接的基礎上進行多次消息(包括心跳)交互,直至連接的任意一方(客戶端OR服務端)主動斷開連接,此過程稱為一次完整的長連接。

在HTTP/1.0中得到了初步的支持,客戶端在請求header中攜帶Connection:Keep-Alive,即是在向服務端請求持久連接。如果服務端接受持久連接,則會在響應header中同樣攜帶Connection: Keep-Alive,這樣客戶端便會繼續使用同一個TCP連接發送接下來的若干請求。(Keep-Alive的默認參數是[timout=5, max=100],即一個TCP連接可以服務至多5秒內的100次請求)

HTTP/1.1開始,即使請求header中沒有攜帶Connection: Keep-Alive,傳輸也會默認以持久連接的方式進行,只有加入"Connection: close "后,才關閉。

http keepalive是客戶端瀏覽器與服務端httpd守護進程協作的結果。

TCP中的KeepAlive
??TCP協議的實現中,提供了KeepAlive報文,用來探測連接的對端是否存活。在應用交互的過程中,可能存在以下幾種情況:

客戶端或服務器意外斷電,死機,崩潰,重啟;

中間網絡已經中斷,而客戶端與服務器并不知道;

利用保活探測功能,可以探知這種對端的意外情況,從而保證在意外發生時,可以釋放半打開的TCP連接。TCP保活報文交互過程如下:


image.png

有了TCP提供了KeepAlive機制, 為什么還需要應用層的心跳保活:

  • (1) Keep Alive機制開啟后,TCP層將在定時時間到后發送相應的KeepAlive探針以確定連接可用性。默認時間為7200s(兩小時),失敗后重試10次,每次超時時間75s。顯然默認值無法滿足移動網絡下的需求;

  • (2) 即便修改了(1)中的默認值,也不能很好的滿足業務需求。TCP的KeepAlive用于檢測連接的死活而不能檢測通訊雙方的存活狀態。比如某臺服務器因為某些原因導致負載超高,無法響應任何業務請求,但是使用TCP探針則仍舊能夠確定連接狀態,這就是典型的連接活著但業務提供方已死的狀態,對客戶端而言,這時的最好選擇就是斷線后重新連接其他服務器,而不是一直認為當前服務器是可用狀態,一直向當前服務器發送些必然會失敗的請求。

  • (3) socks代理會讓Keep Alive失效。socks協議只管轉發TCP層具體的數據包,而不會轉發TCP協議內的實現細節的包。所以,一個應用如果使用了socks代理,那么TCP的KeepAlive機制就失效了。

  • (4) 部分復雜情況下Keep Alive會失效,如路由器掛掉,網線直接被拔除等;

因此,KeepAlive并不適用于檢測雙方存活的場景,這種場景還得依賴于應用層的心跳。應用層心跳也具備著更大的靈活性,可以控制檢測時機,間隔和處理流程,甚至可以在心跳包上附帶額外信息。

影響心跳頻率的關鍵因素

應用層心跳是檢測連接有效性以及判斷雙方是否存活的有效方式。但是心跳過于頻繁會帶來耗電和耗流量的弊病,心跳頻率過低則會影響連接檢測的實時性。業內關于心跳時間的設置和優化,主要基于如下幾個因素:

  • 1.NAT超時–大部分移動無線網絡運營商在鏈路一段時間沒有數據通訊時,會淘汰 NAT表中的對應項,造成鏈路中斷;
  • 2.DHCP租期–DHCP租期到了需要主動續約,否則會繼續使用過期IP導致長連接偶然的斷連;
  • 3.網絡狀態變化–手機網絡和WIFI網絡切換、網絡斷開和連上等情況有網絡狀態的變化,也會使長連接變為無效連接;

理想的情況下,客戶端應當以略小于NAT超時時間的間隔來發送心跳包。根據微信團隊測試的一些數據,一些常用網絡的NAT超時時間如下表所示:

image.png

Tcp keepAlive 和Http中Keep-Alive的關系
HTTP協議的Keep-Alive意圖在于連接復用,同一個連接上串行方式傳遞請求-響應數據

TCP的KeepAlive機制意圖在于保活、心跳,檢測連接錯誤

如何快速區分當前連接使用的是長連接還是短連接
1、凡是在一次完整的消息交互(發請求-收響應)之后,立刻斷開連接(有一方發送FIN消息)的情況都稱為短連接;

2、長連接的一個明顯特征是會有心跳消息(也有沒有心跳的情況),且一般心跳間隔都在30S或者1MIN左右,用wireshark抓包可以看到有規律的心跳消息交互(可能會存在毫秒級別的誤差)。

什么時候用長連接,短連接?
1、需要頻繁交互的場景使用長連接,如即時通信工具(微信/QQ,QQ也有UDP),相反則使用短連接,比如普通的web網站,只有當瀏覽器發起請求時才會建立連接,服務器返回相應后,連接立即斷開。

2、維持長連接會有一定的系統開銷,用戶量少不容易看出系統瓶頸,一旦用戶量上去了,就很有可能把服務器資源(內存/CPU/網卡)耗盡,所以使用需謹慎。

keep-alive與TIME_WAIT
使用http keep-alvie,可以減少服務端TIME_WAIT數量(因為由服務端httpd守護進程主動關閉連接)。道理很簡單,相較而言,啟用keep-alive,建立的tcp連接更少了,自然要被關閉的tcp連接也相應更少了。

短連接和長鏈接 圖:


image.png

參考:https://caofengbin.github.io/2018/03/16/dhcp-and-nat/#4-%E5%BD%B1%E5%93%8D%E5%BF%83%E8%B7%B3%E9%A2%91%E7%8E%87%E7%9A%84%E5%85%B3%E9%94%AE%E5%9B%A0%E7%B4%A0

https://blog.csdn.net/hengyunabc/article/details/44310193

http://wingjay.com/2018/12/05/android-arch-long-link/

https://www.levicc.com/2018/06/30/yi-dong-duan-wang-luo-you-hua/

能被我參考的都很優秀,哈哈

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,273評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,870評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,527評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,010評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,250評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,769評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,656評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,853評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,103評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,487評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,815評論 2 372

推薦閱讀更多精彩內容

  • 1、TCP狀態linux查看tcp的狀態命令:1)、netstat -nat 查看TCP各個狀態的數量2)、lso...
    北辰青閱讀 9,471評論 0 11
  • HTTP Keep-Alive 在http早期,每個http請求都要求打開一個tpc socket連接,并且使用一...
    jiangmo閱讀 4,767評論 0 2
  • 長連接與短連接 TCP 本身并沒有長短連接的區別 ,長短與否,完全取決于我們怎么用它。 短連接:每次通信時,創建 ...
    tracy_668閱讀 4,569評論 1 3
  • http keepalive 介紹 在http早期,每個http請求都要求打開一個tpc socket連接,并且使...
    大富帥閱讀 31,148評論 0 12
  • 什么是心跳機制? 心跳說的是在客戶端和服務端在互相建立ESTABLISH狀態的時候,如何通過發送一個最簡單的包來保...
    tracy_668閱讀 4,923評論 1 5