gen_tcp: accept / 1 безопасно? - PullRequest
       15

gen_tcp: accept / 1 безопасно?

5 голосов
/ 08 декабря 2010

Я реализую сервер, который принимает много одновременных подключений.

Я использовал эту структуру:

loop(Sock) ->
  case gen_tcp:accept(Sock) of
      {ok, CSock} ->    
          fork_handling_process(CSock);
      {error, Reason} ->
          do_something_else();
  end,
  loop(Sock).

Мне интересно, если кто-то отправляет мне SYN, но никогда не отправляет мне SYNACK в ответ на ACK моего сервера, будет ли мой клиент навсегда заблокирован этим клиентом, так как я вызываю gen_tcp: accept без тайм-аута?

Кстати, я думаю, что эту ситуацию трудно подражать, поэтому, пожалуйста, дайте мне знать, если у вас есть способы опробовать ее.

Спасибо заранее.

Ответы [ 2 ]

4 голосов
/ 08 декабря 2010

Когда вы слушаете / принимаете это немного по-другому, как вы описываете:

Некоторый клиент хочет подключиться: он отправляет SYN, затем ваша операционная система отправляет SYN / ACK (erlang не задействован), когда вы получите ACK gen_tcp: accept вернется.

Когда кто-то отправляет вам SYN и ничего больше (это будет атака SYN-флуд, если она выполняется в большом количестве), ресурсы операционной системы будут зарезервированы, но в вашем коде erlang ничего не происходит, потому что трехстороннее рукопожатие еще не завершено.

Многие операционные системы уделяют особое внимание атакам SYN-наводнений, избегая слишком большого потребления ресурсов.

0 голосов
/ 08 декабря 2010

Подход, который вы используете, кажется хорошим.Ваш сервер не будет блокировать.Если что-то пойдет не так, я верю, что ваш ответный процесс получит ошибку, а не сервер.

...