2010-06-02 5 views
5

¿Cómo identifica los marcos UDP que faltan en un disector de Wireshark personalizado?Disector de Wireshark: ¿cómo identificar las tramas UDP perdidas?

He escrito un disector personalizado para el CQS feed (reference page). Uno de nuestros servidores se abre al recibir este feed. Según Wireshark, algunos marcos UDP nunca se reciben. Sé que los marcos fueron enviados porque todos nuestros otros servidores están libres de huecos.

Un marco CQS consiste en varios mensajes, cada uno con su propio número de secuencia. Mi disector personalizada proporciona los siguientes datos para Wireshark:

cqs.frame_gaps   - the number of gaps within a UDP frame (always zero) 
cqs.frame_first_seq  - the first sequence number in a UDP frame 
cqs.frame_expected_seq - the first sequence number expected in the next UDP frame 
cqs.frame_msg_count  - the number of messages in this UDP frame 

Y estoy mostrando cada uno de estos valores en las columnas personalizadas, como se muestra en esta captura de pantalla: wireshark screenshot http://img692.imageshack.us/img692/9484/wiresharkcqs.jpg

He intentado añadir código a mi disector que simplemente guarda el último número de secuencia procesada (como un estático local) y marca los espacios vacíos cuando el disector procesa un marco donde current_sequence != (previous_sequence + 1). Esto no funcionó porque el disector se puede llamar en orden de acceso aleatorio, dependiendo de dónde haga clic en la GUI. Entonces puede procesar el fotograma 10, luego el fotograma 15, luego el fotograma 11, etc.

¿Hay alguna forma de que mi disector sepa si el marco que venía antes (o el que sigue) falta?

El disector está escrito en C.

(Véase también una companion post on serverfault.com)

Respuesta

4

Usted debe tener en cuenta que Wireshark hace tiempos de disección múltiple. La primera vez diseca los paquetes en estricto orden cuando carga el archivo. Luego llama disectores cuando desplaza packet_tree_view o selecciona un paquete para construir su árbol.

Puede comprobar si un disector se llama fot Ther primera vez:

if (PINFO_IS_VISITED(pinfo)) { ... }; 

Su disector debe comportarse de manera diferente para la primera y para los próximos disecciones.

En la primera disección, debe almacenar cierta información para cada paquete (en una tabla hash por ejemplo) ya que es un número de secuencia y está fuera de servicio. Lo necesitará para compilar el árbol de paquetes correctamente cuando lo llame por segunda vez.

+0

No he tocado esto en mucho tiempo, pero sospecho que esta es la respuesta. No me di cuenta de que los paquetes fueron disecados dos veces. –

0

No konw si se puede mirar en los fotogramas anteriores o siguientes, pero cuando Wireshark está cargando un tcpdump que llamaré su disector en cada uno de los cuadros en orden. Así que podría agregar una variable local estática que es una matriz o tabla hash y simplemente almacenar sus valores allí. Entonces su disector puede verificar esa matriz para los cuadros anteriores y siguientes y hacer su análisis.

Usted debe mirar que pinfo vairable, ese es uno de los argumentos de la función de información sobre el número de cuadro, la información de IP, etc.

Cuestiones relacionadas