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に従って動作することを示しています。
デフォルトでキープアライブをオンにする理由はここにあります: 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));
しかし、これを修正するのは簡単ではありません。
調整可能なノブは存在するはずですが、デフォルトではオフにしておく方が良いかもしれません。
私の推論はこれです。アプリケーション開発者はこの種の決定を誤ってしまう可能性があり、最終的にはシステム管理者がアプリケーション開発者ではなくこの種のネットワークポリシーを制御する必要があります。