更多TCP和POSIX套接字listen()和accept()语义

Cla*_*diu 3 language-agnostic sockets network-programming tcp

情况:服务器调用listen()(但不是accept()!).客户端将SYN发送到服务器.服务器获取SYN,然后将SYN/ACK发送回客户端.但是,客户端现在挂断/死亡,因此它永远不会将ACK发送回服务器.连接处于SYN_SENT状态.

现在另一个客户端发送一个SYN,从服务器返回一个SYN/ACK,然后发回一个ACK.此连接现在处于ESTABLISHED状态.

现在服务器最终调用accept().怎么了?accept()是否阻塞第一个错误的连接,直到发生某种超时?是否检查队列中是否存在任何ESTABLISHED连接并首先返回这些连接?

amo*_*ej1 5

那么,你在这里描述的是一次典型的同步泛滥攻击(http://en.wikipedia.org/wiki/SYN_flood).

例如,在http://lkml.indiana.edu/hypermail/linux/kernel/0307.0/1258.html上查找两个单独的队列,一个syn队列和一个已建立的队列.显然,第一个连接将保留在syn队列中(因为它处于SYN_RCVD状态),第二个连接将在已建立的队列中,accept()将从中获取它.netstat仍应显示SYN_RCVD状态中的第一个.

注意:另请参阅我的注释,它是将处于SYN_SENT状态的客户端,服务器(我们正在讨论)将处于SYN_RCVD状态.