Perché il kernel dovrebbe eliminare i pacchetti?


50

Ho interrotto tcpdumpcon Ctrl+ Ce ho ottenuto questo riepilogo totale:

579204 packets captured
579346 packets received by filter
142 packets dropped by kernel

Quali sono i "pacchetti rilasciati dal kernel"? Perché succede?


Nel mio caso stavo usando l'opzione -s0, cambiandola in -s1600 (proprio sopra MTU) risolto per me.
LatinSuD,

Risposte:


50

Dal manuale di tcpdump:

pacchetti `` rilasciati dal kernel '' (questo è il numero di pacchetti che sono stati eliminati, a causa della mancanza di spazio nel buffer, dal meccanismo di acquisizione dei pacchetti nel sistema operativo in cui tcpdump è in esecuzione, se il sistema operativo riporta tali informazioni alle applicazioni; in caso contrario, verrà segnalato come 0).

Un po 'di spiegazione:

Le tcpdumpcattura i pacchetti grezzi che passano attraverso un'interfaccia di rete. I pacchetti devono essere analizzati e filtrati secondo le regole da te specificate nella riga di comando, e ciò richiede del tempo, quindi i pacchetti in arrivo devono essere bufferizzati (messi in coda) per l'elaborazione. A volte ci sono troppi pacchetti, vengono salvati in un buffer, ma vengono salvati più velocemente rispetto all'elaborazione, quindi alla fine il buffer esaurisce lo spazio, quindi il kernel rilascia tutti i pacchetti successivi fino a quando non c'è spazio libero nel buffer.

È possibile aumentare la dimensione del buffer con l' opzione -B( --buffer-size) in questo modo:

tcpdump -B 4096 ....

Si noti che la dimensione è specificata in kilobyte, quindi la riga sopra imposta la dimensione del buffer su 4 MB.


1
Inoltre ho intenzionalmente cambiato kibi- / mebi- in kilo- / mega- e ho omesso una parola su libpcap per non confondere le persone.
Dmitry Vasilyanov,

4
Si noti inoltre che il supporto per "opzioni lunghe" in tcpdump è relativamente nuovo; nelle versioni precedenti (ad eccezione di versioni molto più vecchie, che non supportano l'impostazione della dimensione del buffer) è possibile eseguire tcpdump -B 4096.

Un'altra nota, ci vuole tempo per impostare buffer di grandi dimensioni. Se imposti i buffer su qualcosa di folle, potresti perdere i pacchetti (tcpdump li riporta come "pacchetti rilasciati dal kernel") durante quel periodo di inizializzazione.
dgreene,

27

Un'altra cosa da considerare / provare è che tcpdumppotrebbe passare molto tempo a fare query DNS per risolvere gli IP in nomi di dominio. Se non ti servono, prova a lanciare la -nbandiera (nessuna ricerca). per esempio:

tcpdump -n port 80

2
Questo è stato un salvatore. Non ho realizzato che tcpdump ha annullato la risoluzione durante il dumping su un file !! Usando -nn -B 4096mi ha permesso di ottenere0 packets dropped by kernel
Blanka il

11

Secondo man tcpdump:

pacchetti rilasciati dal kernel (questo è il numero di pacchetti che sono stati eliminati, a causa della mancanza di spazio nel buffer, dal meccanismo di acquisizione dei pacchetti nel sistema operativo su cui è in esecuzione tcpdump, se il sistema operativo riporta tali informazioni alle applicazioni; in caso contrario, esso verrà segnalato come 0).

Il kernel inserisce i pacchetti acquisiti in un buffer di acquisizione di dimensioni fisse . Se tcpdumpquesto buffer non viene svuotato abbastanza rapidamente, il kernel inizierà a sovrascrivere i vecchi pacchetti nel buffer e incrementare di conseguenza il contatore eliminato . Il valore di quel contatore è quello che vedi come "rilasciato dal kernel".

A proposito, puoi ridimensionare il buffer di acquisizione : passa tcpdumpl' -Bopzione con una dimensione KiB.


2

Oltre a ciò che dice la pagina man, sembra esserci qualche motivo in più per cui i pacchetti potrebbero essere eliminati dal kernel. Stavo riscontrando un calo dei pacchetti del 100% da tcpdumpcui l'unico traffico sulla rete era un pacchetto da 512 B di PRBS al secondo. Chiaramente la spiegazione dello spazio del buffer non ha senso qui - penso che il kernel sia in grado di gestire 0,5 kB / s.

Qualcosa che è venuto con la mia distro (Ubuntu 14.04) potrebbe aver fatto una sorta di filtro intelligente a livello di collegamento a cui non piacevano i miei pacchetti di test. La mia soluzione alternativa era quella di creare un nuovo spazio dei nomi di rete come segue:

sudo -i
ip netns add debug
ip link set dev eth0 netns debug
ip netns exec debug bash
ifconfig eth0 1.2.3.4 up

Nella netnsshell interna , qualsiasi processo del sistema operativo che stava causando problemi in precedenza è fuori dal quadro e tcpdumpmi mostra tutti i pacchetti che mi aspetto di vedere.


1

Trovo utile usando l' tcpdump -copzione. In questo modo è possibile impostare il numero di pacchetti e quindi interrompere e non è possibile compilare il buffer.

Ad esempio, questo acquisirà le richieste tcp su localhost.

tcpdump -ni lo tcp -c 20
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.