TCP连接中socket listen队列溢出与SYN包丢弃的区别是什么
TCP监听相关两项netstat统计值的差异
这两个统计项分别对应TCP三次握手过程中两个不同队列的溢出事件,核心差异如下:
- times the listen queue of a socket overflowed
统计的是*全连接队列(accept队列)*溢出的总次数:TCP三次握手完成后,连接会从半连接队列转移到全连接队列,等待应用程序调用accept()接口取出。如果全连接队列已满,内核会丢弃这个已经完成握手的连接,该统计项数值+1。 - SYNs to LISTEN sockets dropped
统计的是SYN半连接队列溢出的总次数:客户端首次发送SYN包发起连接请求时,内核会先将该请求放入SYN半连接队列,同时返回SYN+ACK给客户端。如果此时半连接队列已经被占满,内核会直接丢弃这个SYN包,不会响应,该统计项数值+1。
补充排查参考
你观测到的两个统计值都达到百万级,说明队列溢出已经非常严重,可对应调整内核参数缓解:
- 全连接队列长度由
net.core.somaxconn内核参数、应用程序listen()调用传入的backlog参数二者的最小值决定,两个参数都调大才能提升全连接队列上限 - 半连接队列长度由
net.ipv4.tcp_max_syn_backlog内核参数控制,开启net.ipv4.tcp_syncookies参数后,半连接队列满时不会直接丢弃SYN包,该统计项不会继续上涨,可作为应急优化手段
内容的提问来源于stack exchange,提问作者Toshi
相关产品推荐
相关产品推荐

