我正在实现一个接受许多并发连接的服务器。
我使用了以下结构:
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/