2012-04-29 17 views
6

Estoy escribiendo un programa de monitoreo para una red de tráfico muy alta (los videos HD se transmiten a través de la red). La mayoría de los paquetes son muy grandes y solo quiero ver los encabezados (solo IP y UDP/TCP). Por supuesto, quiero evitar la sobrecarga de copiar toda la información. ¿Libpcap necesariamente me da una copia de todo el paquete? En caso afirmativo, ¿hay alguna biblioteca que coincida con mis necesidades?¿Libpcap siempre hace una copia del paquete?

Respuesta

6

Parece que hay dos preguntas aquí:

  • el que está en el título, que suena como si estuviera preguntando si las copias libpcap el paquete;
  • el uno en el cuerpo, preguntando si siempre copia el entero paquete.

Por primera pregunta: ¿

Probablemente hay al menos una copia realizada por cualquier código utilizando los mecanismos en cuya cima se libpcap ejecuta en diversos sistemas operativos - una copia de las memorias intermedias/skbuff/buffers de streams/lo que sea a la el buffer del mecanismo Para Linux, cuando se usa el mecanismo tpacket no se usa, el skbuff podría estar en cola de recepción para el PF_PACKET que está utilizando el socket libpcap.

Puede haber otra copia: una copia de ese búfer a userland; si libpcap usa un mecanismo de "copia cero", como el mecanismo tpacket de Linux (que libpcap 1.0 y posterior usa por defecto), la segunda copia no ocurre. Es ocurrirá si no se está utilizando un mecanismo de copia cero.

Sin embargo, si está utilizando pcap_next() o pcap_next_ex() en un sistema Linux y se está utilizando el mecanismo tpacket, una copia separada, desde el búfer de memoria asignada a un búfer privado; eso no ocurre si usa pcap_dispatch() o pcap_loop().

Para la segunda pregunta:

Eso es lo que el "snaplen" argumento para pcap_open_live() y pcap_set_snaplen() es para - que le permite especificar que no más de "snaplen" bytes de datos de paquetes deben ser capturados, y eso significa que no más que muchos bytes se copian.

Tenga en cuenta que esta longitud incluye los encabezados de la capa de enlace, y que esos pueden incluir encabezados de "metadatos" como los encabezados radiotap que podría obtener en los adaptadores 802.11. Este encabezado puede ser de longitud variable (por ejemplo, en 802.11, el encabezado 802.11 es de longitud variable y, si obtiene encabezados radiotap, también son de longitud variable).

Además, los encabezados IPv4 y TCP pueden tener opciones, y los paquetes IPv6 pueden tener encabezados de extensión, por lo que la longitud de los encabezados IP y TCP también puede ser variable.

Esto significa que es posible que tenga que determinar la duración de una "peor de las instantáneas" para usar; no hay forma de decir explícitamente "no me des algo más allá del encabezado TCP/UDP", solo puedes decir "no más de N bytes".

Cuestiones relacionadas