内核套接字结构和 TCP_DIAG

Twi*_*ter 18 linux tcp socket

我正在开发一个连接到实时数据服务器(使用 TCP)的软件,但我有一些连接丢失。我的猜测是客户端读取来自服务器的数据的速度不够快。因此我想监控我的 TCP 套接字。为此,我找到了“ss”工具。

此工具允许查看每个套接字的状态 - 这是命令输出的示例行 ss -inm 'src *:50000'

ESTAB      0      0             184.7.60.2:50000       184.92.35.104:1105
  mem:(r0,w0,f0,t0) sack rto:204 rtt:1.875/0.75 ato:40
Run Code Online (Sandbox Code Playgroud)

我的问题是:内存部分是什么意思?查看该工具的源代码,我发现数据来自内核结构(sockin sock.h)。更准确地说,它来自领域:

r = sk->sk_rmem_alloc
w = sk->sk_wmem_queued;
f = sk->sk_forward_alloc;
t = sk->sk_wmem_alloc;
Run Code Online (Sandbox Code Playgroud)

有人知道他们的意思吗?我的猜测是:

  • rmem_alloc : 入站缓冲区的大小
  • wmem_alloc : 出站缓冲区的大小
  • sk_forward_alloc :???
  • sk->sk_wmem_queued :???

这是我的缓冲区大小:

net.ipv4.tcp_rmem = 4096        87380   174760
net.ipv4.tcp_wmem = 4096        16384   131072
net.ipv4.tcp_mem = 786432       1048576 1572864
net.core.rmem_default = 110592
net.core.wmem_default = 110592
net.core.rmem_max = 1048576
net.core.wmem_max = 131071
Run Code Online (Sandbox Code Playgroud)

acu*_*ich 7

sk_forward_alloc 是前向分配的内存,它是套接字配额中当前可用的总内存。

sk_wmem_queued 是在传输队列中排队的套接字发送缓冲区使用的内存量,并且尚未发送或尚未确认。

您可以在 Linux 中TCP/IP 体系结构、设计和实现的第 9 章中了解有关 TCP 内存管理的更多信息作者 Sameer Seth, M. Ajaykumar Venkatesulu