TCP 的 keeplive保活機制

在一般情況下,TCP在網路爲了避免半連接狀態(比如客戶端已經掉線服務器還在提供資源),會在長時間沒有數據傳輸時主動關閉連接,但很多應用場景下,如websocket,連接需要一直保持,以便於客戶端隨時能接收到服務器的消息。只要客戶端每隔一段時間向服務器發送一條保活數據,這樣服務器就不會主動關閉連接。

爲了不影響業務數據,一方會發送與前一個seq相同的數據包,而另一方則會回覆同樣的ack,如果另一方沒有回覆,就說明連接有問題。這就是保活的原理。

TCP默認沒有數據情況下2小時後發送一次保活消息,在/proc/sys/net/ipv4目錄下的 tcp_keepalive_time 文件中可以設置。tcp_keepalive_intvl 文件表示保活消息的間隔,默認是75s,tcp_keepalive_probes 文件表示累計沒有收到的回覆數算掉線。也可以針對某個socket來設置:

int keeplive = 1; // 打開keepkive屬性
int keepidle = 60; // 60s沒有數據keeplive激活
int keepinterval = 5; // keeplive間隔5s
int keepcount = 3; // 探測失敗嘗試次數
setsocket(fd,SOL_SOCKET,SO_KEEPALIVE,(void*)&keeplive,sizeof(keeplive);
setsocket(fd,SOL_SOCKET,SO_KEEPPIDLE,(void*)&keeppidle,sizeof(keeppidle);
setsocket(fd,SOL_SOCKET,SO_KEEPINTVL,(void*)&keepintvl,sizeof(keepintvl);
setsocket(fd,SOL_SOCKET,SO_KEEPCNT,(void*)&keepcount,sizeof(keepcount);

在保活情況中,有三種情況

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章