我正在实现一个接受许多并发连接的服务器。

我使用了以下结构:

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

我想知道是否有人向我发送了SYN,但是从不向我发送SYN ACK来响应我的服务器ACK,由于我调用gen_tcp:accept没有超时,我的服务器会永远被该客户端阻塞吗?

顺便说一句,我认为这种情况很难模仿,所以请告诉我您是否有办法尝试。

提前谢谢。

最佳答案

当您聆听/接受它时,与您描述的有所不同:

一些客户端想要连接:它发送一个SYN,然后您的操作系统发送一个SYN/ACK(不涉及erlang),当您收到ACK时,gen_tcp:accept将返回。

当有人向您发送SYN,而没有其他任何东西(如果大量发送,这将是SYN泛洪攻击),则将保留操作系统资源,但在您的erlang代码中什么也没有发生,因为三向握手尚未完成。

许多操作系统都特别注意SYN泛洪攻击,以避免过多的资源消耗。

关于sockets - 是gen_tcp :accept/1 safe?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4385319/

10-13 02:07