如何找到linux的socket缓冲区大小

Fre*_*ind 56 sockets linux buffer

什么是linux的默认套接字缓冲区大小?有没有命令可以看到它?

sae*_*edn 103

如果要在终端中查看缓冲区大小,可以查看:

  • /proc/sys/net/ipv4/tcp_rmem (供阅读)
  • /proc/sys/net/ipv4/tcp_wmem (写)

它们包含三个数字,分别是最小,默认和最大内存大小值(以字节为单位).

  • recv还有`/ proc/sys/net/core/rmem_default`和send的`/ proc/sys/net/core/wmem_default`,参考http://man7.org/linux/man-pages/man7 /socket.7.html (15认同)
  • 我在“man 7 tcp”和“man 7 udp”中找到了更详细的描述。 (2认同)

Din*_*.R. 31

为了在c/c ++程序中获取缓冲区大小,以下是流程

int n;
unsigned int m = sizeof(n);
int fdsocket;
fdsocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); // example
getsockopt(fdsocket,SOL_SOCKET,SO_RCVBUF,(void *)&n, &m);
// now the variable n will have the socket size
Run Code Online (Sandbox Code Playgroud)

  • 注意:这也只是读缓冲区的大小,使用 SO_SNDBUF 来获取写缓冲区的大小。至少在linux下,你可以使用ioctl SIOCINQ和SIOCOUTQ,分别获取缓冲区当前的使用状态。 (2认同)

Pie*_*erz 8

虽然正如已经指出的那样,可以在 中查看当前默认套接字缓冲区大小/proc,也可以使用sysctl(注意:虽然名称包括 ipv4,但这些大小也适用于 ipv6 套接字 - ipv6 tcp_v6_init_sock()代码只是调用了 ipv4 tcp_init_sock() 函数):

 sysctl net.ipv4.tcp_rmem
 sysctl net.ipv4.tcp_wmem
Run Code Online (Sandbox Code Playgroud)

然而,默认套接字缓冲区只是在 sock 初始化时设置,但内核随后动态调整它们的大小(除非使用 setsockopt() 和 SO_SNDBUF 设置)。可以使用ss命令(iproute包的一部分)检查当前打开的套接字缓冲区的实际大小,该命令还可以提供有关套接字的更多信息,如拥塞控制参数等。例如,列出当前打开的 TCP(t选项)套接字以及相关的内存 ( m) 信息:

ss -tm
Run Code Online (Sandbox Code Playgroud)

这是一些示例输出:

State       Recv-Q Send-Q        Local Address:Port        Peer Address:Port
ESTAB       0      0             192.168.56.102:ssh        192.168.56.1:56328
skmem:(r0,rb369280,t0,tb87040,f0,w0,o0,bl0,d0)
Run Code Online (Sandbox Code Playgroud)

这是 skmem(套接字内存)的简要说明 - 有关更多信息,您需要查看内核源代码(例如sock.h):

r:sk_rmem_alloc
rb:sk_rcvbuf          # current receive buffer size
t:sk_wmem_alloc
tb:sk_sndbuf          # current transmit buffer size
f:sk_forward_alloc
w:sk_wmem_queued      # persistent transmit queue size
o:sk_omem_alloc
bl:sk_backlog
d:sk_drops
Run Code Online (Sandbox Code Playgroud)