你必須知道的關於tcp keepalive 設定

2021-06-28 20:50:21 字數 2784 閱讀 2022

1.引數設定

檢視相關的引數

sysctl -a|grep tcp_keepalive

net.ipv4.tcp_keepalive_intvl = 30

net.ipv4.tcp_keepalive_probes = 2

net.ipv4.tcp_keepalive_time = 160

設定相關的引數

sysctl -w net.ipv4.tcp_keepalive_time = 7500

也可以直接開啟/etc/sysctl.conf

加入net.ipv4.tcp_keepalive_time = 7500,然後儲存退出

讓引數生效

sysctl -p

2.引數相關的說明

/proc/sys/net/ipv4/tcp_keepalive_time

當keepalive起用的時候,tcp傳送keepalive訊息的頻度。預設是2小時。

/proc/sys/net/ipv4/tcp_keepalive_intvl

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

/proc/sys/net/ipv4/tcp_keepalive_probes

在認定連線失效之前,傳送多少個tcp的keepalive探測包。預設值是9。這個值乘以tcp_keepalive_intvl之後決定了,乙個連線傳送了keepalive之後可以有多少時間沒有回應

tcp_keepalive_time :integer

預設值是7200(2小時)

當keepalive開啟的情況下,tcp傳送keepalive訊息的頻率。(由於目前網路攻擊等因素,造成了利用這個進行的攻擊很頻繁,曾經也有cu的朋友提到過,說如果2邊建立了連線,然後不傳送任何資料或者rst/fin訊息,那麼持續的時間是不是就是2小時,空連線攻擊? tcp_keepalive_time就是預防此情形的.我個人在做nat服務的時候的修改值為1800秒)

tcp_keepalive_probes:integer

預設值是9

tcp傳送keepalive探測以確定該連線已經斷開的次數。(注意:保持連線僅在so_keepalive套接字選項被開啟是才傳送.次數預設不需要修改,當然根據情形也可以適當地縮短此值.設定為5比較合適)

tcp_keepalive_intvl:integer

預設值為75

探測訊息傳送的頻率,乘以tcp_keepalive_probes就得到對於從開始探測以來沒有響應的連線殺除的時間。預設值為75秒,也就是沒有活動的連線將在大約11分鐘以後將被丟棄。(對於普通應用來說,這個值有一些偏大,可以根據需要改小.特別是web類伺服器需要改小該值,15是個比較合適的值)

$ /proc/sys/net/ipv4/tcp_keepalive_time

$ /proc/sys/net/ipv4/tcp_keepalive_intvl

$ /proc/sys/net/ipv4/tcp_keepalive_probes

這3個引數與tcp keepalive有關.預設值是:

tcp_keepalive_time = 7200 seconds (2 hours)

tcp_keepalive_probes = 9

tcp_keepalive_intvl = 75 seconds

意思是如果某個tcp連線在idle 2個小時後,核心才發起probe.如果probe 9次(每次75秒)不成功,核心才徹底放棄,認為該連線已失效.對伺服器而言,顯然上述值太大. 可調整到:

/proc/sys/net/ipv4/tcp_keepalive_time 1800

/proc/sys/net/ipv4/tcp_keepalive_intvl 30

/proc/sys/net/ipv4/tcp_keepalive_probes 3

tcp_keepalive_intvl:探測訊息傳送的頻率

tcp_keepalive_probes:tcp傳送keepalive探測以確定該連線已經斷開的次數

tcp_keepalive_time:當keepalive開啟的情況下,tcp傳送keepalive訊息的頻率

linux**

[cpp]view plain

copy

print

?#include

#include

#include

int keepalive = 1;          // 開啟keepalive屬性

int keepidle = 1800;        // 如該連線在1800秒內沒有任何資料往來,則進行探測

int keepinterval = 3;       // 探測時發包的時間間隔為3秒

int keepcount = 2;          // 探測嘗試的次數.如果第1次探測包就收到響應了,則後幾次的不再發.

setsockopt(client_fd, sol_socket, so_keepalive, (void*)&keepalive, sizeof(keepalive)); 

setsockopt(client_fd, sol_tcp, tcp_keepidle, (void *)&keepidle, sizeof(keepidle)); 

setsockopt(client_fd, sol_tcp,tcp_keepintvl, (void *)&keepinterval, sizeof(keepinterval)); 

setsockopt(client_fd, sol_tcp, tcp_keepcnt, (void *)&keepcount, sizeof(keepcount)); 

關於 Linux shell 你必須知道的

我個人很喜歡使用 linux 系統,雖然說 windows 的圖形化介面做的確實比 linux 好,但是對指令碼的支援太差了。一開始有點不習慣命令列操作,但是熟悉了之後反而發現移動滑鼠點點點才是浪費時間的罪魁禍首。那麼對於 linux 命令列,本文不是介紹某些命令的用法,而是說明一些簡單卻特別容易讓...

關於Tomcat,你必須知道的那些事兒

1.如何修改tomcat的埠號?答 在conf的server.xml中 找到 的地方,修改port引數即可。2.如何配置虛擬目錄?path 表示虛擬目錄名,訪問時使用虛擬目錄名作為web目錄訪問 docbase 表示實際專案的磁碟位置。reloadable 3.如何部署web應用?其中通過瀏覽器訪問...

前端詞典 關於 Babel 你必須知道的

模板字面量 const name 小生方勤 let hello hello babelrc 檔案 plugins 與 presets 同時存在的執行順序 先執行 plugins 的配置項,再執行 preset 的配置項 plugins 配置項,按照宣告順序執行 preset 配置項,按照宣告逆序執行...