2010-12-08 7 views
5

Estoy implementando un servidor que acepta muchas conexiones concurrentes.es gen_tcp: accept/1 safe?

que utiliza esta estructura:

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

Me pregunto si alguien me envía un SYN, pero nunca me envía un ACK SYN en respuesta a mi ACK servidor, será mi servidor se bloqueará para siempre por ese cliente ya Llamo a gen_tcp: aceptar sin tiempo de espera?

Por cierto, creo que esta situación es difícil de emular, así que por favor avíseme si tiene formas de probarla.

Thx de antemano.

Respuesta

4

Cuando escuchas/aceptar que es un poco diferente, ya que describes:

Algunos cliente desea conectarse: envía un SYN, su sistema operativo envía un SYN/ACK (Erlang no involvled), cuando llegue el ACK gen_tcp: accept regresará.

Cuando alguien le envía de SYN y nada más (que sería un ataque de inundación SYN si se hace en una gran cantidad), entonces se reservarán recursos del sistema operativo, pero no pasa nada en el código Erlang debido a un apretón de manos de tres vías todavía no está completo .

Muchos sistemas operativos están teniendo especial cuidado en los ataques de inundación SYN que evitan el consumo excesivo de recursos.

0

El enfoque que está utilizando parece estar bien. Tu servidor no se bloqueará. Si algo sale mal, creo que su proceso bifurcado recibirá el error, no el servidor.