tcp nonblock connection rst
客户端(>5w)异步connect连接到server端,server端listen backlog设置为1024,发现存在部分客户端建立连接后,收到服务端的rst包。
先看下tcp监听套接字维护的两个队列(来自Unix网络编程)
测试模拟抓包如下:
解释:异步connect过快,导致server端listen已完成连接队列满了,后面接着来的connect请求放到未完成连接对列(SYN--->SYN,ACK, 等待客户端的ACK)中,当客户端的握手包ACK到来时,由于已完成连接队列已满,无法继续接受连接,因此丢弃该ACK,而未完成队列一段时间后仍为收到ACK,会重传SYN,ACK包,这就出现了下图所示的多次重传,默认重传5次(可通过sysct -a | grep synack查看和设置。)5次重传后,将该未完成连接从未完成连接队列移出。而客户端看来连接正常,接着发送速度,收到服务端的RST包。
详解介绍请看:http://blog.csdn.net/justlinux2010/article/details/8604676