色偷偷偷亚洲综合网另类,亚洲欧美另类在线观看,欧美午夜激情在线,久久久精品一区

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > Keepalive機制

Keepalive機制 時間:2018-09-29      來源:未知

1. TCP保活的必要性

1) 很多防火墻等對于空閑socket自動關閉

2) 對于非正常斷開, 服務器并不能檢測到. 為了回收資源, 必須提供一種檢測機制.

 

2. 導致TCP斷連的因素

如果網絡正常, socket也通過close操作來進行優雅的關閉, 那么一切完美. 可是有很多情況, 比如網線故障, 客戶端一側突然斷電或者崩潰等等, 這些情況server并不能正常檢測到連接的斷開. 

 

3. 保活的兩種方式:

1) 應用層面的心跳機制

自定義心跳消息頭. 一般客戶端主動發送, 服務器接收后進行回應(也可以不回應). 這里不進行詳述.

PS: 有人從軟件的功能角度列出第三種方式, 就是通過第三方軟件來進行探測, 確定連接的有效性. 這種方式局限性很大, 而且不屬于軟件內部的功能實現. 不進行討論.

2) TCP協議自帶的保活功能

打開keep-alive功能即可. 具體屬性也可以通過API設定.

 

4. 兩種方式的優劣性

TCP協議自帶的保活功能, 使用起來簡單, 減少了應用層代碼的復雜度. 推測也會更節省流量, 因為一般來說應用層的數據傳輸到協議層時都會被加上額外的包頭包尾. 由TCP協議提供的檢活, 其發的探測包, 理論上實現的會更精妙(用更少的字節完成更多的目標), 耗費更少的流量.

由應用自己實現的應用層的心跳, 為心跳消息額外定義一個消息類型就可以了. 就是應用正常的消息包, 只是這個包特殊點, 專門用來檢活而已, 通常比較小, 可能只有消息頭就可以了, 除非需要額外的信息. 

應用層心跳的好處我個人的理解有兩點: 

一是比較靈活, 因為協議層的心跳只能提供純粹的檢活功能, 但是應用層自己可以隨意控制, 包括協議可能提供的是秒級的, 但是你想做成毫秒級的都任意(雖然實際幾乎不會有這種時間級別的心跳), 包里還甚至可以攜帶額外的信息, 這些都是靈活之處.

二是通用, 應用層的心跳不依賴協議. 如果有一天不用TCP要改為UDP了, 協議層不提供心跳機制了, 但是你應用層的心跳依舊是通用的, 可能只需要做少許改動就可以繼續使用.

應用層心跳的不好的地方也很顯而易見, 增加開發工作量, 由于應用特定的網絡框架, 還可能很增加代碼結構的復雜度. 再就是根據上面的推測, 應用層心跳的流量消耗還是更大的, 畢竟這本質上還是個普通的數據包.

 

5. 到底選用那種心跳方式?

優劣點第4節已經進行了闡述, 因此如果能確定你們更換協議的可能性非常小, 同時只是需要檢活的功能, 那么用協議自帶的就絕對OK了, 使用簡單而且高效. 有些自負的人總喜歡用自己搞的, 來代替成熟協議自帶的東西, 代替系統內核提供的東西, 其實往往你應用層實現的東西, 都是更拙劣的. 網上看了一些關于協議的Keep-alive不靠譜的說法, 也都比較空想和想當然, 都沒有拿出任何事實論據或實驗數據. 這點大家有見解, 歡迎交流哈~

 

6. 類Unix平臺如何使用Keep-alive

keepalive默認是關閉的, 因為雖然流量極小, 畢竟是開銷. 因此需要用戶手動開啟. 有兩種方式開啟.

1) 在代碼里針對每個socket進行單獨設定, 使用起來靈活.

除了keepAlive 開關, 還有keepIdle, keepInterval, keepCount 3個屬性, 使用簡單, 如下:

 

int keepAlive = 1;   // 開啟keepalive屬性. 缺省值: 0(關閉)  

int keepIdle = 60;   // 如果在60秒內沒有任何數據交互,則進行探測. 缺省值:7200(s)  

int keepInterval = 5;   // 探測時發探測包的時間間隔為5秒. 缺省值:75(s)  

int keepCount = 2;   // 探測重試的次數. 全部超時則認定連接失效..缺省值:9(次)  

setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (void*)&keepAlive, sizeof(keepAlive));  

setsockopt(s, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));  

setsockopt(s, SOL_TCP, TCP_KEEPINTVL, (void*)&keepInterval, sizeof(keepInterval));  

setsockopt(s, SOL_TCP, TCP_KEEPCNT, (void*)&keepCount, sizeof(keepCount));  

 

2) 修改配置文件, 對整個系統所有的socket有效.

我們可以用cat命令查看到系統中這幾個默認的值.

#cat /proc/sys/net/ipv4/tcp_keepalive_time  7200  

#cat /proc/sys/net/ipv4/tcp_keepalive_intvl  75  

#cat /proc/sys/net/ipv4/tcp_keepalive_probes  9

修改它們:

#echo 60 > /proc/sys/net/ipv4/tcp_keepalive_time  

#echo 5 > /proc/sys/net/ipv4/tcp_keepalive_intvl  

#echo 3 > /proc/sys/net/ipv4/tcp_keepalive_probes

上一篇:嵌入式指針數組

下一篇:如何在C中動態分配二維數組

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

色偷偷偷亚洲综合网另类,亚洲欧美另类在线观看,欧美午夜激情在线,久久久精品一区
主站蜘蛛池模板: 日韩中文字幕久久| 97超级碰碰人国产在线观看| 精品久久久久久久久久久久| 欧美在线性视频| 亚洲精品小视频| 狠狠综合久久av一区二区小说| 国产精品久久久999| 深夜福利一区二区| 国产91色在线|免| 中文字幕自拍vr一区二区三区| 久久久久久噜噜噜久久久精品| 亚洲最大福利网站| 欧美日韩一区二区在线| 亚洲成人国产精品| 欧美精品激情blacked18| 精品一区二区三区电影| 96精品视频在线| 国产一区二区三区直播精品电影| 97超级碰碰碰久久久| 深夜福利亚洲导航| 国产欧美日韩免费看aⅴ视频| 久久天天躁狠狠躁夜夜av| 91精品久久久久久久久| 狠狠色噜噜狠狠狠狠97| 亚洲国产精品99久久| 91av在线不卡| 九九热精品视频| 精品丝袜一区二区三区| 国产精品99久久久久久久久| 久久久精品影院| 亚洲精品黄网在线观看| 国产ts一区二区| 欧美性色19p| 色婷婷亚洲mv天堂mv在影片| 成人久久精品视频| 91成人福利在线| 国产成一区二区| 欧美黑人一级爽快片淫片高清| 亚洲深夜福利视频| 欧美尤物巨大精品爽| 日韩中文在线中文网在线观看|