golang基於websocket通信tcp keepalive研究記錄
為什麼有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:
以上就是golang基於websocket通信tcp keepalive研究記錄的詳細內容,更多關於golang websocket通信tcp keepalive的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- 解決postgreSql遠程連接數據庫超時的問題
- CLOSE_WAIT狀態解決方案
- Redis swap空間(虛擬內存)的使用詳解
- golang在GRPC中設置client的超時時間
- 解決linux下redis數據庫overcommit_memory問題