如何在C++中使用Berkeley套接字避免DOS攻击

Dan*_*ham 5 c++ networking denial-of-service nonblocking berkeley-sockets

我正在通过Richard Stevens的UNIX网络编程第1卷工作,并尝试编写使用Telnet协议的TCP Echo客户端.我还处于早期阶段并尝试编写读写函数.

我想把它写成使用I/O Multiplexing和Select函数,因为它需要是多客户端的,我不想尝试学习C++线程,而我正在尝试学习Berkeley套接字库同时.在关于I/O多路复用的章节结束时,史蒂文斯有一小部分关于DOS攻击,他说我计划使用的方法容易受到DOS攻击的影响,只需在连接后发送一个字节然后挂起.之后他提到了3种可能的解决方案 - 非阻塞IO,线程化(输出)以及在I/O操作上设置超时.

我的问题是,还有其他方法可以避免这种攻击吗?如果没有,哪一个是最好的?我浏览了关于操作超时的部分,但它看起来不像我想做的事情.他建议的方法看起来相当复杂,我不知道如何将它们用于我已有的方法.我只看了一眼有关NIO的章节,它看起来就像是现在的方式,但是我想看看是否还有其他方法可以解决这个问题,然后再花几个小时来讨论这一章.

有任何想法吗?

pil*_*row 3

...还有其他方法可以避免这种攻击吗?

是的,异步 I/O是另一种通用方法。

如果问题是阻塞read()可能会无限期地暂停你的执行,那么你的一般对策是:

  1. 有多个执行线程

    多线程,多进程,两者兼而有之。

  2. 限制阻塞操作的时间

    例如,瞬时(非阻塞 I/O),或非瞬时(SO_RCVTIMEOalarm()等)

  3. 异步操作

    例如,aio_read

...其中哪一个最好?

对于新手,我建议将非阻塞 I/O 与限时select()/相结合poll()。您的应用程序可以跟踪连接是否在“足够短的时间内”生成了“足够的数据”(例如,整行)。

这是一种功能强大、可移植且常用的技术。

然而,更好的答案是“这取决于情况”。平台支持,更重要的是,这些选择的设计影响必须根据具体情况进行评估。