先上图,我们本片仅讨论
两个队列,半连接队列和全连接队列。两个状态,SYN_SENT、SYN_RECV
嫌麻烦的同学可以直接去看结论。

两种状态分析
SYN_SENT
如何查看
netstat -np | grep SYN
如何复现
启动如下配置的openresty
worker_processes 1;events {worker_connections 1024;}http {server {listen 28090 backlog=16;location = /cent {content_by_lua_block {local index = 0for i = 0, 1000 * 1000 dofor j = 0, 1000 dofor k = 0, 5 doindex = index + 1endendendngx.say("ok\t", index)}}}}
在打压机器上执行
./wrk -c 1000 'http://172.26.186.7:28090/cent'
出现了很多的syn_sent状态的包

半连接队列已满

全连接队列已满

抓包图

从抓包图上看,仅看到客户端发给服务端的SYN包,而没有看到服务端回的回应。则说明服务端发生了对新建连接的丢包处理。
SYN_RECV
如何查看
在服务端执行
netstat -np | grep -c SYN_REC
如何复现
在压测机端执行
sudo hping3 -S -p 28090 172.26.186.7 --flood
在服务端半连接状态如下所示。

全连接状队列态如下所示

可以看到半连接队列已满,而全连接队列还是为空。
抓包图

从抓包图中可以明显看到发起syn flood 的时候TCP仅有两次握手包而没有客户端第三次的确认包。
结论
一图胜千言。当然了,全连接队列未满也可能会丢弃包。本文不做讨论。

文章转载自彪哥分晓,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




