在 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

  • अपने दिन को वश में करने का मज़ेदार तरीका

    ब्लॉग में स्लेवेन द्वारा – मार्च 8, 2026 नया फाइनलिस्ट यहाँ है! यदि आपने इसे अभी तक आज़माया नहीं है, तो इसमें अपना हाथ डालें: जो आप पहले से उपयोग कर रहे हैं उसके साथ फ़ाइनलिस्ट चलाएं और इसे चुपचाप वह लेने दें जो आपका वर्तमान सेटअप नहीं करता है। यह किसी नए सिस्टम से…

  • ஆப்பிள் வெள்ளிக்கிழமை இரவு பேஸ்பால் கவரேஜுக்கு ஐபோன்களைச் சேர்க்கிறது – ஆறு வண்ணங்கள்

    டோட்ஜர் ஸ்டேடியத்தில் ஒரு ஆரஞ்சு தொலைபேசியை கற்பனை செய்து பாருங்கள். (ஆப்பிள் டிவி+) ஆச்சரியம்! கடந்த வெள்ளிக்கிழமை, ஆப்பிள் டிவியின் வெள்ளிக்கிழமை இரவு பேஸ்பால் ஒளிபரப்பு ஜயண்ட்ஸ் மற்றும் டோட்ஜர்ஸ் ஐபோன் 17 ப்ரோவில் எடுக்கப்பட்ட பல காட்சிகளைக் கொண்டிருந்தன. சீசனின் இறுதி வெள்ளிக்கிழமை இரவில், இன்றிரவு புலிகள்-சிவப்பு சாக்ஸ் விளையாட்டின் போது (இரவு 7 மணி) நிறுவனம் மீண்டும் மீண்டும் செய்யும். ஆப்பிளின் கூற்றுப்படி, ஃபென்வே பூங்காவில் நான்கு ஐபோன் 17 சாதகங்கள் நிலைநிறுத்தப்படும் –…

  • 用 Go 編寫的 Parrot AR 無人機 2.0​​ 固件 Felix Geisendörfer

    GoDrone – 用 Go 編寫的 Parrot AR 無人機 2.0​​ 固件 · Felix Geisendörfer 發表: 2013 年 12 月 25 日 大家聖誕快樂(或者牛頓聖誕,如果你願意的話)。 今天,我很高興發布我最喜歡的副項目 GoDrone 的第一個版本。 GoDrone 是 Parrot AR Drone 2.0 的免費軟件替代固件。是的,這有望使其成為 Go 垃圾收集器的第一個機器人可視化工具:)。 此時,固件已經足夠好,可以飛行並提供基本的姿態穩定(使用簡單的互補濾波器+PID控制器),所以我真的很想從任何喜歡冒險的AR無人機所有者那裡得到反饋。我為 OSX/Linux/Windows 提供二進制安裝程序: http://www.godrone.io/en/latest/index.html 但您也可以選擇從源安裝。 根據最初的反饋,我很樂意將 GoDrone 變成官方固件的可行替代品,並為機器人軟件的開髮帶來一些新鮮空氣。我特別想展示的是,網絡技術在為機器人提供用戶界面的成本和用戶體驗方面可以與本地移動/桌面應用程序相媲美,而且我還想推廣使用高級語言在 Linux 驅動的機器人中進行固件開發的想法。 如果您有興趣,請確保加入郵件列表/在 IRC 中打個招呼: http://www.godrone.io/en/latest/user/community_support.html ——菲利克斯·蓋森多夫 通過 RSS 或電子郵件訂閱此博客,或者通過以下方式獲取我的小更新 嘰嘰喳喳。 請啟用 JavaScript 以查看…

  • レビュー: 夜行列車 (マーティン・エイミス)

    夜行列車 マーティン・エイミス著は、ジェニファー・ロックウェルの自殺の動機を解明する任務を負った女性刑事、マイク・フーリハン刑事の視点から語られるノワール探偵小説です。 構造的には、それ自体の仕組みや構造を継続的に妨害します。伝統的な探偵小説は通常、すべての動機と動きが説明されるまで各部分を組み立てますが、アミスは代わりに、誰かが死んだという基本的な事実以外のすべてが議論の余地があるように見える点に到達するまで、新しい情報のそれぞれが物事を切り開くスペースを作成します。 私にとって印象に残ったのは、意味と理解を求める絶え間ない戦いでした。これを念頭に置いて、私はジル・ドゥルーズとフェリックス・ガタリの再領土化と脱領土化に関する議論について考えさせられました。これを念頭に置くと、探偵は再領土化のエージェントです。彼らは混沌とした「逃走経路」(殺人事件、失われた手がかり)を取り込み、事件、動機、有罪判決を中心に展開する厳格な構造に引き戻します。で 夜行列車フーリハンはこれを試みます。しかし、ジェニファー・ロックウェルの自殺は、純粋な領土解除として機能します。ジェニファーは美しさ、知性、愛、そして職業上の成功など、「すべて」を持っていました。 「なぜ」を取り除くことで、彼女の死は探偵の論理に捉えられることを拒否する。マイクが調査すればするほど、構造物は崩壊していきます。 ある死の調査を見て、ガヤトリ・スピヴァクのエッセイも思い出した サバルタンは話せるのか?その中で彼女は、不法妊娠が動機ではないことを証明するために生理が来るのを待って自殺したブヴァネスワリさんの自殺について論じている。それにもかかわらず、彼女の動機は依然として歴史の中に埋もれており、当時の支配的な物語に置き換えられました。 ある意味、ジェニファー・ロックウェルも同様の演技をしています。彼女はサバルタンではなく「エリート」であるにもかかわらず、特に静かな死を選択します。フーリハンはスピヴァクの枠組みの中で「知識人」として行動し、ジェニファーの「なぜ」を代表または説明しようとしている。動機(「再領土化」)を見つけようとすることで、フーリハンは本質的に、沈黙する人々に発言を強制しようとしている。 意味が崩壊するもう一つの方法は、本全体に繰り返し現れる「夜行列車」の比喩です。繰り返しのたびに、バックグラウンドノイズから、チープなブルースのサウンドトラック、宇宙論的自殺車両、そして最後に、マイク自身の半ば選択された暗闇への乗り物まで、さまざまな展開が加えられます。結局、それは死んだ比喩のようなものになり、すべてと何も同時に捉えられなくなります。 マーティン・エイミスの本を勉強したことを漠然と覚えています。 夜行列車 大学で。優等論文の途中で、あまり時間を割いていなかったと感じたので、戻りたいと思います。それは間違いなく、物事を新しい観点から見ることになります、私が見た後に触れたもの 養蜂家。ポール・オースターの作品と並べて考えるのも面白かったです。 ニューヨーク三部作、それ自体の構造と意味を一見覆すように見える別の小説。トマス・ピンチョンの作品もそうですが、 メイソン&ディクソン そして、一見解体されているように見えながら、意味が継続的に作られていく方法。 リンダ・ハミルトンの朗読をSpotifyで聴きました。 レビュー: 夜行列車 (マーティン・エイミス) Aaron Davis による作品は、クリエイティブ コモンズ表示 – 継承 4.0 国際ライセンスに基づいてライセンスされています。 Source link

  • 评论:多动症很棒(佩恩和金·霍尔德内斯)

    多动症很棒,作者:Penn 和 Kim Holderness(屡获殊荣的创作者、播客主持人以及《电视连续剧》第 33 季的获奖者) 惊人的竞赛),是一个有趣的,研究丰富的(他们不是医生(1)),以及对 ADHD 从“缺陷”到差异的深度个人重构。 本书结构分为三部分: 了解多动症 – 如何诊断多动症,“断奏”大脑中发生了什么,以及它在现实生活中的各种表现方式。 改变叙述 – 挑战耻辱,拥有优势,将注意力缺陷多动症视为“一种解释,而不是借口”,并提供一个新名称“VAST”(可变注意力刺激特质)。(2)) 蓬勃发展的策略 – 实用的例程、工具和关系习惯,用于管理分心、情绪调节和日常生活,同时培养创造力、高度专注和幽默感。 听有声读物(通过 Libby)很有用,因为佩恩和金用自己的声音叙述,突出了多动症患者和支持他们的伴侣之间的对比。 这本书引起我共鸣的是对与多动症相关的挑战的更深入的认识。佩恩谈到了很多日常干扰,从忘记在咖啡机下面放一个杯子,导致咖啡洒得到处都是,到带着太阳镜、DVD 和篮球针从塔吉特 (Target) 回家,但没有吃牛油果。他还生动地描述了“头脑中多动症的声音”:再次把钥匙留在车顶上的耻辱,或者小时候因为被要求把鞋子收起来这样的小事而崩溃,然后感觉自己“崩溃了”,而不是一个有合法大脑差异的人。与此同时,佩恩和金都不断强调,注意力缺陷多动症对每个人的表现都是不同的:正如金所说,“我们的经历就是这样:我们的经历……注意力缺陷多动症的荣耀之一就是它的表现与患有它的人一样独特”。 我开始思考莉兹·怀斯曼的书 乘数 以及“意外减少”,即所谓的善行可能会产生负面后果。例如,怀斯曼谈到领导者“设定节奏”、勇往直前并完成工作,而不是分配任务。 作为领导者,有时我们跑得越快,别人走得越慢。当领导者设定步伐时,他们更有可能创造旁观者而不是追随者。 来源: 乘数 通过莉兹·怀斯曼 考虑到注意力缺陷多动症,感觉就像有一个持续存在的问题,即知道何时挑战特定行为以及何时放手是慢性救援。正如他们在书中解释的那样,“多动症是一种解释,而不是借口。”问题是支持建立能力还是仅仅建立依赖? 在课堂上,我发现一个巨大的挑战,即如何移动与神经发散的学生相关的界限,以及如何适应严格的规则和结构。与“问题”主要是关于整洁、偏好或严格遵守并非考虑到神经分歧而构建的僵化结构时相比,区分伤害他人、侵蚀信任或阻碍学习者自身成长的行为模式非常重要。 以下是从书中摘录的支持多动症患者的具体方法: 了解他们的经验并进行验证:当多动症引起问题时,说“哇,太糟糕了”而不是“你应该……”,以减少羞耻感并增加联系。 在解决方案之前提供同理心:首先要建立联系,然后在情绪得到调节后解决问题。 伸出实际的援助之手:帮助澄清优先事项,分解任务,或者在他们不知所措时悄悄地介入,而不是等待他们提出要求。 使用温和的提醒和外部支持:主动帮助建立系统:列表、日历、电话提醒、书面说明——然后让他们自己运行这些系统(“如果你能写下来,就永远不要试图记住一些东西”)。 调整期望并“为你所拥有的人提供父母/伴侣”:特别是对于孩子,区分多动症症状和顽固,并重新思考他们的“成功”应该是什么样子(“养育你的孩子”)。 分担责任并委派,不要牺牲自己:如果你是主要的支持者,请在杂务、杂乱和后勤方面寻求帮助,这样你就不会精疲力尽,并有意识地委派任务,而不是默默地做所有事情(“多动症夺走了一个村庄”)。 注意并赞扬努力和优势:指出他们擅长哪些方面,以及他们的多动症特征何时成为资产(创造力、幽默、忠诚、思维敏捷)。这强化了“多动症很棒”作为一个活生生的现实,而不仅仅是一个口号。 评论:多动症很棒(佩恩和金·霍尔德内斯) 作者 Aaron Davis 已获得 Creative Commons Attribution-ShareAlike 4.0 International License 的许可。 Source…

Deixe um comentário

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