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的章节,它看起来就像是现在的方式,但是我想看看是否还有其他方法可以解决这个问题,然后再花几个小时来讨论这一章.
有任何想法吗?
...还有其他方法可以避免这种攻击吗?
是的,异步 I/O是另一种通用方法。
如果问题是阻塞read()可能会无限期地暂停你的执行,那么你的一般对策是:
多线程,多进程,两者兼而有之。
例如,瞬时(非阻塞 I/O),或非瞬时(SO_RCVTIMEO、alarm()等)
例如,aio_read
...其中哪一个最好?
对于新手,我建议将非阻塞 I/O 与限时select()/相结合poll()。您的应用程序可以跟踪连接是否在“足够短的时间内”生成了“足够的数据”(例如,整行)。
这是一种功能强大、可移植且常用的技术。
然而,更好的答案是“这取决于情况”。平台支持,更重要的是,这些选择的设计影响必须根据具体情况进行评估。
| 归档时间: |
|
| 查看次数: |
2431 次 |
| 最近记录: |