1. 程式人生 > 其它 >golang tcp keepalive研究記錄(基於websocket)

golang tcp keepalive研究記錄(基於websocket)

為什麼有tcp Keepalive?

  伺服器和客戶端建立tcp連線以後,客戶端/伺服器如何知道對方是否掛掉了? 

  這時候TCP協議提出一個辦法,當客戶端端等待超過一定時間後自動給服務端傳送一個空的報文,如果對方回覆了這個報文證明連線還存活著,如果對方沒有報文返回且進行了多次嘗試都是一樣,那麼就認為連線已經丟失,客戶端就沒必要繼續保持連線了。如果沒有這種機制就會有很多空閒的連線佔用著系統資源。

KeepAlive並不是TCP協議規範的一部分,但在幾乎所有的TCP/IP協議棧(不管是Linux還是Windows)中,都實現了KeepAlive功能。
  RFC1122#TCP Keep-Alives

tcp Keepalive是否預設開啟?

  KeepAlive預設情況下是關閉的,可以被上層應用開啟和關閉

 

如何設定tcp keepalive?

在Linux核心設定

KeepAlive預設不是開啟的,如果想使用KeepAlive,需要在你的應用中設定SO_KEEPALIVE才可以生效。

檢視當前的配置:

cat /proc/sys/net/ipv4/tcp_keepalive_time
cat /proc/sys/net/ipv4/tcp_keepalive_intvl
cat /proc/sys/net/ipv4/tcp_keepalive_probes

在Linux中我們可以通過修改 /etc/sysctl.conf 的全域性配置:

net.ipv4.tcp_keepalive_time=7200
net.ipv4.tcp_keepalive_intvl=75
net.ipv4.tcp_keepalive_probes=9

新增上面的配置後輸入 sysctl -p 使其生效,你可以使用 sysctl -a | grep keepalive 命令來檢視當前的預設配置

 

golang websocket 客戶端預設怎麼處理tcp keepalive?

websocket客戶端預設是開啟tcp keepalive的

客戶端呼叫的是net/dial的方法DialContext:


決定是否開啟keepalive,取決於dial的keepalive的值,>>0就開啟

把客戶端的程式碼改造以後,就可以決定是否主動開啟了:

golang websocket 伺服器預設怎麼處理tcp keepalive?

websocket伺服器預設是開啟tcp keepalive的

客戶端呼叫的是net/tcpsock_posix的tcplistener的accept方法決定的:

tcplistenser的lc配置檔案的keepalive欄位>>0就開啟tcp keepalive

把伺服器改造一下,支援能夠主動開關tcp keepalive: