listen() 积压是否影响已建立的 TCP 连接?

Does listen() backlog affect established TCP connections?

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

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

编辑 "same" 我的意思是积压不会影响已建立的连接,尽管我确实理解 Linux 丢弃它们而 Windows 发送重置。

Does listen() backlog affect established TCP connections?

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

Would it be naive to create a TCP socket with a listen backlog set to minimum as a way of rate limiting new incoming connections?

它所能完成的只是让一些连接的客户端不必要地失败。他们不会得到任何服务,直到您的服务器无论如何都可以使用它,并且一旦积压队列填满,他们无论如何都会受到您的服务代码的速率限制。没有特别的理由说明为什么缩短队列会产生任何有益效果。这个想法的另一个问题是,不容易确定实际的最小值,或者您是否成功将其设置为积压队列长度。

It appears that new incoming connections shouldn't affect established connections, though I've been unable to find any definitive answer in any text.

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

Is it possible for failed new incoming connections to create some kind of TCP traffic congestion on the server with the packets it's receiving

没有

or are they dropped fast enough that it has no effect on any buffers or other part of the network stack?

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

Specifically the platform in use is Linux, and although it may be handled differently in different OSs, I expect them to all behave roughly the same.

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

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

这个题目并不容易,因为要在所有的层都进行保护,包括TCP。例如 SYN 攻击,摆弄序列号,...。那时,有问题的数据包已经走了很长一段路,通过以太网层和 ip 层,最重要的是它正在占用资源。因此,如果您的系统受到攻击,攻击数据包就会像好的数据包一样出现在您的数据流中。检测到数据包有故障并丢弃它的速度越快越好。通常受到攻击的系统会变慢。好吧,至少我使用过的系统。

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

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

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

所以把可能的连接数降低到一个较低的值,并认为这本身就是一种保护形式,确实很幼稚。

Is it possible for failed new incoming connections to create some kind of TCP traffic congestion on the server with the packets it's receiving or are they dropped fast enough that it has no effect on any buffers or other part of the network stack?

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

It appears that new incoming connections shouldn't affect established connections, though I've been unable to find any definitive answer in any text.

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