TCP协议头部结构
TCP通过三次握手建立链接
三次握手的报文
服务端队列详情
SYNS_QUEUE 半连接队列
如果SYNS队列满了,那么会直接丢弃clent发过来的syn包。此时client端会重试连接,其重试次数由参数【/proc/sys/net/ipv4/tcp_syn_retries】来决定,默认值为6:
第 1 次发送 SYN+ACK 报文后等待 1s(2的0次幂),如果超时,则重试
第 2 次发送后等待 2s(2 的 1 次幂),如果超时,则重试
第 3 次发送后等待 4s(2 的 2 次幂),如果超时,则重试
第 4 次发送后等待 8s(2 的 3 次幂),如果超时,则重试
第 5 次发送后等待 16s(2 的 4 次幂),如果超时,则重试
第 6 次发送后等待 32s(2 的 5 次幂),如果超时,则重试
第 7 次发送后等待 64s(2 的 6 次幂),如果超时,则超时失败
总共127秒。
半连接队列的大小取决于:max(64,/proc/sys/net/ipv4/tcp_max_syn_backlog),不同版本的系统会有些差异。
ACCEPT_QUEUE 连接队列
如果ACCEPT队列满了,server通过【/proc/sys/net/ipv4/tcp_abort_on_overflow】来决定如何返回
-
tcp_abort_on_overflow为0,不会把连接从SYN队列中移除,server过一段时间再次发送syn+ack给client(也就是重新走握手的第二步)这样来回重发几次,次数由【/proc/sys/net/ipv4/tcp_synack_retries】(centos默认为5) 指定。
-
tcp_abort_on_overflow为1,则server发送一个RST包给client,表示废掉这个握手过程和这个连接(本来在server端这个连接就还没建立起来),客户端会出现【connection reset by peer】的异常。
**另外:**如果ACCEPT队列一直是满的,那么server会扔掉client发过来的ACK请求。
全连接队列的大小取决于:min(backlog, somaxconn)。backlog是在socket创建的时候传入的,somaxconn是一个操作系统级别的系统参数【/proc/sys/net/core/somaxconn】。