TCP握手过程中建连接的流程和队列
程序员文章站
2022-03-31 22:53:25
这里有两个队列:syns queue(半连接队列);accept queue(全连接队列)。 三次握手过程中: 第一步: server 收到 client 的 syn 后,把这个连接信息放到半连接队列中, 第二步: 同时回复 syn+ack 给 client 第三步: server 收到 clien ......
这里有两个队列: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会有些差异。
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
参考: