为什么net.ipv4.tcp_rfc1337默认启用?

tcp_rfc1337设置似乎有一个TIME-WAIT暗杀的解决scheme。

第一个问题是旧的重复数据可能在新的连接中被错误地接受,导致发送的数据被破坏。
第二个问题是,由于旧的重复数据包进入新的连接,连接可能变得不同步并进入ACK循环,这将变得不同步。
第三个也是最后一个问题是旧的重复数据包可能会错误地input新build立的连接并终止新的连接。

从我所读到的问题来看,要解决这个问题,设置在套接字处于TIME-WAIT状态时忽略RST(重置)数据包

那么,为什么这个设置默认是启用的呢? 使用这个有什么缺点?

当我研究阻止SYN泛滥攻击时,我实际上已经了解了这个variables。 你认为这个设置有助于阻止它们吗?

我同意格雷格的评论。 RFC 1337仅是一种信息RFC,而不是TCP标准的一部分。 为了确保生产networking中没有任何意外的变化,默认情况下保持此function处于禁用状态是有意义的,并将其留给networkingpipe理员决定是否要启用它以进行testing。

在TIME-WAIT中为套接字丢弃RST数据包似乎不会有任何负面影响,但这并不意味着没有任何 – 也许是一个奇怪的边缘情况,尚未完全探索。

有趣的是,tcp_rfc1337的内核文档看起来是不正确的:

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 Assassination。 如果选项未设置(默认),我们不符合RFC 1337都易受TIME-WAIT暗杀。

我find了内核源代码和我的文档是正确的:默认= 0:杀

  if (sysctl_tcp_rfc1337 == 0) { kill: inet_twsk_deschedule_put(tw); return TCP_TW_SUCCESS; } 

默认值是有意义的:RFC是信息性的,所以你必须设置这个旋钮(值= 1)以符合它。