关于心跳包
心跳包的作用
TCP連接在默認的情況下就是所謂的長連接, 也就是說連接雙方都不主動關閉連接, 這個連接就應該一直存在.
明確一點, TCP長連接本質上不需要心跳包來維持, 大家可以試一試, 讓兩臺電腦連上同一個wifi, 然后讓其中一臺做服務器, 另一臺用一個普通的沒有設置KeepAlive的Socket連上服務器, 只要兩臺電腦別斷網(wǎng), 路由器也別斷電, DHCP正常續(xù)租, 就這么放著, 過幾個小時再用其中一臺電腦通過之前建立的TCP連接給另一臺發(fā)消息, 另一臺肯定能收到.
那為什么要有心跳包呢? 其實主要是為了防止上面提到的NAT超時, 既然一些NAT設備判斷是否淘汰NAT映射的依據(jù)是一定時間沒有數(shù)據(jù), 那么客戶端就主動發(fā)一個數(shù)據(jù).
當然, 如果僅僅是為了防止NAT超時, 可以讓服務器來發(fā)送心跳包給客戶端, 不過這樣做有個弊病就是, 萬一連接斷了, 服務器就再也聯(lián)系不上客戶端了. 所以心跳包必須由客戶端發(fā)送, 客戶端發(fā)現(xiàn)連接斷了, 還可以嘗試重連服務器.
所以心跳包的主要作用是防止NAT超時, 其次是探測連接是否斷開.
鏈路斷開, 沒有寫操作的TCP連接是感知不到的, 除非這個時候發(fā)送數(shù)據(jù)給服務器, 造成寫超時, 否則TCP連接不會知道斷開了. 主動kill掉一方的進程, 另一方會關閉TCP連接, 是系統(tǒng)代進程給服務器發(fā)的FIN. TCP連接就是這樣, 只有明確的收到對方發(fā)來的關閉連接的消息(收到RST也會關閉, 大家都懂), 或者自己意識到發(fā)生了寫超時, 否則它認為連接還存在.
?
心跳包和輪詢的區(qū)別
心跳包和輪詢看起來類似, 都是客戶端主動聯(lián)系服務器, 但是區(qū)別很大.
- 輪詢是為了獲取數(shù)據(jù), 而心跳是為了保活TCP連接.
- 輪詢得越頻繁, 獲取數(shù)據(jù)就越及時, 心跳的頻繁與否和數(shù)據(jù)是否及時沒有直接關系
- 輪詢比心跳能耗更高, 因為一次輪詢需要經(jīng)過TCP三次握手, 四次揮手, 單次心跳不需要建立和拆除TCP連接.
轉載于:https://www.cnblogs.com/mjblogs/p/5253266.html
總結
- 上一篇: 组装台式电脑如何重装系统图文教程
- 下一篇: 电费折扣充值cps接口