GNU/Linux >> Linux Esercitazione >  >> Linux

Come trovare la dimensione del buffer del socket di Linux

Se vuoi vedere la dimensione del tuo buffer nel terminale, puoi dare un'occhiata a:

  • /proc/sys/net/ipv4/tcp_rmem (per leggere)
  • /proc/sys/net/ipv4/tcp_wmem (per scrivere)

Contengono tre numeri, che rappresentano rispettivamente i valori minimo, predefinito e massimo della dimensione della memoria (in byte).


Mentre, come è stato sottolineato, è possibile vedere l'attuale predefinito dimensioni del buffer del socket in /proc , è anche possibile controllarli utilizzando sysctl (Nota:sebbene il nome includa ipv4, queste dimensioni si applicano anche ai socket ipv6:il codice ipv6 tcp_v6_init_sock() chiama semplicemente la funzione ipv4 tcp_init_sock()):

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

Tuttavia, i buffer socket predefiniti vengono impostati solo quando il sock viene inizializzato, ma il kernel li dimensiona dinamicamente (a meno che non vengano impostati utilizzando setsockopt() con SO_SNDBUF). La dimensione effettiva dei buffer per i socket attualmente aperti può essere ispezionata usando ss comando (parte del comando iproute /iproute2 pacchetto), che può anche fornire molte più informazioni sui socket come il parametro di controllo della congestione ecc. Per elencare il TCP attualmente aperto (t opzione) socket e memoria associata (m ) informazioni:

ss -tm

Ecco alcuni esempi di 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)

Ecco una breve spiegazione di skmem (socket memory) - per maggiori informazioni dovrai consultare i sorgenti del kernel (ad es. 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

Per ottenere la dimensione del buffer nel programma c/c++ il seguente è il flusso

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

Linux
  1. Come trovare tutti i file sparsi in Linux

  2. Come modificare la dimensione dell'MTU su Linux

  3. Come reindirizzare i risultati di "trova" a mv in Linux

  4. Come trovare la dimensione di una partizione non montata su Linux?

  5. Come trovare l'indirizzo IP del gateway in Linux

Come trovare il numero di porta di un servizio in Linux

Come trovare la dimensione di una directory in Linux

Come trovare l'indirizzo IP in Linux

Come trovare la dimensione totale di una directory in Linux

Come trovare file con il comando fd in Linux

Come trovare l'elenco dei repository installati in Linux