我正在实现一个接受许多并发连接的服务器.
我使用了这个结构:
loop(Sock) ->
case gen_tcp:accept(Sock) of
{ok, CSock} ->
fork_handling_process(CSock);
{error, Reason} ->
do_something_else();
end,
loop(Sock).
Run Code Online (Sandbox Code Playgroud)
我想知道是否有人给我发送了一个SYN,但是从来没有向我发送一个SYN ACK来响应我的服务器ACK,我的服务器是否会被该客户端永远阻止,因为我调用了gen_tcp:accept而没有超时?
顺便说一下,我认为这种情况很难效仿,所以如果你有办法试试,请告诉我.
Thx提前.
当您聆听/接受时,它与您所描述的有点不同:
有些客户端想要连接:它发送一个SYN,然后你的操作系统发送一个SYN/ACK(erlang不涉及),当你收到ACK时gen_tcp:accept将返回。
当有人向您发送 SYN 而没有其他任何内容时(如果发送的数量过多,这将是 SYN 洪水攻击),那么操作系统资源将被保留,但您的 erlang 代码中不会发生任何事情,因为三向握手尚未完成。
许多操作系统都特别注意 SYN 洪泛攻击,以避免过多的资源消耗。