2017-11-03 1 views
1

Auf einem Linux 2.6.32 bin ich auf der Suche /proc/net/tcp und frage mich, was die Einheit tx_queue und rx_queue ist.Einheiten von tx_queue & rx_queue in/proc/net/tcp

ich diese Informationen nicht über receive-queue und transmit-queue in https://www.kernel.org/doc/Documentation/networking/proc_net_tcp.txt

Auch in man 5 proc finden, die zeigt nur:

Die "tx_queue" und "rx_queue" sind die ausgehende und eingehende Datenwarteschlange in Bezug auf Kernel-Speicherverbrauch.

Ist es Bytes? oder Anzahl der Puffer? oder vielleicht habe ich eine großartige dokumentation dazu verpasst?

Dank

Antwort

0

Kurze Antwort - Diese Zählung Bytes. Durch das Ausführen von netperf TCP_RR mit verschiedenen Größen können Sie den genauen Wert von 1 zählen (nur 1 Paket in der Luft in einer bestimmten Zeit). Dieser Wert würde immer die Paketgröße anzeigen.

Weitere Informationen:

dieser Laut post:

tx_queue: rx_queue

Die Größe der Sende- und Empfangswarteschlangen.

Dies ist pro Socket. Für TCP werden die Werte in der Funktion get_tcp4_sock() aktualisiert. Es ist etwas anders in 2.6.32 und 4.14, aber die Idee ist die gleiche. Entsprechend dem Socket-Zustand wird der rx_queue-Wert auf entweder sk-> sk_ack_backlog oder tp-> rcv_nxt-tp-> copy_seq aktualisiert. Der zweite Wert könnte negativ sein und wird in späteren Kernen auf 0 gesetzt, wenn dies der Fall ist. sk_ack_backlog zählt die nicht gepackten Segmente, das ist ein bisschen seltsam, da dies nicht in Bytes zu sein scheint. Vermutlich fehlt hier etwas.

Von tcp.h:

struct tcp_sock { 
    ... 
    u32 rcv_nxt; /* What we want to receive next  */ 
    u32 copied_seq; /* Head of yet unread data  */ 

Sowohl in Bytes zählen, so t F> rcv_nxt - t F> copied_seq ist das ausstehende Bytes im Empfangspuffer für eingehende Pakete zu zählen. tx_queue wird auf tp-> write_seq - tp-> snd_una gesetzt. Wieder von tcp.h:

struct tcp_sock { 
... 
    u32 snd_una; /* First byte we want an ack for */ 
    u32 write_seq; /* Tail(+1) of data held in tcp send buffer */ 

ist hier ein bisschen mehr klar die Zählung in Bytes zu sehen. Für UDP ist es einfacher. Die Werte werden in udp4_format_sock aktualisiert():

static void udp4_format_sock(struct sock *sp, struct seq_file *f, 
     int bucket) 
{ 
    ... 

    seq_printf(f, "%5d: %08X:%04X %08X:%04X" 
     " %02X %08X:%08X %02X:%08lX %08X %5u %8d %lu %d %pK %d", 
     bucket, src, srcp, dest, destp, sp->sk_state, 
     sk_wmem_alloc_get(sp), 
     sk_rmem_alloc_get(sp), 

sk_wmem_alloca_get und sk_rmem_alloc_get sk_wmem_alloc und sk_rmem_alloc zurückkehren bzw. sind beide in Bytes.

Hoffe, das hilft.