TCP三次握手成功后,会把连接放到全连接队列里,等待服务器端accept后移除。
如下图所示,图片转自:https://zhuanlan.zhihu.com/p/547279481
下图转自博客:https://zhuanlan.zhihu.com/p/340016138
TCP三次握手过程中,第一次握手server收到client的syn后,内核会把该连接存储到半连接队列中,同时回复syn+ack给client(第二次握手),第三次握手时server收到client的ack,如果此时全连接队列未满,内核会把连接从半连接队列移除,并将其添加到 accept 队列,等待应用进程调用 accept 函数取出连接,如果全连接队列已满,内核的行为取决于内核参数tcp_abort_on_overflow:
tcp_abort_on_overflow=0,server会丢弃client的ack。
tcp_abort_on_overflow=1,server 会发送 reset 包给 client。
默认值是0。
全连接队列的长度由backlog参数和somaxconn(或tcp_max_syn_backlog)内核参数的最小值决定。如果这些参数设置得太低,队列可能无法容纳大量的并发连接请求。
其中: