【问题标题】:TCP Servers: Drop Connection, instead of resetting or responding?TCP 服务器:断开连接,而不是重置或响应?
【发布时间】:2011-11-14 20:02:36
【问题描述】:

在 Node.JS 中是否有可能以这样的方式“删除”连接

  • 客户端永远不会收到响应(200、404 或其他)
  • 永远不会通知客户端连接已终止(永远不会收到连接重置或流结束)
  • 服务器资源被释放(服务器不应尝试以任何方式保持连接)

我特别询问 Solaris 上的 Node.JS HTTP 服务器(实际上只是复杂的 TCP 服务器),但如果在其他操作系统(Windows、Linux)或编程语言(C/C++、Java)上存在这种情况,允许这个,我有兴趣。

我为什么要这个?

惹恼或减慢(可能是单线程)机器人,例如phpMyAdmin Probe

我知道这并不重要,但这些类型的问题可以更好地帮助我了解我的程序的界限。

我知道客户端主机可能会重新传输连接的数据包,因为我从不发送重置。

【问题讨论】:

  • 我不确定,但我认为你可以……不回应。如果您不使用 res.anything(),那么客户端将不会收到任何响应(200、400 等),也不会发送任何标头。
  • 我不确定,但我认为这仍然会占用标记打开连接的操作系统资源,并最终耗尽内存或 TCP 端口。

标签: node.js http tcp solaris


【解决方案1】:

这些在通用 TCP 堆栈中是不可能的(与您自己的自定义 TCP 堆栈相比)。原因是:

  1. 关闭套接字发送 RST
  2. 即使您避免发送 RST,客户端仍然认为连接已打开,而服务器已关闭连接。如果客户端在此连接上发送任何数据包,则服务器将发送 RST。

您可能想要探索为这些机器人设置防火墙,并使用 iptables (linux) 或 solaris 上的等价物来阻止/限制它们的 IP 地址。

【讨论】:

  • 你的 2 号是一个很好的观点。我想我也会看看实时规则添加。我可以为当前连接源和目标 IP 和端口添加一个临时规则。这将导致当前连接上的预期挂起,但仍允许新连接通过。现在我只需要等到我找到软件防火墙,然后我必须决定是否要这样做。
  • 是的,某种实时规则添加在这里很有用。像 apache 这样的网络服务器也有内置的速率限制选项。
【解决方案2】:

关闭连接不应发送 RST。有 3 种方式的拆卸过程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多