【问题标题】:Does listen() backlog affect established TCP connections?listen() backlog 会影响已建立的 TCP 连接吗?
【发布时间】:2015-07-04 16:01:39
【问题描述】:

创建一个将侦听积压设置为最小值的 TCP 套接字作为一种限制新传入连接速率的方式会不会太天真?有问题的服务器工作负载在任何时候都不会期望有很多新连接,而是会花费大量时间来服务于长时间打开的持久连接。似乎新的传入连接不应影响已建立的连接,尽管我无法在任何文本中找到任何明确的答案。失败的新传入连接是否有可能在服务器上使用它接收的数据包创建某种 TCP 流量拥塞,或者它们丢弃的速度是否足够快以至于它对任何缓冲区或网络堆栈的其他部分没有影响?

具体来说,使用的平台是 Linux,虽然它在不同操作系统中的处理方式可能不同,但我希望它们的行为大致相同。

编辑我所说的“相同”是指积压不会影响已建立的连接,尽管我知道 Linux 会在 Windows 发送重置时丢弃它们。

【问题讨论】:

    标签: sockets tcp network-programming


    【解决方案1】:

    listen() backlog 会影响已建立的 TCP 连接吗?

    它影响服务器尚未通过accept(), 接受的已建立连接,只是因为它限制了可以存在的此类连接的数量。

    创建一个将侦听积压设置为最小值的 TCP 套接字作为一种限制新传入连接速率的方式会很天真吗?

    它所要做的就是让一些连接的客户端不必要地失败。无论如何,在您的服务器解决之前,他们不会获得任何服务,并且一旦积压队列填满,他们无论如何都会受到您的服务代码的速率限制。没有特别的理由说明缩短队列会产生任何有益效果。这个想法的另一个问题是,很难确定实际最小值是多少,或者您是否成功地将其设置为积压队列长度。

    似乎新的传入连接不应影响已建立的连接,尽管我无法在任何文本中找到任何明确的答案。

    没错。它没有理由应该影响他们:这就是为什么你不会在任何地方发现它被写下来,就像月相也不会影响它一样。

    失败的新传入连接是否有可能在服务器上使用它接收的数据包造成某种 TCP 流量拥塞

    没有。

    或者它们的删除速度是否足够快以至于对任何缓冲区或网络堆栈的其他部分都没有影响?

    它们没有被丢弃。如果它们不适合积压队列,它们甚至都不会被创建。因此,他们在服务器上的资源消耗为零。

    具体来说,使用的平台是 Linux,虽然它在不同操作系统中的处理方式可能不同,但我希望它们的行为大致相同。

    他们没有。在 Windows 上,当积压队列已满时的传入连接会导致发出 RST。在其他平台上,它会被忽略。

    【讨论】:

    • 谢谢。 > “它们没有被丢弃。如果它们不适合积压队列,它们甚至都不会被创建。因此,它们在服务器上的资源消耗为零。”我觉得这很有趣,因为有一些 Web 资源建议将 backlog 设置为高有助于稍微抵御 DDoS 攻击,但在我看来,尽可能快地为请求提供服务,并防止任何 tcp 数据包的生成,如果有一个巨大的积压会更有益。
    • 我不知道为什么设置高积压会有所帮助,但我没有看到你提到的资源。你能提供一个引用吗?在我看来,积压队列应该用于它的目的:允许客户端在您忙碌时进行连接。防止攻击是防火墙的工作。您应该始终尽可能快地为请求提供服务,而不受攻击的影响。
    • 再次感谢。我意识到一个链接并不构成福音,尽管有问题的链接是freebsd.org/doc/en/books/handbook/…,其中讨论了调整 somaxconn 值。我确实已经在尽可能快地为请求提供服务。
    • 嗯,这是一个不错的来源。可惜没有更多细节。我认为较长的积压队列有效地扩展了服务本身,因此拒绝它变得更加困难。
    【解决方案2】:

    您描述的是几种类型的攻击,例如泛洪攻击、syn 攻击和其他导致拒绝服务的好东西。

    这个话题并不容易,因为保护必须在所有层中实现,包括 TCP。例如 SYN 攻击,摆弄序列号,...。那时有问题的数据包已经走了很长一段路,通过以太网层和IP层,底线是占用资源。因此,如果您的系统受到攻击,攻击数据包就会像好的数据流一样在您的数据流中。您越快检测到数据包有问题并丢弃它越好。通常,受到攻击的系统会变慢。至少是我使用过的系统。

    一些攻击试图通过利用错误使您的系统永久处于故障状态。例如 TCP 有一个接收队列,如果数据包不断地乱序到达,它们将被存储在该接收队列中。如果丢失的数据包永远不会到达,那么这个接收队列可能会继续增长。如果没有适当的防御,这将导致系统完全耗尽资源。

    有专门的工具(例如 codenumicon)来检查 TCP 堆栈实现的漏洞。您可以假设 linux 上的那个已经使用类似的工具进行了适当的测试。

    攻击也可能发生在应用层。如果您有一个 TCP 服务器并且它只允许有限数量的会话。恶意用户可以简单地通过建立所有连接然后不对其进行任何操作来获取所有连接。所以你也必须创造一些防御。天气与否,您将此限制设置得非常低或高都不会改变任何事情。恶意用户会尝试任何事情来关闭您的系统。无论如何,您都需要建立防御。您可以简单地使用 telnet 连接到网络服务器 (HTTP)。如果您不发送任何内容,服务器的防御将发挥作用并关闭连接。

    因此,将可能的连接数量降低到一个低值并认为这本身就是一种保护形式确实是幼稚的。

    失败的新传入连接是否有可能在服务器上使用它接收的数据包造成某种 TCP 流量拥塞,或者它们丢弃的速度是否足够快以至于对任何缓冲区或网络堆栈的其他部分没有影响?

    它们正在使用您机器的资源,会使您的系统运行速度变慢。

    似乎新的传入连接不应影响已建立的连接,尽管我无法在任何文本中找到任何明确的答案。

    如果是普通用户尝试建立连接,即使他一直在做,失败时重试。影响将是微乎其微的,几乎没有。但是恶意用户泛滥连接尝试会对系统性能产生影响,因为系统必须花时间识别那些有缺陷的数据包并尽快丢弃它们。

    【讨论】:

    • TCP 有一个 bounded 接收队列,即套接字接收缓冲区,它是有界的,不会“导致系统完全耗尽资源”。乱序数据包通常只是丢弃而不是存储。
    • 无序数据包仅在超出当前 TCP 接收窗口时才会被丢弃。如果没有这些段的存储,那么发送方将不得不重新传输,依赖于重传计时器,......导致传输速度变慢。能够做到这一点的不是套接字接收队列,而是 TCP 接收队列。套接字层和 TCP 层是 2 个不同的层。
    猜你喜欢
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2016-07-05
    • 2015-03-01
    • 2014-08-30
    相关资源
    最近更新 更多