0

在 Linux/C++ TCP 服务器中,我需要防止恶意客户端打开多个套接字,否则它们可能会打开数千个连接,直到服务器崩溃。

检查同一台计算机是否已经在服务器上建立连接的标准方法是什么?如果我根据 IP 地址进行操作,那是否意味着同一房子里的两个人即使在不同的计算机上也无法同时连接到服务器?

任何信息都有帮助!提前致谢。

4

2 回答 2

1

除了用于识别客户端的 IP 地址之外,TCP 本身并没有真正提供任何东西。几个(非排他性的)选项:

1) 将来自任何 IP 地址的连接数限制在合理的数量,例如 10 或 20(取决于您的系统实际执行的操作)。这样,它将防止恶意 DoS 攻击,但仍然允许合理的可用性。

2)将最大连接数限制在合理的范围内。

3)您可以将其委托给更高层的解决方案。作为协议的一部分,让客户端发送一个唯一标识符,该标识符仅生成一次(每次安装等)。然而,这很容易被欺骗。

我相信 1 和 2 是处理它的服务器数量。将它们放在配置文件中,以便可以根据场景进行调整。

于 2013-04-28T22:35:23.993 回答
1

除非您有某种订阅/登录系统,否则只有 IP 地址可以作为“这是同一发件人”的基础(但是有人可以尝试一次登录无数次,因为必须有某种握手记录在)。

如果两个客户端使用同一个路由器(使用 NAT 或类似方案),您的服务器将看到相同的 IP 地址,因此每个 IP 地址只允许一个连接对于“来自同一家的多个用户”来说效果不佳. 这也适用于例如他们使用大学网络或公司网络的情况。

因此,根据您提供的内容以及您可以从同一个地方获得多少客户,您可能需要比 10 多一点。当然,如果您在发生这种情况时登录,并且您会看到相当多的“外观”像有效的真实用户无法进入”,您可以调整数字。

具有某种“滚动平均值”也可能有意义,因此您每 Y 秒接受来自每个 IP 地址的 X 个新连接,而不是具有固定的最大数量。如果连接持续相当长的时间,这很有意义......对于短时间的连接,这毫无意义......

于 2013-04-28T22:45:35.300 回答