基本的TCP ACK说“到x .为止已经收到了所有的字节”。 在选择性ACK中,可以说“收到了字节X-Y和V-Z”。
因此,例如,如果主机发送了10,000个字节,并且在传输过程中丢失了3000-5000个字节,ACK将说“我所有的内容都达到了3000个”。 另一端必须再次发送字节5001-10000,可以说是“得到了1000-2999和5001-10000”
这在高带宽、有损耗(或高延迟)的链路上非常有用。 问题是在特定情况下可能会引起严重的性能问题。 普通的TCP ACK要求服务器处理带儿童手套的高带宽、有损连接(发送500字节、等待、发送500字节、等待等)。 SACK可以准确地知道实际丢失了多少包,从而应对高延迟。
这是可能发生坏事的地方。 攻击者可以让你的服务器长时间保持巨大的重发队列,一次又一次地处理该狗屎。 这可能会占用CPU、占用内存,并消耗过多的带宽。 简单来说,轻量级系统可以向更强大的服务器启动DoS。
如果服务器功能强大且不提供大型文件,则可以完全避免这种情况
如果您主要服务于内部网或其他低延迟用户组,SACK不会为您购买任何东西。 此外,出于安全原因,可以关闭而不影响性能。
如果使用低带宽链路(例如,使用1Mbps或更低的完全随意的经验法则),则SACK可能会导致连接饱和,从而导致正常操作问题,必须关闭。
毕竟,这取决于你。请考虑一下对你所服务的对象、对象的对象以及SACK性能的影响的风险程度。
有SACK及其漏洞here的概要。