在linux中,当一个应用创建一个处于listen状态的socket时,会为这个socket指定两条队列。
- SYN queue:存放处于syn_rec状态的socket,由内核参数tcp_max_syn_backlog指定。
- accept queue:存放处于ESTABLISHED状态的socket,由内核参数somaxconn和应用本身指定,如:redis:tcp-backlog,取somaxconn和tcp-backlog中的最小值。
- 在accept queue中的socket会被应用程序进行消费。
syn queue未满,而accept queue已满,此时:
1)当tcp第三次握手的ACK到达server,而此时accept queue已经满时,内核会丢失这个ACK包。
2)由于TCP的重传机制,sever端在超时时间内未收到ACK,server会重传SYN+ACK,client端重传ACK包。
3)在/proc/sys/net/ipv4/tcp_synack_retries设定的重试次数超过后还没正常的收到ACK包,就不再重试。
参考文章:
http://veithen.github.io/2014/01/01/how-tcp-backlog-works-in-linux.html
http://blog.itpub.net/15480802/viewspace-1399303/
时间: 2024-11-03 22:24:59