2012-10-24 1 views
11

Stavo dando un'occhiata all'utilizzo di PF_RING per l'invio e la ricezione nella mia applicazione.TCP e PF_RING

Se ho intenzione di utilizzare PF_RING per mantenere una connessione TCP, sembra che dovrò manualmente "forgiare" i messaggi IP e TCP da solo, poiché pfring_send invia pacchetti non elaborati. Ciò significa che dovrò reimplementare manualmente il protocollo TCP su PF_RING?

Capisco che c'è un chiaro vantaggio per la ricezione utilizzando PF_RING, qualcuno ha provato a inviare dati con PF_RING? C'è un chiaro vantaggio rispetto alle normali chiamate di invio?

nota: non sto utilizzando il DNA (accesso diretto alla rete), sto solo utilizzando il bypass parziale del kernel con driver NIC-aware.

risposta

11

Per rispondere alla prima domanda, sì, sarà necessario creare manualmente i messaggi TCP/IP da zero, indirizzo MAC e tutto. Per un esempio dare un'occhiata a pfsend.c da ntop.org.

ntop.org ha anche reso disponibile uno PF_RING user guide che contiene spiegazioni.

Per quanto riguarda l'invio di dati utilizzando PF_RING, è assolutamente possibile, l'idea è di ignorare qualsiasi e qualsiasi nozione di ciò che è effettivamente dati sul filo e inviare il più velocemente possibile, vedere wire speed traffic generation da ntop.org. L'unico vantaggio che ha sul normale invio di chiamate usando il kernel per TCP/IP è che è possibile inviare i dati 1. più velocemente e 2. completamente non formattato sul filo. 2 può essere utile ad esempio quando si desidera riprodurre sulla rete pacchetti/pacchetti multipli precedentemente acquisiti.


A meno che non si dispone di un caso d'uso specifico che richiede di avere accesso ai dati sottostanti grezzi senza l'intervento del kernel non c'è assolutamente alcuna buona ragione per usare PF_RING in alcun modo. La soluzione migliore sarebbe quella di utilizzare gli standard socket() disponibili, nella maggior parte dei casi le prestazioni che è possibile ottenere sono più che adeguate.

Quale caso di utilizzo specifico avevi in ​​mente?

+0

E i vantaggi delle prestazioni rispetto al normale invio di socket? Sto cercando di eliminare le incoerenze nel normale invio di socket. Normalmente vedo un take us in media 0-> 1, ma ci sono grossi valori anomali (a causa delle attività del kernel) che a volte portano a 100 usec. Sto cercando di eliminare questa chiamata di sistema. – Alex

+0

Si sta reimplementando uno stack TCP/IP nello spazio utente in quel punto, non c'è quasi alcun caso che sarà più veloce o più performante di uno che è incorporato nel kernel, in particolare quando si tratta di inviare nuovamente i pacchetti in caso di errore di trasmissione , o prendersi cura di tutti i casi limite. Per quale particolare caso d'uso stai cercando di ottimizzare? Qual è l'obiettivo finale? –

+0

L'obiettivo finale è ridurre i valori anomali nelle prestazioni di invio. La mia applicazione è "esplosiva" nella natura delle mandate (potrebbe inviare un mazzo in fila e poi aspettare un po 'prima di inviare nuovamente - un po' significa 1ms +). Forse stai chiedendo cosa fa la mia domanda, che temo di non poter dire. – Alex