golang基于websocket通信tcp keepalive研究记录

 更新时间:2022年06月01日 17:31:20   作者:若-飞  
这篇文章主要为大家介绍了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的资料请关注脚本之家其它相关文章!

相关文章

  • 夯实Golang基础之数据类型梳理汇总

    夯实Golang基础之数据类型梳理汇总

    这篇文章主要8为大家介绍了夯实Golang基础之数据类型梳理汇总,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2023-10-10
  • Golang中Gin框架中如何定义路由详解

    Golang中Gin框架中如何定义路由详解

    Gin是一个用Go语言编写的Web框架,具有高性能和易于使用的特点,本文将结合实际案例,详细介绍Gin框架的路由用法,有需要的小伙伴可以参考下
    2024-10-10
  • Go实现Redis连接池方法

    Go实现Redis连接池方法

    为了更深入了解golang连接池的实现,自已又重写了一遍连接池。文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • golang 中 channel 的详细使用、使用注意事项及死锁问题解析

    golang 中 channel 的详细使用、使用注意事项及死锁问题解析

    这篇文章主要介绍了golang 中 channel 的详细使用、使用注意事项及死锁分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • GO语言实现二维码扫码的示例代码

    GO语言实现二维码扫码的示例代码

    你对二维码扫码的流程有困惑吗,这篇文章就结合笔者自身的开发经验进行分享,让大家熟悉并掌握此功能,感兴趣的小伙伴快跟随小编一起学习一下吧
    2023-06-06
  • Golang HTTP请求Json响应解析方法以及解读失败的原因

    Golang HTTP请求Json响应解析方法以及解读失败的原因

    这篇文章主要介绍了Golang HTTP请求Json响应解析方法以及解读失败的原因,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Go WaitGroup及Cond底层实现原理

    Go WaitGroup及Cond底层实现原理

    这篇文章主要为大家介绍了Go WaitGroup及Cond底层实现原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • xorm根据数据库生成go model文件的操作

    xorm根据数据库生成go model文件的操作

    这篇文章主要介绍了xorm根据数据库生成go model文件的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • golang 执行命令行的实现

    golang 执行命令行的实现

    本文主要介绍了golang 执行命令行的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Go通道channel通过通信共享内存

    Go通道channel通过通信共享内存

    这篇文章主要为大家介绍了Go通道channel通过通信共享内存示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07

最新评论