2010-08-09 64 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個字節傳遞,這樣你只需要對該數字進行解碼並保持讀取直到經過的字節數。對客戶端和服務器都這樣做,它會使你的代碼變得更簡單。

相關問題