TCP协议头部结构

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】来决定如何返回

  1. tcp_abort_on_overflow为0,不会把连接从SYN队列中移除,server过一段时间再次发送syn+ack给client(也就是重新走握手的第二步)这样来回重发几次,次数由【/proc/sys/net/ipv4/tcp_synack_retries】(centos默认为5) 指定。

  2. 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】。

参考文献

吊打面试官!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题

TCP头部结构