當(dāng)面試官問你:TCP 通信過程中的長(zhǎng)連接與短連接是什么?
你應(yīng)該如何回答?你會(huì)嗎?
當(dāng)網(wǎng)絡(luò)通信采用tcp協(xié)議時(shí),在真正的讀寫操作之前,sever與client之間必須建立一個(gè)連接,當(dāng)讀寫操作完成之后,對(duì)方不再需要這個(gè)連接時(shí)他們可以釋放這個(gè)鏈接,連接的連接需要三次握手:

釋放需要四次握手:

也就是說每個(gè)連接的建立都是需要消耗資源和時(shí)間的。
tcp 連接
短連接
模擬一種TCP短連接的情況:
client 向 server 發(fā)起連接請(qǐng)求
server 接到請(qǐng)求,雙方建立連接
client 向 server 發(fā)送消息
server 回應(yīng) client
一次讀寫完成,此時(shí)雙方任何一個(gè)都可以發(fā)起 close 操作
一般都是 client 先發(fā)起 close 操作。當(dāng)然也不排除有特殊的情況。
從上面的描述看,短連接一般只會(huì)在 client/server 間傳遞一次讀寫操作!
短連接的操作步驟是:
建立連接——數(shù)據(jù)傳輸——關(guān)閉連接…建立連接——數(shù)據(jù)傳輸——關(guān)閉連接
優(yōu)缺點(diǎn)
短連接對(duì)于服務(wù)器來說管理較為簡(jiǎn)單,存在的連接都是有用的連接,不需要額外的控制手段。但如果客戶請(qǐng)求頻繁,將在TCP的建立和關(guān)閉操作上浪費(fèi)時(shí)間和帶寬。
應(yīng)用場(chǎng)景
而像WEB網(wǎng)站的http服務(wù)一般都用短鏈接,因?yàn)殚L(zhǎng)連接對(duì)于服務(wù)端來說會(huì)耗費(fèi)一定的資源,而像WEB網(wǎng)站這么頻繁的成千上萬甚至上億客戶端的連接用短連接會(huì)更省一些資源,如果用長(zhǎng)連接,而且同時(shí)有成千上萬的用戶,如果每個(gè)用戶都占用一個(gè)連接的話,那可想而知吧。所以并發(fā)量大,但每個(gè)用戶無需頻繁操作情況下需用短連好。
TCP長(zhǎng)連接

模擬一種長(zhǎng)連接的情況:
client 向 server 發(fā)起連接
server 接到請(qǐng)求,雙方建立連接
client 向 server 發(fā)送消息
server 回應(yīng) client
一次讀寫完成,連接不關(guān)閉
后續(xù)讀寫操作…
長(zhǎng)時(shí)間操作之后client發(fā)起關(guān)閉請(qǐng)求
長(zhǎng)連接的操作步驟是:
建立連接——數(shù)據(jù)傳輸…(保持連接)…數(shù)據(jù)傳輸——關(guān)閉連接
保持連接用到了TCP保活功能
優(yōu)缺點(diǎn):
長(zhǎng)連接可以省去較多的TCP建立和關(guān)閉的操作,減少浪費(fèi),節(jié)約時(shí)間。對(duì)于頻繁請(qǐng)求資源的客戶來說,適合長(zhǎng)連接
client與server之間的連接如果一直不關(guān)閉的話,會(huì)存在一個(gè)問題,隨著客戶端連接越來越多,server早晚有扛不住的時(shí)候,這時(shí)候server端需要采取一些策略,如關(guān)閉一些長(zhǎng)時(shí)間沒有讀寫事件發(fā)生的連接,這樣可以避免一些惡意連接導(dǎo)致server端服務(wù)受損;如果條件再允許就可以以客戶端機(jī)器為顆粒度,限制每個(gè)客戶端的最大長(zhǎng)連接數(shù),這樣可以完全避免某個(gè)蛋疼的客戶端連累后端服務(wù)。
應(yīng)用場(chǎng)景:
長(zhǎng)連接多用于操作頻繁,點(diǎn)對(duì)點(diǎn)的通訊,而且連接數(shù)不能太多情況。每個(gè)TCP連接都需要三次握手,這需要時(shí)間,如果每個(gè)操作都是先連接,再操作的話那么處理速度會(huì)降低很多,所以每個(gè)操作完后都不斷開,再次處理時(shí)直接發(fā)送數(shù)據(jù)包就OK了,不用建立TCP連接。
例如:數(shù)據(jù)庫(kù)的連接用長(zhǎng)連接,如果用短連接頻繁的通信會(huì)造成socket錯(cuò)誤,而且頻繁的socket 創(chuàng)建也是對(duì)資源的浪費(fèi)。
對(duì)比

短連接環(huán)境下,數(shù)據(jù)交互完畢后,會(huì)主動(dòng)釋放連接;如果使用的是長(zhǎng)連接的情況下,如果雙方已經(jīng)建立起了連接,但是很長(zhǎng)一段時(shí)間內(nèi)沒有數(shù)據(jù)交換,而客戶端可能意外斷電、死機(jī)、崩潰、重啟,還是中間路由網(wǎng)絡(luò)無故斷開,這些TCP連接沒來得及正常釋放,那么,因?yàn)榉?wù)端不知道客戶端的情況,他就會(huì)一直維護(hù)這個(gè)連接,長(zhǎng)時(shí)間的積累會(huì)導(dǎo)致非常多的半打開連接,造成服務(wù)端系統(tǒng)資源的消耗和浪費(fèi)。
所以服務(wù)端要做到快速感知失敗,減少無效連接操作,這就有了TCP的Keepalive(?;钐綔y(cè))機(jī)制。
長(zhǎng)連接斷開的原因
在長(zhǎng)連接的情況下,雙方的所有通信 都建立在1條長(zhǎng)連接上(1次TCP連接);所以,長(zhǎng)連接 需要 持續(xù)保持雙方連接 才可使得雙方持續(xù)通信。
可是,長(zhǎng)連接會(huì)存在斷開的情況,而斷開原因主要是:
長(zhǎng)連接所在進(jìn)程被殺死
NAT超時(shí)
網(wǎng)絡(luò)狀態(tài)發(fā)生變化
其他不可抗因素(網(wǎng)絡(luò)狀態(tài)差、DHCP的租期等等 )
原因1:進(jìn)程被殺死
當(dāng)進(jìn)程被殺死后,長(zhǎng)連接也會(huì)隨之?dāng)嚅_。
原因2:NAT 超時(shí)(重點(diǎn)關(guān)注)
NAT超時(shí)現(xiàn)象如下

各運(yùn)營(yíng)商 & 地區(qū)的 NAT超時(shí)時(shí)間如下

特別注意:排除其他外因(網(wǎng)絡(luò)切換、NAT超時(shí)、人為原因),TCP長(zhǎng)連接在雙方都不斷開連接的情況上,本質(zhì)上是不會(huì)自動(dòng)中斷的
即,不需要心跳包來維持。
驗(yàn)證:讓2臺(tái)電腦連上同1個(gè)Wifi(其中1臺(tái)做服務(wù)器, 另1臺(tái)做客戶端連接服務(wù)器(無設(shè)置KeepAlive);只要電腦、路由器不斷網(wǎng)斷電,那么,2臺(tái)電腦的長(zhǎng)連接是不會(huì)自動(dòng)中斷的。
原因3:網(wǎng)絡(luò)狀態(tài)發(fā)生變化
當(dāng)移動(dòng)客戶端網(wǎng)絡(luò)狀態(tài)發(fā)生變化時(shí)(如移動(dòng)網(wǎng)絡(luò) & Wifi切換、斷開、重連),也會(huì)使長(zhǎng)連接斷開。
原因4:其他不可抗因素
如網(wǎng)絡(luò)狀態(tài)差、DHCP的租期到期等等,都會(huì)使得長(zhǎng)連接發(fā)生偶然的斷開。
DHCP的租期到期:對(duì)于Android系統(tǒng),DHCP到了租期后不會(huì)主動(dòng)續(xù)約 & 繼續(xù)使用過期IP,,從而導(dǎo)致長(zhǎng)連接斷開。
高效維持長(zhǎng)連接的解決方案
在了解長(zhǎng)連接斷開原因后,針對(duì)對(duì)應(yīng)原因,此處給出 高效維持長(zhǎng)連接的解決方案。

為此,若需有效維持長(zhǎng)連接,則需要做到。

其實(shí),說得簡(jiǎn)單點(diǎn):高效維持長(zhǎng)連接的關(guān)鍵在于。
?;睿禾幱谶B接狀態(tài)時(shí)盡量不要斷
斷線重連:斷了之后繼續(xù)重連回來
解決方案1:進(jìn)程?;?/p>

解決方案2:心跳保活機(jī)制
解決方案3:斷線重連機(jī)制
心跳?;顧C(jī)制簡(jiǎn)介
心跳?;顧C(jī)制的整體介紹如下

注:很多人容易混淆心跳機(jī)制 & 輪詢機(jī)制,此處給出二者區(qū)別。

主流心跳機(jī)制分析 & 對(duì)比
對(duì)國(guó)、內(nèi)外主流的移動(dòng)IM產(chǎn)品(WhatsApp、Line、微信)進(jìn)行了心跳機(jī)制的簡(jiǎn)單分析 & 對(duì)比,具體請(qǐng)看下圖 。

心跳機(jī)制方案 總體設(shè)計(jì)
下面,將根據(jù)市面上主流的心跳機(jī)制,設(shè)計(jì)一套心跳機(jī)制方案。
基本流程

設(shè)計(jì)要點(diǎn)
對(duì)于心跳機(jī)制方案設(shè)計(jì)的主要考慮因素 = 保證消息的實(shí)時(shí)性 & 耗費(fèi)設(shè)備的資源(網(wǎng)絡(luò)流量、電量、CPU等等)
從上圖可以看出,對(duì)于心跳機(jī)制方案設(shè)計(jì)的要點(diǎn)在于
心跳包的規(guī)格(內(nèi)容 & 大小)
心跳發(fā)送的間隔時(shí)間
斷線重連機(jī)制 (核心 = 如何 判斷長(zhǎng)連接的有效性)
在下面的方案設(shè)計(jì)中,將針對(duì)這3個(gè)問題給出詳細(xì)的解決方案。
心跳機(jī)制方案詳細(xì)設(shè)計(jì)
心跳包的規(guī)格
為了減少流量 & 提高發(fā)送效率,需要精簡(jiǎn)心跳包的設(shè)計(jì)。
設(shè)計(jì)原則
主要從心跳包的內(nèi)容 & 大小入手,設(shè)計(jì)原則具體如下:

設(shè)計(jì)方案
心跳包 = 1個(gè)攜帶少量信息 & 大小在10字節(jié)內(nèi)的信息包。
心跳發(fā)送的間隔時(shí)間
為了防止NAT超時(shí) & 減少設(shè)備資源的消耗(網(wǎng)絡(luò)流量、電量、CPU等等),心跳發(fā)送的間隔時(shí)間是整個(gè)心跳機(jī)制方案設(shè)計(jì)的重點(diǎn)。
設(shè)計(jì)原則

設(shè)計(jì)方案
最直接 & 常用方案
一般,最直接 & 常用的心跳發(fā)送間隔時(shí)間設(shè)置方案 :每隔估計(jì) x 分鐘發(fā)送心跳包1次。
其中,x <5分鐘即可。(綜合主流移動(dòng)IM產(chǎn)品,此處建議 x= 4分鐘)。
但是,這種方案存在一些問題:

-
TCP
+關(guān)注
關(guān)注
8文章
1417瀏覽量
82984 -
網(wǎng)絡(luò)通信
+關(guān)注
關(guān)注
4文章
829瀏覽量
32387 -
TCP協(xié)議
+關(guān)注
關(guān)注
1文章
101瀏覽量
12700 -
TCP通信
+關(guān)注
關(guān)注
0文章
146瀏覽量
4765
原文標(biāo)題:面試官:什么是 TCP 長(zhǎng)連接、短連接?問倒一大片。。。
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
如何標(biāo)識(shí)一個(gè)TCP連接
LabVIEW中的TCP通信
CC2541如何連接過程中修改連接間隔?
簡(jiǎn)單了解TCP中設(shè)計(jì)的短連接和長(zhǎng)連接
TCP通信通過網(wǎng)絡(luò)調(diào)試助手與S7-1200建立TCP連接
ISO on TCP協(xié)議通信的連接配置
要是沒有一端進(jìn)行監(jiān)聽是否可以建立起TCP連接呢?
字節(jié)一面:HTTP長(zhǎng)連接和TCP長(zhǎng)連接有區(qū)別?
什么是Socket連接?Socket與TCP連接的關(guān)系
什么是Socket連接?與TCP連接有什么關(guān)系?
儲(chǔ)能連接器廠家告訴您生產(chǎn)過程中容易出現(xiàn)的問題

TCP通信過程中的長(zhǎng)連接與短連接是什么?
評(píng)論