心跳信號是每隔一段時間向互聯的另一方傳送一個很小的數據包,通過對方回復情況判斷互聯的雙方之間的通訊鏈路是否已經斷開的方法。
基本介紹
- 中文名:心跳
- 外文名:heartbeat
- 學科:通信
介紹,作用,何時需要,怎么建立,特別說明,
介紹
互聯的雙方中的一方,每隔固定的時間向另一方傳送一個很小的數據包,另一方根據需要確定在收到數據包之後是否回復一個很小的數據包。每隔固定時間是很難達到的一個條件,實際情況是不超過某個時間間隔。
作用
心跳信號是為了確認一個事實——互聯的雙方在長時間沒有通訊的情況下是否都還線上,或者說存在於互聯的雙方之間的通訊鏈路是否已經斷開。而不是網上有些人所謂的“用來保持連線”,“用來維持長連線”。連線一旦建立,只能被異常或正常的斷開,而不會因為沒有數據傳輸而斷開的,所以沒有什麼長連線的概念,更不需要用傳送數據的方式來保持連線。
有些防火牆或者電腦管理軟體會把超過一定時間沒有通訊的連線當作死連線,這些軟體會自動將死連線斷開或者請求用戶將死連線斷開。當有心跳時,不會被這類軟體當做死連線。看起來心跳信號像是保持了連線,這是只是心跳信號偶然間具有的作用。
長連線和短連線是套用層的概念。長連線表示當與某個目標創建套用層的連線後,目標不會因為沒有數據通訊而去斷開這個連線。短連線表示當需要與目標通信時創建連線通訊一結束立刻斷開,否則目標有可能也會因為長時間不通訊而將連線斷開,ftp伺服器就會。
當ftp伺服器允許長連線屬性開啟後,ftp伺服器不會因為連線著的客戶端沒有長時間沒有上傳或者下載檔案而關閉這個連線,對於ftp客戶端來說就是不需要採用短連線的方式上傳或者下載檔案。
有些防火牆或者電腦管理軟體會把超過一定時間沒有通訊的連線當作死連線,這些軟體會自動將死連線斷開或者請求用戶將死連線斷開。當有心跳時,不會被這類軟體當做死連線。看起來心跳信號像是保持了連線,這是只是心跳信號偶然間具有的作用。
長連線和短連線是套用層的概念。長連線表示當與某個目標創建套用層的連線後,目標不會因為沒有數據通訊而去斷開這個連線。短連線表示當需要與目標通信時創建連線通訊一結束立刻斷開,否則目標有可能也會因為長時間不通訊而將連線斷開,ftp伺服器就會。
當ftp伺服器允許長連線屬性開啟後,ftp伺服器不會因為連線著的客戶端沒有長時間沒有上傳或者下載檔案而關閉這個連線,對於ftp客戶端來說就是不需要採用短連線的方式上傳或者下載檔案。
何時需要
顯然通過心跳信號的作用就可以知道,當套用層採用了長連線,並且會出現長時間不通訊的情況,並且雙方中至少有一方需要知道對方是否仍然線上或者數據鏈路是否仍然通暢時,才需要使用心跳信號。不管何種通訊協定,只要不是採用傳送數據時連線,傳送完畢立即斷開的方式那么就是在套用層採用了長連線。
不管採用是基於連線的協定(如TCP),還是基於流的協定(如UDP),當在套用層採用了長連線方式時,都可能需要心跳信號。首先讓我們來看看這兩類協定的區別。
基於流的協定不需要建立連線,也不需要斷開,傳送方向某個地址(IP加連線埠)傳送數據,收取方從某個地址讀取數據。對於基於流的協定來說,傳送方是否成功傳送數據或者傳送的數據是否被成功收取,傳送方是不知道的;收取方沒有收到數據到底說明傳送方沒有傳送還是傳送了但是丟失了,也是不知道的。其實串口通訊協定也算作是一種基於流的協定,雖然有一個打開串口的過程,其實這只是相當於請求獨占一個連線埠,這也是串口不能重複被打開的原因。
基於連線的協定,在通訊前首先要建立連線,建立連線的過程包括一定步驟的雙向通訊;下線也是一樣的,有心情的可以看一下TCP的通訊過程。基於連線的通訊協定每一次傳送數據都是一個雙向的通訊過程,傳送方傳送數據,接收放收到數據後回復,如果沒收到回復重新發,重發0次或多次後會認為連線無故斷開了,報告傳送失敗。顯然基於連線的協定能夠保證傳送的數據被目標接收到了。數據包中對與套用來說有意義的部分數據是否正確是需要根據具體協定而定的,但是指明目的地址的包頭部分有錯誤肯定會導致重發或者傳送失敗。
採用基於連線的協定通訊的雙方中的一方由於停電、當機、崩潰等原因沒有進行或者完成下線的過程那么另一方就不知道連線是否斷開了。對於基於連線的協定,一旦在套用層採用了長連線絕大多少情況下都需要心跳信號,除非程式不用長時間運行,不在乎死連線的性能損失。
對於基於流的協定,採用了長連線並且有一方需要確認和區分數據的來源地址(ip連線埠或者其它標識)且需要知道來源方或傳送方是否還線上時才需要採用心跳信號。歸納起來就是如果一方需要知道另一方是否線上那么一定需要心跳信號;如果一方需要知道另一方是否線上但是又不需要知道收到的數據來自何處,那么程式肯定設計的有問題。僅僅區分數據來源是沒有必要為每一個來源都創建一個獨立的連線(其實不應該叫做連線,可以看做tcp、udp通訊採用的socket),更沒有必要採用心跳信號。收到數據之後就可以知道連線埠、IP,其它標識也可以添加到數據包里。
不管採用是基於連線的協定(如TCP),還是基於流的協定(如UDP),當在套用層採用了長連線方式時,都可能需要心跳信號。首先讓我們來看看這兩類協定的區別。
基於流的協定不需要建立連線,也不需要斷開,傳送方向某個地址(IP加連線埠)傳送數據,收取方從某個地址讀取數據。對於基於流的協定來說,傳送方是否成功傳送數據或者傳送的數據是否被成功收取,傳送方是不知道的;收取方沒有收到數據到底說明傳送方沒有傳送還是傳送了但是丟失了,也是不知道的。其實串口通訊協定也算作是一種基於流的協定,雖然有一個打開串口的過程,其實這只是相當於請求獨占一個連線埠,這也是串口不能重複被打開的原因。
基於連線的協定,在通訊前首先要建立連線,建立連線的過程包括一定步驟的雙向通訊;下線也是一樣的,有心情的可以看一下TCP的通訊過程。基於連線的通訊協定每一次傳送數據都是一個雙向的通訊過程,傳送方傳送數據,接收放收到數據後回復,如果沒收到回復重新發,重發0次或多次後會認為連線無故斷開了,報告傳送失敗。顯然基於連線的協定能夠保證傳送的數據被目標接收到了。數據包中對與套用來說有意義的部分數據是否正確是需要根據具體協定而定的,但是指明目的地址的包頭部分有錯誤肯定會導致重發或者傳送失敗。
採用基於連線的協定通訊的雙方中的一方由於停電、當機、崩潰等原因沒有進行或者完成下線的過程那么另一方就不知道連線是否斷開了。對於基於連線的協定,一旦在套用層採用了長連線絕大多少情況下都需要心跳信號,除非程式不用長時間運行,不在乎死連線的性能損失。
對於基於流的協定,採用了長連線並且有一方需要確認和區分數據的來源地址(ip連線埠或者其它標識)且需要知道來源方或傳送方是否還線上時才需要採用心跳信號。歸納起來就是如果一方需要知道另一方是否線上那么一定需要心跳信號;如果一方需要知道另一方是否線上但是又不需要知道收到的數據來自何處,那么程式肯定設計的有問題。僅僅區分數據來源是沒有必要為每一個來源都創建一個獨立的連線(其實不應該叫做連線,可以看做tcp、udp通訊採用的socket),更沒有必要採用心跳信號。收到數據之後就可以知道連線埠、IP,其它標識也可以添加到數據包里。
怎么建立
傳送記錄類型的數據時
記錄類型的數據長短差異不是特別巨大,數據類型多樣,擁有一定的結構。傳送這種類型的數據一般採用基於連線的協定(TCP),這樣可以保證每條數據都能送到目標。此時心跳信號應該算作通訊協定(這是套用層的協定)中的一種數據,和其它數據傳送到同一個連線埠號。在協定設計過程中要考慮到用一種特別的標記將一條條的數據隔開,以防粘包。將心跳信號和其他數據的結構設計成一致的。將某條數據解析出來後通過其中的某個欄位來確認這條數據到底是心跳信號還是其他數據。
這種情況下心跳信號可以採用計時器每隔一段時間傳送一次,而不用理會是否有其它類型的數據傳送。接收方應該在至少經過2到3倍的約定時間沒有收到心跳信號時才認為連線斷開了。當然也可以有其它類型數據傳送時,不傳送心跳信號。這樣一來雙方的處理邏輯都複雜一些。不管採用何種方式,在的通訊協定都應該進行說明。
這種情況下心跳信號可以採用計時器每隔一段時間傳送一次,而不用理會是否有其它類型的數據傳送。接收方應該在至少經過2到3倍的約定時間沒有收到心跳信號時才認為連線斷開了。當然也可以有其它類型數據傳送時,不傳送心跳信號。這樣一來雙方的處理邏輯都複雜一些。不管採用何種方式,在的通訊協定都應該進行說明。
傳送檔案或者視頻(數據)流時
傳送檔案時一般採用基於連線的協定。如果採用基於流的協定,就需要自己處理某一個包是否送達目標的過程,而這個過程恰好是基於連線的協定的底層內容。
傳送視頻流和其它類型的數據流時一般採用基於流的協定。因為網路環境不至於差到每一幀數據中都有丟包。傳送視頻流時,丟了一包,帶來的影響也就是解碼出來的圖像花屏或者不能解碼;花屏沒什麼大不了,不能解碼直接丟棄也沒什麼影響。
傳送其它的數據流,比如從感測器不斷發回來的溫度、濕度等,從GPS接收機不斷發回來的定位信息。這些數據損壞了一幀,還有下一幀可以使用。所以也不在乎丟包。
對於這種流式數據不允許中間插入心跳數據。所以心跳數據的格式必須單獨設計。心跳的傳送也有兩種方式。第一種,不管數據流是否在傳送都每隔固定的時間將心跳數據發往不同於發數據流的連線埠。第二種,當傳送數據流時不傳送心跳信號。
傳送視頻流和其它類型的數據流時一般採用基於流的協定。因為網路環境不至於差到每一幀數據中都有丟包。傳送視頻流時,丟了一包,帶來的影響也就是解碼出來的圖像花屏或者不能解碼;花屏沒什麼大不了,不能解碼直接丟棄也沒什麼影響。
傳送其它的數據流,比如從感測器不斷發回來的溫度、濕度等,從GPS接收機不斷發回來的定位信息。這些數據損壞了一幀,還有下一幀可以使用。所以也不在乎丟包。
對於這種流式數據不允許中間插入心跳數據。所以心跳數據的格式必須單獨設計。心跳的傳送也有兩種方式。第一種,不管數據流是否在傳送都每隔固定的時間將心跳數據發往不同於發數據流的連線埠。第二種,當傳送數據流時不傳送心跳信號。
特別說明
TCP已經包含了心跳信號。但是這個心跳信號受實現平台的限制比較多,並且默認是關閉的。如果開發伺服器程式儘量不要依賴這個功能。如果開發一些簡單的小套用時,並且可以預料到將來沒有平台遷移任務時才可以使用。