web-dev-qa-db-ja.com

(なぜ)FreeBSDの「net.inet.tcp.always_keepalive」はRFC1122に違反していますか?

FreeBSDで実行され、TCPを使用するサーバーアプリケーションで作業しているときに、アプリケーションがTCPソケットでSO_KEEPALIVEを明示的に無効にしているにもかかわらず、TCPキープアライブプローブが送信されることに気付きました。

RFC1122セクション4.2.3.6 (TCPキープアライブ)によると:

「キープアライブが含まれている場合、アプリケーションはTCP接続ごとにキープアライブをオンまたはオフにできる必要があり、デフォルトでオフになっている必要があります。」

調整可能なパラメーターnet.inet.tcp.always_keepaliveが有効になっていて(1に設定されている)、無効にするとキープアライブプローブが停止することがわかりました。送信されています。

FreeBSDにこの振る舞いが含まれている理由は何ですか?私の知る限り、LinuxとWindowsにはそのようなオプションはありませんが、FreeBSDとMac OS Xにはそのようなオプションがあるため、RFCに違反しています。

具体的には、どのような状況でアプリケーションの要望を無視するのが理にかなっていますか?

私の場合、このオプションを無効にできるので、これは簡単な修正ですが、なぜそこにあるのかを理解したいと思います。

この質問 は、LinuxがRFCに従って動作することを示しています。

6
Ross Kilgariff

デフォルトでキープアライブをオンにする理由はここにあります: https://svnweb.freebsd.org/base?view=revision&revision=47752

グローバルTCPキープアライブを制御するハンドルを追加し、デフォルトでオンにします。

それらの名前にもかかわらず、TCPセッションを存続させませんが、もう一方の端がAWOLになった場合、それらを強制終了します。これは、NAT、動的IP割り当てを使用するクライアント、または2 ^ 32 * 10 ^ -3秒の稼働時間の上限。

このため、ネットワークトラフィックの検出可能な増加はありません。ライブTCP接続の場合、2時間ごとに2つの最小TCPパケット。

多くのサーバーはすでにキープアライブを有効にしています。

ホスト要件RFCは10年前のものであり、今日のインターネットのクライアントの喪失については知りません。

とにかく、たとえば(Cの場合)アプリケーションから要求された場合は、キープアライブをオフにすることをお勧めします。

int val = 0;
setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(val));

しかし、これを修正するのは簡単ではありません。

7
citrin

調整可能なノブは存在するはずですが、デフォルトではオフにしておく方が良いかもしれません。

私の推論はこれです。アプリケーション開発者はこの種の決定を誤ってしまう可能性があり、最終的にはシステム管理者がアプリケーション開発者ではなくこの種のネットワークポリシーを制御する必要があります。

0
ChrisC