夯实基础之tcp半连接和全连接队列

什么是tcp半连接和全连接队列

在 TCP 三次握手的时候,Linux 内核会维护两个队列,分别是:

半连接队列,也称 SYN 队列;
全连接队列,也称 accept 队列;
服务端收到客户端发起的 SYN 请求后,内核会把该连接存储到半连接队列,并向客户端响应 SYN+ACK,接着客户端会返回 ACK,服务端收到第三次握手的 ACK 后,内核会把连接从半连接队列移除,然后创建新的完全的连接,并将其添加到 accept 队列,等待进程调用 accept 函数时把连接取出来。
不管是半连接队列还是全连接队列,都有最大长度限制,超过限制时,内核会直接丢弃,或返回 RST 包。

如何查看应用程序德tcp全连接队列大小

在服务端可以使用 ss 命令,来查看 TCP 全连接队列的情况:

但需要注意的是 ss 命令获取的 Recv-Q/Send-Q 在「LISTEN 状态」和「非 LISTEN 状态」所表达的含义是不同的。
如果tcp连接状态是LISTEN时,Recv-Q表示当前全连接队列的大小,Send-Q表示当前全连接最大队列长度
如果tcp连接状态不是LISTEN时,Recv-Q表示已收到但未被应用程序读取的字节数,Send-Q表示已发送但未收到确认的字节数

在「LISTEN 状态」时,Recv-Q/Send-Q 表示的含义如下:

[root@k8s-master ~]# ss -lnt 
State       Recv-Q Send-Q                                        Local Address:Port                                                       Peer Address:Port              
LISTEN      0      128                                            172.31.0.217:2379                                                                  *:*                  
LISTEN      0      128                                               127.0.0.1:2379                                                                  *:*  

Recv-Q:当前全连接队列的大小,也就是当前已完成三次握手并等待服务端 accept() 的 TCP 连接;
Send-Q:当前全连接最大队列长度,上面的输出结果说明监听 2379 端口的 TCP 服务,最大全连接长度为 128;

在「非 LISTEN 状态」时,Recv-Q/Send-Q 表示的含义如下:

[root@k8s-master ~]# ss -nt | head
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
ESTAB      0      0      127.0.0.1:2379               127.0.0.1:45388              
ESTAB      0      0      127.0.0.1:2379               127.0.0.1:45396  

Recv-Q:已收到但未被应用进程读取的字节数;
Send-Q:已发送但未收到确认的字节数;

posted on 2022-09-26 17:30  每天进步一点点点点点  阅读(103)  评论(0编辑  收藏  举报