2010-08-09 65 views
5

当我使用recv从Windows套接字确实使用recv是否会导致拒绝服务攻击? 如果它永远等待数据?那么,什么是解决的最佳方式(报警?)避免拒绝服务攻击

感谢&问候,

像老鼠。

回答

3

您似乎误解了拒绝服务的含义。一个例子是大量的HTTP请求到达一个单一的网络服务器,速度达到这样一个速率,即网络服务器软件变得如此繁忙以至于无法接受新的TCP连接。维基百科在DoS上有一篇不错的文章,请阅读。

recv(2)只是一个API。与其他任何错误一样,滥用它可能会导致问题,包括DoS。但这并不意味着你应该避免它。如果您的问题在等待读取时阻止了其他套接字,请查看非阻塞套接字I/O复用,如select(2),poll(2)epoll(4)

+1

是的我想知道我是否使用recv()是否会导致DoS?由于服务器可能会等待很长时间。例如,如果我的邮件大小非常大。 – mousey 2010-08-09 01:52:58

+0

请注意,可以在套接字上设置超时,并在recv上设置最大缓冲区大小,因此滥用的机会可能会受到限制。我想如果你有一个单独的进程,一个不需要的对等可以缓慢地向你发送大量的字节作为拒绝服务攻击。 – MZB 2010-08-09 03:24:12

1

是的,recv()可以无限期阻止。你需要实现某种超时。我想推荐使用boost asio library。它包括诸如与套接字连接无缝工作并接收事件的定时器之类的东西。只需设置一个异步套接字,添加一个计时器,如果时间用完就中断。

这仍然不会使您免于DoS攻击,因为在超时窗口期间仍然会涌入大量请求。但是如果你设置的超时时间很短,可能会有所帮助。

1

如果您正在使用阻塞套接字,请查看使用SO_SNDTIMEO和SO_RCVTIMEO setsockopt()选项调整send()和recv()超时。

创建一个合适的服务器有很多复杂性,我会考虑通过乞讨,借用或窃取这个服务器来获取。这是一个sample multithreaded socket server

此外,如果你有双方控制(客户端和服务器套接字软件),我会创建一个协议,消息的长度作为消息的前2或4个字节传递,这样你只需要对该数字进行解码并保持读取直到经过的字节数。对客户端和服务器都这样做,它会使你的代码变得更简单。

相关问题