栗永勝 崔佳冬 秦會斌
(杭州電子科技大學(xué)新型電子器件與應(yīng)用研究所 浙江 杭州 310000)
現(xiàn)代通信系統(tǒng)中,為實現(xiàn)移動終端、嵌入式終端等無線設(shè)備客戶端與服務(wù)器通信的實時性,需要終端設(shè)備的客戶端與服務(wù)器保持TCP長連接[1]。由于NAT超時、DHCP過期、路由節(jié)點異常等會造成客戶端與服務(wù)器通信鏈路的中斷,在TCP通信中兩端無法及時感知鏈路異常中斷情況,影響通信的可靠性。
在TCP通信中采用應(yīng)用層定時發(fā)送心跳包的方式保持連接的存活。谷歌的GCM服務(wù)、蘋果的APNs、MQTT協(xié)議等都采用固定間隔發(fā)送心跳包的方式來保持長連接,該方式實現(xiàn)簡單,但存在以下缺點:(1) 無法適應(yīng)復(fù)雜的網(wǎng)絡(luò)環(huán)境。固定心跳包的發(fā)送時間間隔值往往根據(jù)經(jīng)驗值設(shè)定,無法適應(yīng)終端設(shè)備所處環(huán)境,若該值設(shè)置過長會影響系統(tǒng)的可靠性、實時性。(2) 造成資源浪費。為確保系統(tǒng)的可靠該值設(shè)定較小,造成了流量、電量、網(wǎng)絡(luò)等資源的浪費。
針對以上問題,本文提出了一種自適應(yīng)心跳保持長連接的方法。程序根據(jù)網(wǎng)絡(luò)質(zhì)量、用戶設(shè)置學(xué)習(xí)心跳包發(fā)送時間間隔值,能夠適應(yīng)不同的網(wǎng)絡(luò)環(huán)境,學(xué)習(xí)到的心跳間隔在保證連接可靠的前提下,盡可能大,從而節(jié)省了流量、電量等資源。
嵌入式網(wǎng)關(guān)、智能手機應(yīng)用消息推送等實時通信系統(tǒng)中,服務(wù)器需要根據(jù)連接將消息推送至客戶端。IPv4的IP地址有限,無法為每一個終端設(shè)備分配一個公有IP地址。大部分終端設(shè)備通過NAT將私有IP映射為公有IP,通過修改數(shù)據(jù)包中IP地址完成NAT內(nèi)部設(shè)備和外部終端之間的通信,NAT采用動態(tài)刷新的方式為需要連接互聯(lián)網(wǎng)的設(shè)備分配可用的公有IP。如果外部終端和服務(wù)器所建立鏈路長時間空閑,NAT刪除與之相對應(yīng)的記錄,導(dǎo)致鏈路中斷。所以在需要保持長連接的應(yīng)用場景中采用在應(yīng)用層發(fā)送心跳包的方法來保持終端設(shè)備和服務(wù)器鏈路的存活[2]。
圖1為通信系統(tǒng)中心跳包等報文傳輸鏈路,鏈路1為終端設(shè)備向服務(wù)器發(fā)送心跳包數(shù)據(jù),由終端設(shè)備根據(jù)服務(wù)器的IP及端口號發(fā)起連接。當(dāng)服務(wù)器主動向終端設(shè)備推送信息或回復(fù)終端請求時通過鏈路2傳輸,若要保持鏈路1、2的暢通,則需要終端設(shè)備發(fā)送心跳包來維持鏈接。
圖1 系統(tǒng)通信鏈路模型
心跳包和回復(fù)幀會消耗流量,計算式為:
(1)
式中:fc單位為Byte/h,ti為心跳間隔,單位為秒,ms為發(fā)送端發(fā)送心跳包的大小,mr為心跳包接收端回復(fù)的確認(rèn)幀的大小,ms與mr的單位為Byte。
電量消耗ec計算公式:
ec=ew+es
(2)
式中:es為系統(tǒng)睡眠時電量消耗,ew為系統(tǒng)工作時電量消耗,ew≥es,通過減少心跳包次數(shù)可以減少系統(tǒng)的工作時間,從而減少電量的消耗。
從式(1)、式(2)中可以看出,ti越大,fc、ec越小,流量、電量消耗越少??梢酝ㄟ^提高ti減少心跳包對資源的消耗。
心跳間隔過小,心跳包發(fā)送頻繁會造成電量、流量、網(wǎng)絡(luò)資源的浪費;心跳間隔過大會影響系統(tǒng)的穩(wěn)定性,不能保證通信的實時性。根據(jù)以上問題,自適應(yīng)算法應(yīng)遵循以下原則[3]:
(1) 提升通信鏈路的穩(wěn)定性,盡可能減小由NAT超時、DHCP過期、路由節(jié)點異常等引起的鏈路中斷時間;
(2) 在保證鏈路穩(wěn)定性的情況下,心跳間隔應(yīng)盡可能大,減少交互開銷,節(jié)省流量、電量等;
(3) 提升對連接中斷的響應(yīng)速度,以較短的時間完成對鏈接中斷的判斷,重新連接上服務(wù)器。
根據(jù)以上原則自適應(yīng)算法設(shè)計包括心跳間隔自適應(yīng)、最優(yōu)心跳間隔判斷、鏈路中斷判斷三個模塊。心跳包自適應(yīng)調(diào)節(jié)系統(tǒng)具有自適應(yīng)和穩(wěn)定工作兩種工作模式,根據(jù)條件切換。
(1) 心跳間隔自適應(yīng)。心跳間隔自適應(yīng)模塊對計算得到的心跳間隔進(jìn)行測試,連續(xù)成功N次后,根據(jù)算法增加心跳間隔,定義為自適應(yīng)增過程;心跳包在測試過程中第一次出現(xiàn)失敗,則根據(jù)算法減小心跳間隔,定義為自適應(yīng)減過程。
(2) 最優(yōu)心跳間隔判斷模塊。測試時當(dāng)心跳間隔達(dá)到最優(yōu)心跳間隔條件則退出自適應(yīng)模式,且在一段時間內(nèi)不再改變。
(3) 鏈路中斷判斷模塊。心跳包發(fā)送失敗時向服務(wù)器發(fā)送測試報文,若在規(guī)定的時間內(nèi)未收到回復(fù)幀則表示鏈路中斷,需對間隔值進(jìn)行調(diào)節(jié)。
設(shè)To為最優(yōu)心跳間隔,ti為測試心跳間隔,Tt為用戶定義閾值,T0∈[Tmin,Tmax],系統(tǒng)在自適應(yīng)學(xué)習(xí)模式下通過不斷縮小To查找范圍,使心跳間隔逼近To,當(dāng)ti與To誤差小于等于Tt時可認(rèn)為ti為最優(yōu)心跳間隔。根據(jù)算法計算要測試的心跳間隔ti,并測試ti是否可以保持通信鏈路的“存活”,若可以?;顒t將To自適應(yīng)范圍下限改為ti,否則將To自適應(yīng)范圍上限變?yōu)閠i。下面對查找最優(yōu)心跳間隔To進(jìn)行詳細(xì)介紹。
心跳間隔的學(xué)習(xí)范圍初始為[Tmin,Tmax],可根據(jù)需求進(jìn)行設(shè)置。Tmin與Tmax可相等,此時最優(yōu)心跳間隔為Tmin,無需自適應(yīng)調(diào)整。在查找最優(yōu)心跳間隔To的學(xué)習(xí)過程中使用二分法將查找范圍折半[4],記為[tl_min,tl_max),To∈[tl_min,tl_max),且[tl_min,tl_max)∈[Tmin,Tmax]。其中tl_min為自適應(yīng)過程中當(dāng)前的最大成功心跳間隔,tl_max為當(dāng)前最小失敗心跳間隔。To范圍上限tl_max計算公式:
(3)
To范圍下限tl_min計算公式為:
(4)
式(3)中tl_max初試值為Tmax,tii為測試中失敗的心跳間隔的最小值。式(4)中tl_min初試值為Tmin,tii為測試中成功的心跳間隔的最大值。
自適應(yīng)過程中當(dāng)測試心跳間隔需要增大時,由下式計算得到測試心跳間隔tii:
(5)
自適應(yīng)過程中當(dāng)心跳間隔需減小時,測試心跳間隔tii計算式為:
(6)
tii為當(dāng)前測試心跳間隔,To查找范圍為[tl_min,tl_max)。Tt為閾值。
當(dāng)To的范圍[tl_min,tl_max)上限與下限的差值小于閾值Tt時,結(jié)束自適應(yīng)過程,以tii作為心跳間隔進(jìn)入穩(wěn)定工作模式,tii與To的誤差小于Tt。
TCP通信中往返門限值根據(jù)往返時延RTT(Round Trip Time)計算。RTT為終端發(fā)送數(shù)據(jù)到終端接收到回復(fù)幀所花費的時間,由終端處理時間、鏈路傳輸時間、路由緩存排隊處理時間組成[5],RTT反映了系統(tǒng)資源使用和網(wǎng)絡(luò)擁塞情況。
(7)
(8)
報文往返門限值為tw,文中定義tw計算公式如下:
(9)
穩(wěn)定工作過程中通過心跳包發(fā)送失敗率判斷是否重新開啟自適應(yīng),計算心跳包發(fā)送失敗率ρ:
(10)
nfail、ntotal分別為穩(wěn)定工作工程中心跳包失敗的個數(shù)、心跳包總個數(shù)。用戶可以通過設(shè)置ρ來調(diào)節(jié)系統(tǒng)的穩(wěn)定性ρ的范圍為[0,1]。
在自適應(yīng)模式下,系統(tǒng)根據(jù)算法進(jìn)行查找最優(yōu)心跳間隔,具體步驟如下:
(1) 初試化自適應(yīng)范圍為[Tmin,Tmax],判斷Tmin、Tmax是否相等,若相等則進(jìn)入步驟(6),否則執(zhí)行步驟(2);
(2) 獲得往返時延RTT,并根據(jù)式(9)計算通信往返門限值tw;
(3) 由式(5)獲得測試的心跳間隔tii,以tii為心跳間隔進(jìn)行測試;
(4) 步驟(3)測試成功,將測試范圍的下限tl_min賦值為tii,若步驟(3)測試失敗,則根據(jù)式(6)計算下一個測試心跳間隔,將測試范圍的上限tl_max改為tii;
(5) 根據(jù)條件判斷是否為最優(yōu)心跳間隔,不滿足最優(yōu)心跳間隔條件則重復(fù)步驟(3)、步驟(4),若滿足最優(yōu)心跳間隔條件,則以當(dāng)前值心跳間隔,退出自適應(yīng)學(xué)習(xí)模式,系統(tǒng)進(jìn)入穩(wěn)定工作模式;
(6) 穩(wěn)定工作模式統(tǒng)計最優(yōu)心跳間隔的失敗個數(shù),判斷是否重新開啟自適應(yīng)模式。
測試系統(tǒng)通信的網(wǎng)絡(luò)層使用TCP協(xié)議,且設(shè)計了應(yīng)用層通信協(xié)議。在中國移動、中國聯(lián)通GPRS網(wǎng)絡(luò)下對本自適應(yīng)算法進(jìn)行了測試。
心跳包及心跳包回復(fù)幀應(yīng)用層協(xié)議字段如表1所示,包括協(xié)議頭、數(shù)據(jù)長度、用戶數(shù)據(jù)、協(xié)議尾4個字段。
表1 應(yīng)用層協(xié)議字段
數(shù)據(jù)長度字段為用戶數(shù)據(jù)字段BASE64編碼后長度。該字段經(jīng)過字節(jié)擴展技術(shù)處理,既將4字節(jié)的int類型變?yōu)?字節(jié)字符類型,例如1字節(jié)的0x6A,字節(jié)擴展后變?yōu)椤?”、“A”字符,共2字節(jié)。字節(jié)擴展后,數(shù)據(jù)長度字段僅出現(xiàn)0~9、A~F或a~f等字符。
心跳包報文用戶數(shù)據(jù)字段主要包括報文序列號、功能碼、時間、當(dāng)前心跳值?;貜?fù)幀包括報文序列號、功能碼、學(xué)習(xí)范圍的最大值與最小值、最優(yōu)間隔閾值。將最小值Tmin、最大值Tmax放到協(xié)議里由服務(wù)器配置使系統(tǒng)自適應(yīng)更具靈活性。用戶數(shù)據(jù)字段使用BASE64編碼后包含A~Z、a~z、0~9、+、-等64個字符[8-9]。
經(jīng)字節(jié)擴展和BASE64編碼處理后,避免“@”、“&”等字符出現(xiàn)在用戶數(shù)據(jù)字段和數(shù)據(jù)長度字段里,程序通過判斷協(xié)議頭、尾,正確識別協(xié)議包,有效解決了TCP/IP通信中常見的斷包、粘包問題。圖2為協(xié)議包舉例,數(shù)據(jù)長度為16字節(jié)。
圖2 協(xié)議舉例
測試系統(tǒng)客戶端用C語言開發(fā),運行在ARM嵌入式系統(tǒng)。測試服務(wù)器使用Java語言開發(fā),云服務(wù)器對來自客戶端的心跳包等數(shù)據(jù)進(jìn)行解析并回復(fù)。
圖3為程序的流程。
程序包括初始化參數(shù)、建立連接、計算往返門限值、查找及測試心跳間隔、鏈路中斷判斷等步驟。首先,客戶端與測試服務(wù)器建立請求,獲得初始的自適應(yīng)學(xué)習(xí)范圍[Tmin,Tmax]為[60,1 200],并設(shè)置閾值Tt為4,即當(dāng)自適應(yīng)心跳間隔查找范圍小于等于4時,判定測試成功的心跳間隔等價于To。其次,根據(jù)算法計算心跳間隔,并對心跳間隔進(jìn)行測試。最后,根據(jù)閾值Tt判斷進(jìn)入穩(wěn)定工作模式,檢測開啟自適應(yīng)條件。
網(wǎng)絡(luò)socket通信中使用epoll事件驅(qū)動機制監(jiān)視網(wǎng)絡(luò)通信事件。定時任務(wù)使用基于Linux C的clock_gettime()函數(shù)完成,精度為納秒。將clock_gettime()配置為CLOCK_MONOTONIC,既從系統(tǒng)啟動開始計時,用戶改變系統(tǒng)時間不影響該值。
查找最優(yōu)間隔偽代碼如下:
void self_adaption_fun(){
if(is_success){
//將自適應(yīng)范圍下限變?yōu)楫?dāng)前心跳間隔
//范圍閾值判斷
if(LEARN_MAX-LEARN_MIN<=Th){
//進(jìn)入穩(wěn)定工作狀態(tài)
return;
}
//根據(jù)式(5)增加心跳間隔
}else if(!is_success){
//將自適應(yīng)范圍上限變?yōu)楫?dāng)前心跳間隔
//根據(jù)式(6)減小心跳間隔
}
}
本算法在中國移動和中國聯(lián)通GPRS網(wǎng)絡(luò)下進(jìn)行了測試。中國移動GPRS網(wǎng)絡(luò)下測得如表2數(shù)據(jù),經(jīng)過9次查找測試,范圍縮小至[897,901),此時范圍長度為4與閾值Tt相等,此時tii與To的誤差小于4,判定最優(yōu)心跳間隔To?ti,系統(tǒng)以897 s為心跳間隔進(jìn)入穩(wěn)定工作模式。
表2 移動GPRS網(wǎng)絡(luò)下算法測試數(shù)據(jù) s
在中國聯(lián)通GPRS網(wǎng)絡(luò)下測得的數(shù)據(jù)如表3所示,經(jīng)過10次測試,確定最優(yōu)心跳間隔的范圍為[600,603),范圍的長度由1 140縮小至3,tii與To的誤差小于3,600 s可作為穩(wěn)定工作狀態(tài)的心跳間隔。
表3 聯(lián)通GPRS網(wǎng)絡(luò)下算法測試數(shù)據(jù) s
圖4為聯(lián)通和移動GPRS網(wǎng)絡(luò)的RTT情況,從圖中可以看出網(wǎng)絡(luò)抖動較大。表4對數(shù)據(jù)RTT數(shù)據(jù)進(jìn)行了分析,并給出了式(9)的系數(shù)的值。
圖4 中國移動和聯(lián)通GPRS網(wǎng)絡(luò)下RTT統(tǒng)計
表4 網(wǎng)絡(luò)RTT分析 s
經(jīng)過多次測試在中國移動和中國聯(lián)通GPRS網(wǎng)絡(luò)下系統(tǒng)可以較快地查找到合適的心跳間隔,算法能夠很好地適應(yīng)不同的網(wǎng)絡(luò)環(huán)境。中國移動GPRS網(wǎng)絡(luò)下的心跳間隔約為聯(lián)通GPRS網(wǎng)絡(luò)的1.5倍。
本文提出了一種自適應(yīng)的心跳包發(fā)送間隔值查找方法,本方法可根據(jù)網(wǎng)絡(luò)環(huán)境調(diào)節(jié)心跳包發(fā)送間隔,減少了由于發(fā)送心跳包帶來的開銷。經(jīng)過測試本方法穩(wěn)定可靠,適用于移動終端、嵌入式網(wǎng)關(guān)等設(shè)備。本文提出的方法靈活易用性強,開發(fā)人員可根據(jù)需求通過配置參數(shù)調(diào)節(jié)穩(wěn)定性和節(jié)省資源的效率。由于實驗條件的限制本系統(tǒng)還有許多需要改善的地方,例如需要對更多的網(wǎng)絡(luò)類型進(jìn)行測試,可以將GPRS等網(wǎng)絡(luò)的網(wǎng)絡(luò)質(zhì)量作為調(diào)節(jié)心跳間隔的條件,提高算法性能。
[1] 深圳市合信自動化技術(shù)有限公司.一種心跳間隔自動調(diào)整的方法和網(wǎng)關(guān)設(shè)備、服務(wù)器:中國,2014104127389[P].2014-12-24.
[2] 騰訊科技(深圳)有限公司.智能心跳保活方法及智能心跳?;钕到y(tǒng):中國,2014102989780[P].2016-04-13.
[3] 溫彬民.一種基于自適應(yīng)心跳機制的MQTT通信協(xié)議的研究與應(yīng)用[D].華南理工大學(xué),2015:60.
[4] 王海濤,朱洪.改進(jìn)的二分法查找[J].計算機工程,2006,32(10):60-62.
[5] 王明,張春熹,伊小素.基于自適應(yīng)心跳算法的分布式系統(tǒng)故障檢測器[J].北京航空航天大學(xué)學(xué)報,2013,39(7):952-956.
[6] Mori T,Hirata K,Yamamoto M.Content-oriented probabilistic routing with measured RTT[C]//IEEE International Workshop Technical Committee on Communications Quality and Reliability.IEEE,2016:1-6.
[7] 池文羽.基于Android的人工影響天氣智能終端系統(tǒng)的設(shè)計與實現(xiàn)[D].南京信息工程大學(xué),2013:72.
[8] 羅江華.基于MD5與Base64的混合加密算法[J].計算機應(yīng)用,2012,32(S1):47-49.
[9] Xu Congfu,Chen Yafang,Chiew Kevin.An Approach to Image Spam Filtering Based on Base64 Encoding and N-Gram Feature Extraction[C]//2012 IEEE 24th International Conference on Tools with Artificial Intelligence (2010),2010:171-177.