在 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

  • 現代のブログの驚くほど高い賭け金

    結論: 最近、ブログ テクノロジーにどれだけの費用が費やされているかを過小評価している可能性があります。 注: これらの意見のほとんどを私自身の swyxkit スターター テンプレートにまとめました。 読者エクスペリエンス 記事のヘッダーと本文 – 優れたタイポグラフィ – 読みやすく、アクセスしやすく、ブランド化されたスタイル – リッチ メディアの埋め込み (特に YouTube と Twitter の埋め込みだけでなく、Repl/Sandbox の埋め込みも – モバイル ビューに注意) – 脚注 (本文を肥大化させずに追加のコンテキストを追加する非常に優れた方法) – ページネーション用の切り捨てマーカー – コンテンツ トランスクルージョン – コードの構文ハイライト (主なプレーヤー: Prismjs、Highlightjs、Shikijs – 静的な場合に推奨 – CSS/JS 埋め込みは必要ありません) – git diff 表示を含む – 最近これで問題が発生しました – オーバーフロー コード ブロックを必ずテストしてください – 一般に防御的な…

  • Oznakowanie w formie próżniowej i połączenie międzyludzkie

    Na każdej głównej ulicy w Ameryce wisi pewien rodzaj szyldu, widoczny na każdej rampie wyjazdowej z wycieczki i świecący jasno nad drzwiami do naszego lokalnego mechanika samochodowego, salonu i baru. Te plastikowe, błyszczące, podświetlane szyldy po cichu zakorzeniły się w naszej historii i tożsamości kulturowej w USA, czasem bez zastanowienia i rozpoznania, kierując nas do…

  • 飛行機への恐怖 – Kev Quirk

    2026 年 5 月 1 日 私は最近ネイサン・ミルワード著『ロング・ライド・ホーム』を読んでいたのですが、その本の中で彼は飛行機に乗らなければならないことと飛行機への恐怖について次のように語っています。 これは私が避けたかったこと(飛行機に乗るということ)であり、私の飛行機への恐怖は、上空での制御の欠如から生じたものである(と私は思います)。 すべては他人の手に委ねられています。何も悪いことが起こらないことを祈りながら、ただそこに座っていてください。なぜなら、もしそうなったとしても、人生でやるべきこと、やるべきことのすべてを考えている自由落下の瞬間より悪いことは考えられません。物事を正したり、間違いから学ぶにはもう手遅れだからです。あなたの時代がやって来ました、そして今はもう終わりです。これは飛ぶことと同じくらい、後悔することへの恐怖なのだと思いますが。 — ネイサン・ミルワード これ 本当に 仕事で半定期的に飛行機に乗る人にとって、飛行機が怖いと話すと、人々はよく驚かれます。 分からない、多分 恐れ 強すぎる言葉ですが、確かにとても不快な気持ちになります。特に乱気流がある場合。 ネイサンと同じように、それはコントロールの喪失だと思います。はい、そうです、私はバイクに乗っているときや自動車事故で怪我をする可能性がはるかに高いです。しかし、違うのは、車や自転車で事故に遭ったとしても、私はある程度コントロールできており、(特に車の場合)軽い怪我だけで済んでしまう可能性がかなりあるということです。 一方、飛行機事故に遭った場合、私は とても 可能な限り最も恐ろしい方法で死ぬ可能性が高く、それは私を完全に恐怖させます。私の旅行の多くが大西洋を横断するため、広大な水域を越えることが、この状況をさらに悪化させることがよくあります。素晴らしい。 それを克服するには? 神は私が試したことを知っています!私はブリティッシュ・エアウェイズで自信を持って飛ぶコースを受講したことがあり、知識は増えましたが、不安はあまり解消されませんでした。 睡眠薬を試したこともありますが、イギリスで市販されているものはどれもクソで、私にはまったく効果がありません。眠くなることもありません。何人かの人が鎮静剤を勧めましたが、それは私には不快です。それは違法であるだけでなく、彼らが私に何をするのかわかりません。結構です。 私は不安を抱えた飛行家になる運命にあると思うので、ただそれに対処しなければなりません。 数週間後にまたアメリカに行く予定ですが、いつものように不安が私の腹の中で湧き上がり始めています。 ヒントをお持ちの方がいらっしゃいましたら、ぜひお聞かせください。 意見 メールで返信 もっと購読してください! 私の最新のワッフルを読むために何度もここに来る必要はありません。新しいコンテンツを公開するたびに更新情報を受信できるように購読する方法が 2 つあります。 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

  • ongeza Whisper kwenye Kitufe chako cha Kitendo cha iOS

    IPhone mpya ziliacha kitufe cha kunyamazisha halisi na kitufe cha vitendo kilichowezeshwa na programu, ambacho huruhusu ubinafsishaji fulani. kiwango cha juu zaidi cha ubinafsishaji ni Njia za mkato. Unukuzi chaguomsingi wa Apple ni mbaya. Nilipata iPhone mpya hivi majuzi na kwa hivyo hii ndiyo nafasi yangu. Ilinichukua muda kujua jinsi ya kutengeneza njia ya mkato…

Deixe um comentário

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