Si vous voulez voir la taille de votre tampon dans le terminal, vous pouvez jeter un œil à :
/proc/sys/net/ipv4/tcp_rmem
(pour lecture)/proc/sys/net/ipv4/tcp_wmem
(pour écrire)
Ils contiennent trois nombres, qui sont respectivement les valeurs de taille de mémoire minimale, par défaut et maximale (en octets).
Alors que, comme cela a été souligné, il est possible de voir la valeur par défaut actuelle tailles de tampon de socket en /proc
, il est également possible de les vérifier en utilisant sysctl
(Remarque :bien que le nom inclut ipv4, ces tailles s'appliquent également aux sockets ipv6 - le code ipv6 tcp_v6_init_sock() appelle simplement la fonction ipv4 tcp_init_sock()) :
sysctl net.ipv4.tcp_rmem
sysctl net.ipv4.tcp_wmem
Cependant, les tampons de socket par défaut ne sont définis que lorsque la chaussette est initialisée, mais le noyau les dimensionne alors dynamiquement (sauf s'ils sont définis à l'aide de setsockopt() avec SO_SNDBUF). La taille réelle des tampons pour les sockets actuellement ouverts peut être inspectée en utilisant le ss
commande (partie du iproute
/iproute2
package), qui peut également fournir un tas d'informations supplémentaires sur les sockets comme le paramètre de contrôle de congestion, etc. Pour lister le TCP actuellement ouvert (t
option) sockets et mémoire associée (m
) informations :
ss -tm
Voici quelques exemples de sortie :
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)
Voici une brève explication de skmem (mémoire de socket) - pour plus d'informations, vous devrez consulter les sources du noyau (c'est-à-dire 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
Pour obtenir la taille de la mémoire tampon dans le programme c/c++, voici le flux
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