何时closuresTCP SACK?

我一直在看Linux调整参数,看看SACKclosures的一些configuration。 任何人都可以解释吗?

这将是一个繁忙的networking服务器调整。

一个基本的TCP ACK说:“我收到所有字节到X. select性的ACK允许你说“我收到了字节XY和VZ”。

所以,举例来说,如果一个主机发送了10000个字节,3000-5000个字节在传输中丢失,ACK会说“我把所有的东西都提高到了3000个”。 另一端将不得不再次发送字节3001-10000。 SACK可以说“我有1000-2999,5001-10000”,主机只发3000-5000。

这是一个高带宽,有损(或高延迟)链接。 问题是在特定情况下会造成严重的性能问题。 正常的TCP ACK会使服务器处理与小孩手套的高带宽,有损连接(发送500字节,等待,发送500字节,等待等)。 SACK让它适应高延迟,因为它确切知道有多less数据包实际上丢失了。

这是坏事发生的地方。 攻击者可以强制你的服务器长时间保持一个大规模的重发队列,然后一遍又一遍地处理那整个死亡的事情。 这可以挂住CPU,吃掉RAM,消耗更多的带宽。 简而言之,轻量级系统可以针对更强大的服务器启动DoS。

如果你的服务器是健壮的,并不提供大型文件,你已经很好地绝缘了。

如果您主要服务于内部网或其他低延迟用户群,则SACK不会向您购买任何产品,并且可以出于安全原因而closures,而不会造成任何性能损失。

如果您使用的是低带宽链接(假设完全是任意的经验法则,则为1Mbps或更低),则SACK可能会导致正常操作中的问题,因为您的连接饱和,应该closures。

最终,这取决于你。 考虑你正在服务的对象,从哪个angular度来衡量你对SACK的性能影响的风险程度。

这里有一个关于SACK和它的漏洞的很好的概述。

TCP SACK常常被禁用的另一个原因是,networking设备数量惊人,无法正确处理此选项。 我们一直使用我们提供的使用TCP的高速文件传输产品来看待这一点。 最常见的问题是网关设备对networking设备从内部networking到外部的TCP数据包进行序列号随机化,但不能“随机化”可能从远端发送的TCP SACK选项结束。 如果实际的SACK值没有被这些设备转换回适当的值,那么当远程端试图使用SACK来获得select性的ACK好处时,TCP会话永远不会完成面对数据包丢失。

如果人们更积极地将预防性软件维护应用到这个设备上,那么这可能不是一个问题,但他们往往不这样做。

我可以从痛苦的经验中确认,当使用某些思科ASA防火墙设备时,tcp_sack = 1会导致通过sftp / rsync / scp等文件超过12mb的数据传输停止。

每一次都会停滞不前。

我们在两个不同的数据中心通过主机A和主机B之间的专用100Mbps链路进行传输,都使用思科防火墙和交换机硬件与centos。

这可以通过修改缓冲区大小来缓解 – 例如,除非将sftp缓冲区设置为2048,否则我无法通过sftp从主机A向主机B传输1GB文件,但是我可以不pipe主机B是否将文件从A中拉出来。

使用rsync和发送/接收缓冲区调整的同一个文件的实验使我能够在从A到B推送的1GB文件的70mb左右起来。

但是,最终的答案是禁用主机A上的tcp_sack。最初通过在内核中设置tcp_sack = 0 – 但最终 – 我将其添加到我的/etc/sysctl.conf