运维开发网
广告位招商联系QQ:123077622
 
广告位招商联系QQ:123077622

语言无关 – 更多TCP和POSIX套接字listen()和accept()语义

运维开发网 https://www.qedev.com 2020-07-15 14:07 出处:网络 作者:运维开发网整理
情况:服务器调用listen()(但不是accept()!).客户端将SYN发送到服务器.服务器获取SYN,然后将SYN / ACK发送回客户端.但是,客户端现在挂断/死亡,因此它永远不会将ACK发送回服务器.连接处于SYN_SENT状态. 现在另一个客户端发送一个SYN,从服务器返回一个SYN / ACK,然后发回一个ACK.此连接现在处于ESTABLISHED状态. 现在服务器最终调用acce
情况:服务器调用listen()(但不是accept()!).客户端将SYN发送到服务器.服务器获取SYN,然后将SYN / ACK发送回客户端.但是,客户端现在挂断/死亡,因此它永远不会将ACK发送回服务器.连接处于SYN_SENT状态.

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

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

那么,你在这里描述的是一次典型的同步洪水攻击( 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状态.

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消