[TOC]
参考
1. TCP的全连接和半连接队列
当服务端调用listen函数监听端口的时候,内核会为每个监听的socket创建两个队列:半连接队列和全连接队列。
示意图
如上图所示,这里有两个队列: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超时等待比较短,就很容易异常了。后文会再度分析。
1.1. 半连接队列
半连接队列的大小由/proc/sys/net/ipv4/tcp_max_syn_backlog控制,Linux的默认是1024。
当服务端发送SYN_ACK后将会开启一个定时器,如果超时没有收到客户端的ACK,将会重发SYN_ACK包。重传的次数由/proc/sys/net/ipv4/tcp_synack_retries控制,默认是5次。