TCP握手过程中建连接的流程和队列


这里有两个队列:syns queue(半连接队列);accept queue(全连接队列)。
三次握手过程中:
第一步: server 收到 client 的 syn 后,把这个连接信息放到半连接队列中,
第二步: 同时回复 syn+ack 给 client
第三步: server 收到 client 的 ack,如果这时全连接队列没满,那么从半连接队列拿出这个连接的信息放入到全连接队列中,否则按tcp_abort_on_overflow指示的执行。
这时如果全连接队列满了并且 tcp_abort_on_overflow 是0的话,server过一段时间再次发送syn+ack给client(也就是重新走握手的第二步),如果client超时等待比较短,client就很容易异常了。

cat /proc/sys/net/ipv4/tcp_abort_on_overflow 
0

查看 全连接队列

下面看到的 13 times ,表示全连接队列溢出的次数,隔几秒钟执行下,如果这个数字一直在增加的话肯定全连接队列偶尔满了。

netstat -s |egrep "listen|LISTEN"
13 times the listen queue of a socket overflowed
54 SYNs to LISTEN sockets dropped

ss -lnt
State       Recv-Q  Send-Q        Local Address:Port                 Peer Address:Port
LISTEN       0        50               *:7999                              *:*  

上面看到的第二列Send-Q 值是50,表示第三列的listen端口上的全连接队列最大为50,第一列Recv-Q为全连接队列当前使用了多少。
全连接队列的大小取决于:min(backlog, somaxconn) . backlog是在socket创建的时候传入的,somaxconn是一个os级别的系统参数。

cat /proc/sys/net/core/somaxconn
16384

查看半连接队列

大小取决于:max(64, /proc/sys/net/ipv4/tcp_max_syn_backlog),不同版本的os会有些差异。一般默认值是512,不过这个设置有效的前提是系统的syncookies功能被禁用。互联网常见的TCP SYN FLOOD恶意DOS攻击方式就是建立大量的半连接状态的请求,然后丢弃,导致syns queue不能保存其它正常的请求。

cat /proc/sys/net/ipv4/tcp_max_syn_backlog
16384

Tomcat和Nginx中的Accept队列参数

Tomcat默认短连接,backlog(Tomcat里面的术语是Accept count)Ali-tomcat默认是200, Apache Tomcat默认100。
Nginx默认是511

参考:
https://mp.weixin.qq.com/s?__biz=MzIzOTU0NTQ0MA==&mid=2247487779&idx=1&sn=0980243dcec05c5df8e2e60937c2c5ed&chksm=e9292c2cde5ea53a7b309e3575c78940a378b358292a3badb828d6c9bb6e8d3997800564b1d5&mpshare=1&scene=23&srcid=0705cNzStWAzvxd5GzatiiNZ#rd

http://www.cnxct.com/something-about-phpfpm-s-backlog/

posted @ 2018-07-05 14:30  klvchen  阅读(641)  评论(0编辑  收藏  举报