監測CentOS下TCP斷線

2022-04-02 01:23:10 字數 1539 閱讀 2437

tcp正常的斷開,通訊雙方(服務端和客戶端)都是能知道的。但是非正常的斷開,比如直接拔掉了網線,就只能靠如下兩種方法,實現短時間內的檢測。

一、心跳包機制

心跳包機制,是網遊設計中的常用機制。從使用者層面,自己發包去判斷對方連線狀態。可以根據情況,很靈活的使用。比如,20秒傳送乙個最小的資料報(也可以根據實際情況稍帶一些其他資料)。如果傳送沒有回應,就判斷對方掉線了。

二、利用tcp_keepalive機制

利用tcp的機制,通過設定系統引數,從系統層面,監測tcp的連線狀態。以下為linux下的方法:

1、首先檢視系統tcp_keepalive相關引數(centos和ubuntu)

# sysctl -a|grep tcp_keepalive

顯示如下:

net.ipv4.tcp_keepalive_intvl = 75

net.ipv4.tcp_keepalive_probes = 9

net.ipv4.tcp_keepalive_time = 7200

分別說一下這三個引數:

tcp_keepalive_time 引數:

是指tcp傳送keepalive訊息的頻度,預設為7200秒,也就是兩個小時。

keepalive_intvl 引數:

當探測沒有確認時,重新傳送探測的頻度。預設是75秒。

keepalive_probes 引數:

在認定連線失效之前,傳送多少個tcp的keepalive探測包。預設值是9次。

2、修改系統的tcp_keepalive相關引數

在知道以上三個系統引數的定義和作用之後,我們來修改一下這三個引數:

修改/etc/sysctl.conf檔案:

# vi /etc/sysctl.conf

在開啟的檔案中,加入如下三行:

net.ipv4.tcp_keepalive_intvl = 1

net.ipv4.tcp_keepalive_probes = 1

net.ipv4.tcp_keepalive_time = 5

儲存檔案。

3、重啟伺服器

# reboot

附註:或者臨時使系統設定生效也行:# sysctl -p

4、修改程式**部分。

注意:僅僅配置核心引數是不夠的,還必須在程式設計的時候設定套接字的選項,呼叫函式是

socket.setsockopt(level, optname, value)

示例:level為sol_socket的話,選項為so_keepalive,值為布林。

socket.setsockopt(socket.sol_socket, socket.so_keepalive, true)

此外還可以設定tcp選項(設定的level為sol_tcp而不是sol_socket)覆蓋系統全域性設定

tcp_keepcnt 與tcp_keepalive_probes 對應

tcp_keepidle 與tcp_keepalive_time 對應

tcp_keepintvl 與tcp_keepalive_intvl 對應

監測CentOS下TCP斷線

tcp正常的斷開,通訊雙方 服務端和客戶端 都是能知道的。但是非正常的斷開,比如直接拔掉了網線,就只能靠如下兩種方法,實現短時間內的檢測。一 心跳包機制 心跳包機制,是網遊設計中的常用機制。從使用者層面,自己發包去判斷對方連線狀態。可以根據情況,很靈活的使用。比如,20秒傳送乙個最小的資料報 也可以...

TCP斷線重連

struct sockaddr in tempsadd tempsadd.sin family af inet tempsadd.sin port htons m serverport tempsadd.sin addr.s addr inet addr m serverip.c str if 1 ...

服務 TCP 斷線錯誤分析

在資料驅動架構公升級這一主題下,更好地統計異常斷線率 服務是學生老師一對一連線,多數情況下為學生的網路條件較差,因此此處假定老師的網路為正常.老師裝置為 ipad,系統為 ios 9.3.5,網路 wifi iyunxiao 學生 android 裝置為 一加6,系統為 android 9,ios ...