-
當(dāng)前位置:首頁(yè) > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
tcp心跳機(jī)制(tcp 心跳)
大家好!今天讓創(chuàng)意嶺的小編來(lái)大家介紹下關(guān)于tcp心跳機(jī)制的問(wèn)題,以下是小編對(duì)此問(wèn)題的歸納整理,讓我們一起來(lái)看看吧。
ChatGPT國(guó)內(nèi)免費(fèi)在線使用,能給你生成想要的原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等
你只需要給出你的關(guān)鍵詞,它就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁(yè)版、PC客戶端,官網(wǎng):https://ai.de1919.com
本文目錄:
一、tcp的幾個(gè)半狀態(tài)
當(dāng)TCP連接中 A 向 B 發(fā)送FIN請(qǐng)求關(guān)閉,另一端B回應(yīng)ACK之后,B沒(méi)有立即發(fā)送FIN給A,A處于半連接狀態(tài),此時(shí)A可以接收B發(fā)送的消息,但是A已經(jīng)不能再向B發(fā)送消息。
發(fā)送在三次握手中。
如果A向B發(fā)起連接,B也按照正常情況響應(yīng)了,但是A不進(jìn)行三次握手,這就是半連接。
半連接攻擊 :半連接,會(huì)造成B分配的內(nèi)存資源就這么一直耗著,直到資源耗盡(SYN攻擊)
如果一方關(guān)閉或者異常關(guān)閉(斷電,斷網(wǎng)),而另一方并不知情,這樣的連接稱之為半打開(kāi)。
處于半打開(kāi)的連接,如果雙方不進(jìn)行數(shù)據(jù)通信,是發(fā)現(xiàn)不了問(wèn)題的;只有再次通信時(shí)才會(huì)知道這個(gè)連接處于半打開(kāi)狀態(tài)。
如:A和B連接,B異常關(guān)閉了,A并不知道B關(guān)閉了,直到A給B發(fā)送消息B無(wú)響應(yīng),這時(shí)A才知道B出了異常。
解決辦法 : 心跳機(jī)制 ,A隔一段時(shí)間給B發(fā) 特定消息 ,B收到這個(gè) 特定消息 后,回復(fù)A 特定消息(RST包) ,A如果沒(méi)收到RST包,就說(shuō)明需要重新建立連接了。
二、socket 如果不關(guān)閉會(huì)自動(dòng)關(guān)閉嗎?為什么要心跳連接?
如果不主動(dòng)關(guān)閉socket的話,系統(tǒng)不會(huì)自動(dòng)關(guān)閉的,除非當(dāng)前進(jìn)程掛掉了,操作系統(tǒng)把占用的socket回收了才會(huì)關(guān)閉。
為什么需要心跳連接主要是判斷當(dāng)前連接是否是有效的、可被使用的。在實(shí)際應(yīng)用中假設(shè)一段時(shí)間沒(méi)有數(shù)據(jù)傳輸時(shí)候理論上說(shuō)應(yīng)該連接是沒(méi)有問(wèn)題的,但是網(wǎng)絡(luò)復(fù)雜,中途出現(xiàn)問(wèn)題也是常見(jiàn)的,網(wǎng)線被掐斷了、對(duì)方進(jìn)程掛掉了、頻繁丟包等,這時(shí)候TCP連接是不可使用的,但是對(duì)于應(yīng)用層并不知道,如果需知道網(wǎng)絡(luò)情況則要很復(fù)雜的超時(shí)進(jìn)行了解,TCP從底層就實(shí)現(xiàn)了這樣的功能。心跳機(jī)制是TCP在一段時(shí)間間隔后發(fā)送確定連接端是否還存在,如果存在的話就會(huì)回傳一個(gè)包確定網(wǎng)絡(luò)有效,如果心跳包有問(wèn)題,則通知上層應(yīng)用當(dāng)前網(wǎng)絡(luò)有問(wèn)題了。
三、tcp建立連接后休眠
TCP連接建立后,會(huì)進(jìn)入休眠狀態(tài),也就是等待客戶端發(fā)出請(qǐng)求報(bào)文,此時(shí)服務(wù)器會(huì)一直保持連接,直到客戶端發(fā)出請(qǐng)求報(bào)文或超時(shí)時(shí)間到達(dá),服務(wù)器才會(huì)處理該請(qǐng)求報(bào)文并進(jìn)行響應(yīng)。在TCP連接建立后休眠期間,可以使用狀態(tài)輪詢、心跳檢測(cè)等機(jī)制來(lái)檢測(cè)客戶端是否處于活動(dòng)狀態(tài),以及避免空連接的超時(shí)斷開(kāi)。
四、paho mqtt c 源碼分析-2 (心跳機(jī)制)
MQTT是基于TCP的,因此需要考慮連接心跳,paho mqtt c的心跳處理函數(shù)
概括如下:
ping_outstanding 在下述函數(shù)中處理,該函數(shù)的調(diào)用是在接收線程中,如果收到云端的 PINGRESP 數(shù)據(jù)包,會(huì)調(diào)用該接口
lastSent 是MQTT消息包發(fā)送完成,調(diào)用的場(chǎng)景如下2個(gè):
MQTTPacket_Factory(...)
如果收到一個(gè)MQTT packet,則設(shè)置 lastReceived
以上就是關(guān)于tcp心跳機(jī)制相關(guān)問(wèn)題的回答。希望能幫到你,如有更多相關(guān)問(wèn)題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。
推薦閱讀:
scratch怎么復(fù)制(scratch怎么復(fù)制代碼)
itchat無(wú)法登錄(無(wú)法用itchat登錄網(wǎng)頁(yè)微信)
鄒平公園景觀設(shè)計(jì)施工(鄒平公園景觀設(shè)計(jì)施工招標(biāo))
汕頭恩平別墅景觀設(shè)計(jì)(汕頭恩平別墅景觀設(shè)計(jì)圖)