Tcp_rfc1337設定には、TIME-WAIT暗殺の解決策があるようです。
最初の問題は、古い接続データが新しい接続で誤って受け入れられ、送信データが破損することです。
2番目の問題は、古い重複パケットが新しい接続に入って非同期になるため、接続が非同期になり、ACKループに入る可能性があることです。
3番目および最後の問題は、古い重複パケットが新しく確立された接続に誤って入り、新しい接続を強制終了する可能性があることです。
私が読んだことから、問題を解決するために、設定はソケットがTIME-WAIT状態にある間はRST(リセット)パケットを無視するです。
では、なぜこの設定がデフォルトで有効になっていないのですか?これを使用するデメリットは何ですか?
SYNフラッディング攻撃の阻止について調査しているときに、この変数について実際に知りました。この設定はそれらの停止に役立つと思いますか?
グレッグのコメントに同意します。 RFC 1337 は情報提供のみのRFCであり、TCP標準の一部ではありません。本番ネットワークで予期しない変更が行われないようにするために、この機能はデフォルトで無効になっており、ネットワーク管理者に任せて、テストで有効にするかどうかを決定します。
TIME-WAITでソケットのRSTパケットをドロップしても、のようには見えませんが否定的な結果をもたらすわけではありませんが、何もないという意味ではありません-おそらく完全に調査されていない奇妙なエッジケース。
興味深いことに、tcp_rfc1337の kernel documentation は正しくないようです。
tcp_rfc1337 - BOOLEAN
If set, the TCP stack behaves conforming to RFC1337. If unset,
we are not conforming to RFC, but prevent TCP TIME_WAIT
assassination.
Default: 0
このオプションが設定されている場合、RFC 1337に準拠してRSTパケットをドロップし、TIME-WAITアサシネーションを防止します。このオプションが設定されていない場合(デフォルト)、RFC 1337に準拠していないため、TIME-WAITアサシネーションが発生する可能性があります。
私は kernel source code を見つけました、そして私にとってはドキュメントは正しいです:デフォルト= 0:kill
if (th->rst) {
/* This is TIME_WAIT assassination, in two flavors.
* Oh well... nobody has a sufficient solution to this
* protocol bug yet.
*/
if (sysctl_tcp_rfc1337 == 0) {
kill:
inet_twsk_deschedule_put(tw);
return TCP_TW_SUCCESS;
}
}
デフォルトは意味があります。RFCは情報提供であるため、このノブ(値= 1)を設定してそれに準拠する必要があります。