前文中已经介绍了TCP keep alive的做了详尽说明,本文结合golang,介绍如何使用TCP keep alive。

目前golang net包不提供TCP keep alive 空闲多长时间开始探测探测总次数直接设置。

可以使用第三方包。

1.下载第三方包

  1. git clone git@github.com:felixge/tcpkeepalive.git

注意放到GOPATH目录下。

2.例子

2.1 server

server端,接受client连接请求,建立连接后,设置连接的空闲多长时间开始探测探测时间间隔探测总次数

本例中,我们设置的参数如下:

  • 空闲多长时间开始探测 keepAliveIdle: 10s
  • 探测时间间隔 keepAliveInterval: 10s
  • 探测总次数 keepAliveCount:9

server端发送一次数据后,停住。等待10s,开始发送tcp keep alive.

server 代码如下:

  1. package main
  2. import (
  3. "net"
  4. "log"
  5. "time"
  6. "github.com/tcpkeepalive"
  7. )
  8. func main() {
  9. addr := "0.0.0.0:8080"
  10. tcpAddr, err := net.ResolveTCPAddr("tcp",addr)
  11. if err != nil {
  12. log.Fatalf("net.ResovleTCPAddr fail:%s", addr)
  13. }
  14. listener, err := net.ListenTCP("tcp", tcpAddr)
  15. if err != nil {
  16. log.Fatalf("listen %s fail: %s", addr, err)
  17. } else {
  18. log.Println("rpc listening", addr)
  19. }
  20. for {
  21. conn, err := listener.Accept()
  22. if err != nil {
  23. log.Println("listener.Accept error:", err)
  24. continue
  25. }
  26. go handleConnection(conn)
  27. }
  28. }
  29. func setTcpKeepAlive(conn net.Conn) (*tcpkeepalive.Conn, error) {
  30. newConn, err := tcpkeepalive.EnableKeepAlive(conn)
  31. if err != nil {
  32. log.Println("EnableKeepAlive failed:", err)
  33. return nil, err
  34. }
  35. err = newConn.SetKeepAliveIdle(10*time.Second)
  36. if err != nil {
  37. log.Println("SetKeepAliveIdle failed:", err)
  38. return nil, err
  39. }
  40. err = newConn.SetKeepAliveCount(9)
  41. if err != nil {
  42. log.Println("SetKeepAliveCount failed:", err)
  43. return nil, err
  44. }
  45. err = newConn.SetKeepAliveInterval(10*time.Second)
  46. if err != nil {
  47. log.Println("SetKeepAliveInterval failed:", err)
  48. return nil, err
  49. }
  50. return newConn, nil
  51. }
  52. func handleConnection(conn net.Conn) {
  53. defer conn.Close()
  54. newConn, err := setTcpKeepAlive(conn)
  55. if err != nil {
  56. log.Println("setTcpKeepAlive failed:", err)
  57. return
  58. }
  59. var buffer []byte = []byte("You are welcome. I'm server.")
  60. for {
  61. time.Sleep(1*time.Second)
  62. n, err := newConn.Write(buffer)
  63. if err != nil {
  64. log.Println("Write error:", err)
  65. break
  66. }
  67. log.Println("send:", n)
  68. select{}
  69. }
  70. log.Println("connetion end")
  71. }

2.2 client

client端很简单,负责接收数据。

  1. package main
  2. import (
  3. "fmt"
  4. "net"
  5. "os"
  6. )
  7. func main() {
  8. conn, err := net.Dial("tcp", "127.0.0.1:8080")
  9. if err != nil {
  10. fmt.Println("dial failed:", err)
  11. os.Exit(1)
  12. }
  13. defer conn.Close()
  14. buffer := make([]byte, 512)
  15. for {
  16. n, err := conn.Read(buffer)
  17. if err != nil {
  18. fmt.Println("Read failed:", err)
  19. return
  20. }
  21. fmt.Println("count:", n, "msg:", string(buffer))
  22. }
  23. }

3.查看结果

server输出

  1. 019/05/26 22:22:00 rpc listening 0.0.0.0:8080
  2. 2019/05/26 22:22:15 send: 28

client输出

  1. count: 28 msg: You are welcome. I'm server.

通过tcpdump 或者wireshark抓包,可以看到TCP Keep-Alive的数据包发送情况。

4.参考

Using TCP keepalive with Go

github tcpkeepalive

golang tcp keepalive实践的更多相关文章

  1. TCP KeepAlive机制理解与实践小结

    0 前言 本文将主要通过抓包并查看报文的方式学习TCP KeepAlive机制,以此加深理解. 1 TCP KeepAlive机制简介 TCP长连接下,客户端和服务器若长时间无数据交互情况下,若一方出 ...

  2. Ubuntu14.04+RabbitMQ3.6.3+Golang的最佳实践

    目录 [TOC] 1.RabbitMQ介绍 1.1.什么是RabbitMQ?   RabbitMQ 是由 LShift 提供的一个 Advanced Message Queuing Protocol ...

  3. TCP keepalive overview

    2. TCP keepalive overview In order to understand what TCP keepalive (which we will just call keepali ...

  4. 【转载】TCP保活(TCP keepalive)

    下图是我遇到tcp keepalive的例子: 以下为转载: TCP保活的缘起 双方建立交互的连接,但是并不是一直存在数据交互,有些连接会在数据交互完毕后,主动释放连接,而有些不会,那么在长时间无数据 ...

  5. TCP keepalive under Linux

    TCP Keepalive HOWTO Prev   Next 3. Using TCP keepalive under Linux Linux has built-in support for ke ...

  6. TCP keepalive

      2. TCP keepalive overview In order to understand what TCP keepalive (which we will just call keepa ...

  7. TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活

    1. TCP保活的必要性 1) 很多防火墙等对于空闲socket自动关闭 2) 对于非正常断开, 服务器并不能检测到. 为了回收资源, 必须提供一种检测机制. 2. 导致TCP断连的因素 如果网络正常 ...

  8. TCP Keepalive HOWTO

    TCP Keepalive HOWTO Fabio Busatto <fabio.busatto@sikurezza.org> 2007-05-04 Revision History Re ...

  9. 【 总结 】Tcp Keepalive 和 HTTP Keepalive 详解

    TCP Keepalive Tcp keepalive的起源          双方建立交互的连接,但是并不是一直存在数据交互,有些连接会在数据交互完毕后,主动释放连接,而有些不会,那么在长时间无数据 ...

随机推荐

  1. ABAP常用函数归纳

    转至:http://blog.csdn.net/forever_crazy/article/details/17707745 获取当前逻辑系统标识:OWN_LOGICAL_SYSTEM_GET 一.日 ...

  2. 利用python3 爬虫 定制版妹子图mzitu爬取

    在刚开始学爬虫的时候,用来练手的基础爬虫就是爬取各种妹子图片,前几天同时说了这个,便准备随便写一个...最后发现真是三天不练..什么都记不住了!!所以花了政治一天重新写了一个爬虫程序,并且支持按照时间 ...

  3. QQ恶搞 - 卡死对方的手机QQ

    方式1(低端设备有效): 使用方法: 代码: oo0.oo.OOO00.oo.OO00.oo.OO00.oo.OO00.oo.OO00.oo.OO00.oo.OO00.oo.OO00.oo.O00.o ...

  4. wiki部署

      一.准备环节 1.上传软件   [root@web01 tools]# tar xf jdk-8u60-linux-x64.tar.gz -C /application/ [root@web01 ...

  5. linux发行版及版本号

    1991年8月:Linus Torvalds宣布成立Linux            遵行GPL: Kernel:底层监控程序又叫通用程序,即我们所说的操作系统    Kernel的作用:       ...

  6. windows下前端开发环境配置

    nvm安装 多媒体布局 前端自动化构建工具,gulp nvm管理node的版本,npm是node的包管理工具 下载nvm安装包 https://github.com/coreybutler/nvm-w ...

  7. 集合(四) Hashtable

    2.Hashtable Hashtable,顾名思义,哈希表,本来是已经被淘汰的内容,但在某一版本的Java将其实现了Map接口,因此也成为常用的集合类,但是hashtable由于和hashmap十分 ...

  8. Kendo UI for jQuery使用教程:初始化jQuery插件

    [Kendo UI for jQuery最新试用版下载] Kendo UI目前最新提供Kendo UI for jQuery.Kendo UI for Angular.Kendo UI Support ...

  9. Springboot 使用JdbcTemplate

    Springboot 使用JdbcTemplate book package com.draymonder.book.jdbc; public class Book { private Integer ...

  10. python之timeit模块

    timeit模块: timeit 模块定义了接受两个参数的 Timer 类.两个参数都是字符串. 第一个参数是你要计时的语句或者函数. 传递给 Timer 的第二个参数是为第一个参数语句构建环境的导入 ...