心跳信號(hào)(百度百科)

出自:https://baike.baidu.com/item/%E5%BF%83%E8%B7%B3%E4%BF%A1%E5%8F%B7?fr=aladdin

心跳信號(hào)是每隔一段時(shí)間向互聯(lián)的另一方發(fā)送一個(gè)很小的數(shù)據(jù)包,通過(guò)對(duì)方回復(fù)情況判斷互聯(lián)的雙方之間的通訊鏈路是否已經(jīng)斷開的方法。

1、什么是心跳信號(hào)

互聯(lián)的雙方中的一方,每隔固定的時(shí)間向另一方發(fā)送一個(gè)很小的數(shù)據(jù)包,另一方根據(jù)需要確定在收到數(shù)據(jù)包之后是否回復(fù)一個(gè)很小的數(shù)據(jù)包。每隔固定時(shí)間是很難達(dá)到的一個(gè)條件,實(shí)際情況是不超過(guò)某個(gè)時(shí)間間隔。

2、心跳信號(hào)的作用

心跳信號(hào)是為了確認(rèn)一個(gè)事實(shí)——互聯(lián)的雙方在長(zhǎng)時(shí)間沒(méi)有通訊的情況下是否都還在線,或者說(shuō)存在于互聯(lián)的雙方之間的通訊鏈路是否已經(jīng)斷開。而不是網(wǎng)上有些人所謂的“用來(lái)保持連接”,“用來(lái)維持長(zhǎng)連接”。連接一旦建立,只能被異常或正常的斷開,而不會(huì)因?yàn)闆](méi)有數(shù)據(jù)傳輸而斷開的,所以沒(méi)有什么長(zhǎng)連接的概念,更不需要用發(fā)送數(shù)據(jù)的方式來(lái)保持連接。

有些防火墻或者電腦管理軟件會(huì)把超過(guò)一定時(shí)間沒(méi)有通訊的連接當(dāng)作死連接,這些軟件會(huì)自動(dòng)將死連接斷開或者請(qǐng)求用戶將死連接斷開。當(dāng)有心跳時(shí),不會(huì)被這類軟件當(dāng)做死連接。看起來(lái)心跳信號(hào)像是保持了連接,這是只是心跳信號(hào)偶然間具有的作用。

長(zhǎng)連接和短連接是應(yīng)用層的概念。長(zhǎng)連接表示當(dāng)與某個(gè)目標(biāo)創(chuàng)建應(yīng)用層的連接后,目標(biāo)不會(huì)因?yàn)闆](méi)有數(shù)據(jù)通訊而去斷開這個(gè)連接。短連接表示當(dāng)需要與目標(biāo)通信時(shí)創(chuàng)建連接,而通訊一結(jié)束立刻斷開,否則目標(biāo)有可能也會(huì)因?yàn)殚L(zhǎng)時(shí)間不通訊而將連接斷開,ftp服務(wù)器就會(huì)。

當(dāng)ftp服務(wù)器允許長(zhǎng)連接屬性開啟后,ftp服務(wù)器不會(huì)因?yàn)檫B接著的客戶端沒(méi)有長(zhǎng)時(shí)間沒(méi)有上傳或者下載文件而關(guān)閉這個(gè)連接,對(duì)于ftp客戶端來(lái)說(shuō)就是不需要采用短連接的方式上傳或者下載文件。

3、何時(shí)需要心跳信號(hào)

顯然通過(guò)心跳信號(hào)的作用就可以知道,當(dāng)應(yīng)用層采用了長(zhǎng)連接,并且會(huì)出現(xiàn)長(zhǎng)時(shí)間不通訊的情況,并且雙方中至少有一方需要知道對(duì)方是否仍然在線或者數(shù)據(jù)鏈路是否仍然通暢時(shí),才需要使用心跳信號(hào)。不管何種通訊協(xié)議,只要不是采用傳送數(shù)據(jù)時(shí)連接,傳送完畢立即斷開的方式那么就是在應(yīng)用層采用了長(zhǎng)連接。

不管采用是基于連接的協(xié)議(如TCP),還是基于流的協(xié)議(如UDP),當(dāng)在應(yīng)用層采用了長(zhǎng)連接方式時(shí),都可能需要心跳信號(hào)。首先讓我們來(lái)看看這兩類協(xié)議的區(qū)別。

基于流的協(xié)議不需要建立連接,也不需要斷開,發(fā)送方向某個(gè)地址(IP加端口)發(fā)送數(shù)據(jù),收取方從某個(gè)地址讀取數(shù)據(jù)。對(duì)于基于流的協(xié)議來(lái)說(shuō),發(fā)送方是否成功發(fā)送數(shù)據(jù)或者發(fā)送的數(shù)據(jù)是否被成功收取,發(fā)送方是不知道的;收取方?jīng)]有收到數(shù)據(jù)到底說(shuō)明發(fā)送方?jīng)]有發(fā)送還是發(fā)送了但是丟失了,也是不知道的。其實(shí)串口通訊協(xié)議也算作是一種基于流的協(xié)議,雖然有一個(gè)打開串口的過(guò)程,其實(shí)這只是相當(dāng)于請(qǐng)求獨(dú)占一個(gè)端口,這也是串口不能重復(fù)被打開的原因。

基于連接的協(xié)議,在通訊前首先要建立連接,建立連接的過(guò)程包括一定步驟的雙向通訊;斷開連接也是一樣的,有心情的可以看一下TCP的通訊過(guò)程?;谶B接的通訊協(xié)議每一次發(fā)送數(shù)據(jù)都是一個(gè)雙向的通訊過(guò)程,發(fā)送方發(fā)送數(shù)據(jù),接收放收到數(shù)據(jù)后回復(fù),如果沒(méi)收到回復(fù)重新發(fā),重發(fā)0次或多次后會(huì)認(rèn)為連接無(wú)故斷開了,報(bào)告發(fā)送失敗。顯然基于連接的協(xié)議能夠保證發(fā)送的數(shù)據(jù)被目標(biāo)接收到了。數(shù)據(jù)包中對(duì)與應(yīng)用來(lái)說(shuō)有意義的部分?jǐn)?shù)據(jù)是否正確是需要根據(jù)具體協(xié)議而定的,但是指明目的地址的包頭部分有錯(cuò)誤肯定會(huì)導(dǎo)致重發(fā)或者發(fā)送失敗。

采用基于連接的協(xié)議通訊的雙方中的一方由于停電、當(dāng)機(jī)、崩潰等原因沒(méi)有進(jìn)行或者完成斷開連接的過(guò)程那么另一方就不知道連接是否斷開了。對(duì)于基于連接的協(xié)議,一旦在應(yīng)用層采用了長(zhǎng)連接絕大多少情況下都需要心跳信號(hào),除非程序不用長(zhǎng)時(shí)間運(yùn)行,不在乎死連接的性能損失。

對(duì)于基于流的協(xié)議,采用了長(zhǎng)連接并且有一方需要確認(rèn)和區(qū)分?jǐn)?shù)據(jù)的來(lái)源地址(ip端口或者其它標(biāo)識(shí))且需要知道來(lái)源方或發(fā)送方是否還在線時(shí)才需要采用心跳信號(hào)。歸納起來(lái)就是如果一方需要知道另一方是否在線那么一定需要心跳信號(hào);如果一方需要知道另一方是否在線但是又不需要知道收到的數(shù)據(jù)來(lái)自何處,那么程序肯定設(shè)計(jì)的有問(wèn)題。僅僅區(qū)分?jǐn)?shù)據(jù)來(lái)源是沒(méi)有必要為每一個(gè)來(lái)源都創(chuàng)建一個(gè)獨(dú)立的連接(其實(shí)不應(yīng)該叫做連接,可以看做tcp、udp通訊采用的socket),更沒(méi)有必要采用心跳信號(hào)。收到數(shù)據(jù)之后就可以知道端口、IP,其它標(biāo)識(shí)也可以添加到數(shù)據(jù)包里。

4、怎么建立心跳信號(hào)

傳送記錄類型的數(shù)據(jù)時(shí)

記錄類型的數(shù)據(jù)長(zhǎng)短差異不是特別巨大,數(shù)據(jù)類型多樣,擁有一定的結(jié)構(gòu)。發(fā)送這種類型的數(shù)據(jù)一般采用基于連接的協(xié)議(TCP),這樣可以保證每條數(shù)據(jù)都能送到目標(biāo)。此時(shí)心跳信號(hào)應(yīng)該算作通訊協(xié)議(這是應(yīng)用層的協(xié)議)中的一種數(shù)據(jù),和其它數(shù)據(jù)發(fā)送到同一個(gè)端口號(hào)。在協(xié)議設(shè)計(jì)過(guò)程中要考慮到用一種特別的標(biāo)記將一條條的數(shù)據(jù)隔開,以防粘包。將心跳信號(hào)和其他數(shù)據(jù)的結(jié)構(gòu)設(shè)計(jì)成一致的。將某條數(shù)據(jù)解析出來(lái)后通過(guò)其中的某個(gè)字段來(lái)確認(rèn)這條數(shù)據(jù)到底是心跳信號(hào)還是其他數(shù)據(jù)。

這種情況下心跳信號(hào)可以采用計(jì)時(shí)器每隔一段時(shí)間發(fā)送一次,而不用理會(huì)是否有其它類型的數(shù)據(jù)發(fā)送。接收方應(yīng)該在至少經(jīng)過(guò)2到3倍的約定時(shí)間沒(méi)有收到心跳信號(hào)時(shí)才認(rèn)為連接斷開了。當(dāng)然也可以有其它類型數(shù)據(jù)發(fā)送時(shí),不發(fā)送心跳信號(hào)。這樣一來(lái)雙方的處理邏輯都復(fù)雜一些。不管采用何種方式,在的通訊協(xié)議都應(yīng)該進(jìn)行說(shuō)明。[1]

傳送文件或者視頻(數(shù)據(jù))流時(shí)

傳送文件時(shí)一般采用基于連接的協(xié)議。如果采用基于流的協(xié)議,就需要自己處理某一個(gè)包是否送達(dá)目標(biāo)的過(guò)程,而這個(gè)過(guò)程恰好是基于連接的協(xié)議的底層內(nèi)容。

傳送視頻流和其它類型的數(shù)據(jù)流時(shí)一般采用基于流的協(xié)議。因?yàn)榫W(wǎng)絡(luò)環(huán)境不至于差到每一幀數(shù)據(jù)中都有丟包。傳送視頻流時(shí),丟了一包,帶來(lái)的影響也就是解碼出來(lái)的圖像花屏或者不能解碼;花屏沒(méi)什么大不了,不能解碼直接丟棄也沒(méi)什么影響。

傳送其它的數(shù)據(jù)流,比如從傳感器不斷發(fā)回來(lái)的溫度、濕度等,從GPS接收機(jī)不斷發(fā)回來(lái)的定位信息。這些數(shù)據(jù)損壞了一幀,還有下一幀可以使用。所以也不在乎丟包。

對(duì)于這種流式數(shù)據(jù)不允許中間插入心跳數(shù)據(jù)。所以心跳數(shù)據(jù)的格式必須單獨(dú)設(shè)計(jì)。心跳的發(fā)送也有兩種方式。第一種,不管數(shù)據(jù)流是否在發(fā)送都每隔固定的時(shí)間將心跳數(shù)據(jù)發(fā)往不同于發(fā)數(shù)據(jù)流的端口。第二種,當(dāng)發(fā)送數(shù)據(jù)流時(shí)不發(fā)送心跳信號(hào)。

5、特別說(shuō)明

TCP已經(jīng)包含了心跳信號(hào)。但是這個(gè)心跳信號(hào)受實(shí)現(xiàn)平臺(tái)的限制比較多,并且默認(rèn)是關(guān)閉的。如果開發(fā)服務(wù)器程序盡量不要依賴這個(gè)功能。如果開發(fā)一些簡(jiǎn)單的小應(yīng)用時(shí),并且可以預(yù)料到將來(lái)沒(méi)有平臺(tái)遷移任務(wù)時(shí)才可以使用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容