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 ...