在 Go 中使用 TCP keepalive · Felix Geisendörfer

在 Go 中使用 TCP keepalive · Felix Geisendörfer


在 Go 中使用 TCP keepalive · Felix Geisendörfer

发表:

如果您曾经编写过一些 TCP 套接字代码,您可能会想:“如果拔掉网线或远程计算机崩溃,我的连接会发生什么情况?”。

简短的回答是:什么也没有。连接的远端将无法发送 FIN 数据包,本地操作系统也不会检测到连接丢失。因此,由您作为开发人员来解决这种情况。

在 Go 中,您可以使用多种方法来帮助解决此问题。也许第一个要考虑的是 SetReadDeadline net.Conn 接口的方法。假设您的连接预计会定期接收数据,您可以简单地将超时读取视为相当于 io.EOF 错误和 Close 连接。许多现有的 TCP 协议通过定义某种心跳机制来支持这种错误处理方式,该机制要求每个端点定期发送 PING/PONG 探测,以便检测网络问题以及服务运行状况1。此外,此类心跳还可以帮助处理寻找网络活动以确定连接健康状况的代理服务器。

因此,如果您的协议支持心跳,或者您有能力将心跳添加到自己的协议中,那么这应该是解决未插入网线场景的首选。

但是,如果您无法控制协议并且不支持心跳,会发生什么情况?

现在是时候了解 TCP keepalive 以及如何在 Go 中使用它了。 TCP keepalive 在 RFC 1122 中定义,并不是 TCP 规范本身的一部分。可以为单个连接启用它,但默认情况下必须关闭。启用它将导致网络堆栈在默认持续时间(必须不少于两个小时)后探测空闲连接的运行状况。探测数据包将不包含任何数据2,并且未能回复单个探测不能被解释为死连接,因为单个探测数据包没有可靠地传输。

Go 允许您使用以下命令启用 TCP keepalive net.TCPConn的 SetKeepAlive。在 OSX 和 Linux 上,这将导致在连接空闲 2 小时后以 75 秒的间隔发送最多 8 个 TCP keepalive 探测。或者换句话说, Read 将返回一个 io.EOF 2 小时 10 分钟后出现错误 (7200 + 8 * 75)。

根据您的应用程序,超时可能会太长。在这种情况下你可以打电话 SetKeepAlivePeriod。然而,目前此方法对于不同的操作系统表现不同。在 OSX 上,它将修改发送探测之前的空闲时间。然而,在 Linux 上,它将修改空闲时间以及发送探测的时间间隔。所以打电话
SetKeepAlivePeriod 使用 30 秒的参数将导致 OSX 上的总超时为 10 分 30 秒 (30 + 8 * 75),但在 Linux 上将导致 4 分 30 秒 (30 + 8 * 30)。

我发现这种情况相当令人不满意,因此我最终创建了一个名为 tcpkeepalive 的小包,它可以为您提供更多控制:

kaConn, _ := tcpkeepalive.EnableKeepAlive(conn)
kaConn.SetKeepAliveIdle(30*time.Second)
kaConn.SetKeepAliveCount(4)
kaConn.SetKeepAliveInterval(5*time.Second)

目前仅支持 Linux 和 OSX,但我很乐意合并其他平台的拉取请求。如果 Go 核心团队有兴趣,我也会尝试将这些新方法贡献给 Go 本身。

如果您认为本文有用、有任何疑问或发现任何错误,请告诉我,以便我纠正它们。

附录

  1. 调整心跳机制以尽早检测故障并降低误报率是一件棘手的事情。查看 phi 应计故障检测器以获得统计上合理的模型,以及 Damian Gryski 的 go-failure 实现。不幸的是,我无法想到将它与 TCP keepalive 一起使用。

  2. 根据 RFC 1122,保活探针可能包含单个垃圾八位组,以与损坏的实现兼容。但是,我不确定这是否被操作系统网络堆栈过滤掉,如果您知道,请发表评论。

——菲利克斯·盖森多夫


通过 RSS 或电子邮件订阅此博客,或者通过以下方式获取我的小更新 叽叽喳喳。





Source link

Postagens Similares

  • ОБЗОР: Пустая доска почета — школьные мемуары (Мартин Фланаган)

    Пустая доска почета – это мемуары Мартина Фланагана о его опыте в школе и церкви, замешанном в сексуальном насилии. Это произошло после того, как Фланаган услышал, как многие люди описывают переживания, которые не коррелировали с его собственными. Поэтому он решил вернуть свою собственную историю, а не позволять более простым повествованиям других определять ее. Однажды я…

  • 弱人工智能与强人工智能的推出

    企业人工智能的强劲部署与糟糕的部署有何区别 2026 年 4 月 19 日  学习率调度… 我亲眼见证了许多 Anterprise AI 的推出并提供了帮助。有些很出色,但大多数(即使在 2026 年)却出奇的糟糕。 我一直在思考并试图总结我认为主要的区别是什么,我认为这是最大的区别。 弱人工智能的推出 我看到的 90% 以上的薄弱部署基本上都归结于董事会和/或高级领导层的说法,例如: 高度鼓励人工智能的使用。每个人都应该尽可能多地使用人工智能,让自己变得更加高效和有效。您的绩效评估的一部分将基于您使用人工智能的程度。 (沉默) 没有指导 该怎么办 与人工智能。如何整合它。 AI 可以与哪些内部系统进行对话。 ETC。 只是一个模糊的笼统声明。 强大的人工智能推出 我从成功的人工智能推广中看到的情况截然不同。他们: 指派一个人或一个团队全职创建内容和文档并在部署过程中提供帮助 明确哪些内部工具可供员工的人工智能使用 给出工作流程示例 创建短片,解释如何设置并展示其在现实情况下的工作情况 我见过的最先进的公司甚至创建了一个内部人工智能工具,其中包含大量已配置的工具。 所以基本上主要的区别是空心指导与实心指导。 不要只是说“使用人工智能”。 相反,要弄清楚员工如何以实用且有用的方式将人工智能工具连接到公司的应用程序。 并创建并分享示例。 Source link

  • Ulubiona piątka: Queer Black YA Horror

    Karmię ją bestią Jamison Shea Martwe dziewczyny chodzą i pogrzeby są dla żywych Sami Ellis Zabranie Jake’a Livingstona Ryan Douglass Nie powinieneś dziś umrzeć Kalynn Bayron DOE Rebecca Barrow Bonus: To wszystko są powieści, ale w „Wszystkich zatopionych duszach: czarnym” znajdziesz jeszcze więcej… Kontynuuj czytanie Ulubiona piątka: Queer Black YA Horror → Source link

  • XOXO এক্সপ্লোর · ব্লগ · XOXO চালু করা হচ্ছে

    2015 সালে, XOXO তৈরির চার বছর পরে, আমরা সিদ্ধান্ত নিয়েছিলাম যে উৎসবের একটি সঠিক ওয়েবসাইট ছিল। ততদিন পর্যন্ত, আমরা প্রতি বছর তিনটি সম্পূর্ণ আলাদা মিনি-সাইট ডিজাইন ও তৈরি করছিলাম: একটি আমাদের তারিখ ঘোষণা করার জন্য, দ্বিতীয়টি আমাদের লাইনআপ প্রকাশ করার জন্য এবং রেজিস্ট্রেশন খোলার জন্য এবং তৃতীয়টি অংশগ্রহণকারীদের সাথে আমাদের সময়সূচী শেয়ার করার জন্য৷ যদিও…

  • ਮਨਪਸੰਦ ਪੰਜ: ਸਪੈਕਿਊਲੇਟਿਵ ਫਿਕਸ਼ਨ ਸਟਾਰਿੰਗ ਟ੍ਰਾਂਸ ਮੈਨ

    ਐਡਵਰਡ ਅੰਡਰਹਿਲ ਫਿਊਚਰ ਫੀਲਿੰਗ ਦੁਆਰਾ ਜੋਸ ਲੇਕ ਰੂਲਜ਼ ਫਾਰ ਗੋਸਟਿੰਗ ਦੁਆਰਾ ਸ਼ੈਲੀ ਜੇ ਸ਼ੋਰ ਨੋਟਸ ਦੁਆਰਾ ਆਈਜ਼ੈਕ ਫੈਲਮੈਨ ਦੁਆਰਾ ਦ ਥਰਟੀ ਨੇਮਜ਼ ਆਫ਼ ਨਾਈਟ ਦੁਆਰਾ ਜ਼ੈਨ ਜੌਖਦਾਰ ਦੁਆਰਾ ਇਨ-ਬਿਟਵੀਨ ਬੁੱਕ ਸਟੋਰ Source link

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *