How to find the socket buffer size of linux

后端 未结 4 514
情歌与酒
情歌与酒 2020-11-28 22:00

What\'s the default socket buffer size of linux? Is there any command to see it?

相关标签:
4条回答
  • 2020-11-28 22:16

    Whilst, as has been pointed out, it is possible to see the current default socket buffer sizes in /proc, it is also possible to check them using sysctl (Note: Whilst the name includes ipv4 these sizes also apply to ipv6 sockets - the ipv6 tcp_v6_init_sock() code just calls the ipv4 tcp_init_sock() function):

     sysctl net.ipv4.tcp_rmem
     sysctl net.ipv4.tcp_wmem
    

    However, the default socket buffers are just set when the sock is initialised but the kernel then dynamically sizes them (unless set using setsockopt() with SO_SNDBUF). The actual size of the buffers for currently open sockets may be inspected using the ss command (part of the iproute package), which can also provide a bunch more info on sockets like congestion control parameter etc. E.g. To list the currently open TCP (t option) sockets and associated memory (m) information:

    ss -tm
    

    Here's some example output:

    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)
    

    Here's a brief explanation of skmem (socket memory) - for more info you'll need to look at the kernel sources (e.g. 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
    
    0 讨论(0)
  • 2020-11-28 22:18

    Atomic size is 4096 bytes, max size is 65536 bytes. Sendfile uses 16 pipes each of 4096 bytes size. cmd : ioctl(fd, FIONREAD, &buff_size).

    0 讨论(0)
  • 2020-11-28 22:27

    If you want see your buffer size in terminal, you can take a look at:

    • /proc/sys/net/ipv4/tcp_rmem (for read)
    • /proc/sys/net/ipv4/tcp_wmem (for write)

    They contain three numbers, which are minimum, default and maximum memory size values (in byte), respectively.

    0 讨论(0)
  • 2020-11-28 22:33

    For getting the buffer size in c/c++ program the following is the flow

    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
    
    0 讨论(0)
提交回复
热议问题