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

时间:2015-04-26 07:02:33

标签: sockets tcp network-programming

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

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

编辑我的意思是"同一"是积压不会影响已建立的连接,但我知道Linux会在Windows发送重置时丢弃它们。

2 个答案:

答案 0 :(得分:2)

  

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

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

  

创建一个将侦听backlog设置为最小值的TCP套接字作为速率限制新传入连接的方式是否天真?

它所能实现的只是不必要地使一些连接客户端失败。他们无论如何都不会得到任何服务,直到你的服务器到处都是这样,一旦积压队列填满,他们就会被你的服务代码限制。缩短队列没有特别的原因会产生任何有益的影响。该想法的另一个问题是,很难确定实际最小值是什么,或者您是否成功将其设置为积压队列长度。

  

看来新的传入连接不应该影响已建立的连接,但我无法在任何文本中找到任何确定的答案。

这是正确的。它没有理由应该影响它们:这就是为什么你不会发现它写在任何地方,不仅仅是月相不影响它的事实。

  

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

没有

  

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

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

  

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

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

答案 1 :(得分:0)

您所描述的是多种类型的攻击,例如洪水,同步攻击和其他导致拒绝服务的商品。

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

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

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

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

因此,将可能的连接数量设置为较低的值,并认为这本身就是一种保护形式,这确实是天真的。

  

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

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

  

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

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