这是一个寓言,关于 TCP 监听器的两个队列。你们都知道 TCP 与三次握手建立连接。服务端的监听队列是放置新连接请求的队列。她接收到 SYN 报文后,就将其放到队列中,并发送ACK,告诉客户端连接建立请求已经接收了。至此, 服务端的工作就完成了。但是,客户端收到ACK回复后会等待服务端的第三个握手。这样, 通过统计队列中的 SYN(来自客户端的连接建立请求)的数量,就可以得到已经建立起的连接数。然而,该队列容易受到 SYN flood 攻击,因为每个 SYN 请求都会导致新的连接队列的增加,占用内存。如果分配的内存有限,新队列可能无法获得代码所需的运行资源。 这就是为什么需要第二个队列(也称之为半连接队列)。
半连接队列是存储已经发送第二个握手ACK的SYN报文的队列。当有新的 SYN 报文到位时,先尝试与该队列中的SYN报文匹配。如果匹配成功,则放入服务端监听队列;否则,忽略该SYN报文。在这个过程中,可以控制半连接队列的大小,以防止内存不足。在处理 SYN flood 攻击时,可以将半连接队列大小设置得小一些。
需要注意的是,半连接队列和监听队列的容量之和不能超过所设置的最大队列大小。
以上就是 TCP 监听器的两个队列的寓言。
了解更多有趣的事情:https://blog.ds3783.com/