jueves, 4 de enero de 2024

Análisis de A-MPDU y A-MSDU con Wireshark


En mi ruta para la certificación del CWAP me he encontrado con el punto que hace referencia a la agregación de tramas. He leído la guía oficial y varios artículos donde se hablan bastante de la teoría pero he encontrado poca información para analizar y hacer troubleshooting con Wireshark. Por este motivo me he decidido a realizar esta entrada para ayudar a aquellas persona que como yo se hayan encontrado en la misma situación.

Más adelante pasaré a explicar en detalle la teoría sobre A-MSDU y A-MPDU, pero a grandes rasgos este mecanismo permite enviar múltiples MSDU o MPDU durante a un dispositivo una vez a realizado el proceso de evaluación del medio,  verificar que está libre (CCA) y conseguir su turno para empezar a emitir (DCF Process).

Para empezar voy a empezar a explicar como agregar algunas columnas en Wireshark que me han ayudado a comprende un poco mejor el proceso.

Vamos a crear una columna que nos permitirá saber si el tipo de datos es MSDU o A-MPDU. 

 


A continuación buscamos una trama de tipo QoS Data (wlan.fc.type_subtype == 0x0028) y añadimos los siguientes campos como columnas:
Ahora buscamos un paquete del tipo BlockAck (wlan.fc.type_subtype == 0x0019) y aplicamos los siguientes campos como columnas:
Las comunas quedarán de la siguiente manera:
Para añadir las columnas a mano, estos serian los parámetros:



A continuación paso a detallar las características de A-MSDU:

 

  • Encapsula múltiples MSDU (subframe) en una sola trama
  • Cada MSDU contiene una dirección de destino (DA) y una dirección de origen (SA) 
  • Cada A-MSDU contiene una cabecera en la que solo podemos poner 3 direcciones RA/TA, SA o DA. Pero en cada MSDU el DA puede ser distinto
  • Las MSDUs que componen cada uno de los subframes tienen la siguiente información adicional. 

  • Una cabecera (14 B) compuesta por la el DA y SA más la longitud del paquete. En la parte final hay un PAD. La longitud del paquete ha de ser un número múltiplo de 4.
  • La última subframe es la única que no necesita PAD. 
  • Una vez agregadas todas las subframe se le ha de añadir la cabecera de capa 2 al inicio y el FCS al final. A nivel de capa 1 se le añade también el PHY header para poder ser trasmitida 
  • La trama en este punto se puede trasmitir.
  • El CRC (trailer FCS) es calculado para cada A-MSDU
    • Si una de las subframe falla al enviarse se ha de enviar de nuevo toda la A-MSDU

A-MPDU



  • Esta compuesto por MPDU en vez de MSDU. Cada agregación se denomina también subframe
  • Cada MPDU ya incorpora la cabecera + MSDU + Trailer
  • Cada subframe tiene 3 componentes. Una cabecera denominada Delimiter que contiene la longitud y un FCS (CRC). Al final del subframe se en encuentra el PAD para conseguir que la longitud del subframe sea múltiplo de 4. La última subframe no necesita PAD.
  • Al inicio de la agregación se le añade la cabecera 802.11 de nivel 2 con el TA y el RA y la cabecera PHY.
  • Si uno de los FCS falla solo se descarta esa subframe y es la única que ha de ser retrasmitida.
  • A-MPDU es obligatorio en 802.11ac y 802.11ax.
  • 802.11n puede usar A-MSDU
  • A-MSDU solo permite 1 RA y 1 TA
  • En A-MPDU aunque cada subframe tiene su propia cabecera con un RA y TA. Una A-MPDU solo se puede enviar a un RA.
  • Cada MPDU se encripta por separado
  • Todas las MPDU ha de ser de la misma categoría de QoS
  • Cada MPDU tiene su propio header y tráiler esto requiere también un mayor carga del medio.
  • La corrupción de datos puede ser detectada en un MPDU individual y no hay que enviar la A-MPDU entera.


Para confirmar que las tramas se han recibido correctamente en el lado remoto, en vez de enviar un ACK individual, lo que se hace es enviar un BlockACK. En el caso de A-MPDU si alguna subframe se ha corrompido en el BlockACK aparece la información sobre el número de subframe que no ha llegado correctamente y se vuelve a trasmitir de nuevo. En el caso de A-MSDU si alguna subframe no llega correctamente, se ha de volver a trasmitir la trama completa. 
A continuación vamos a analizar  en Wireshark como sería la trasmisión de una A-MPDU, observar si alguna se ha recibido con problemas y ver la retrasmisión.
Tenemos la siguiente captura de paquetes:
Inicialmente se envían las tramas con número de secuencia 34,35,36,37. En línea 354 podemos observar como se envía un BlockACK especificando que no ha recibido los paquetes  38,39.40.41...
En la siguiente captura podemos ver el detalle de todas las tramas que no ha recibido.
Como vemos a continuación en la línea 373 se vuelve a enviar la secuencia 39 y 40 y en la línea 375 hay otro BlockACK que confirma que ha recibido el  paquete 39 y 40 (el primer missing frame es el 41)
Hay un punto que me gustaría también comentar y el como descifrar el código que aparece en el Campo Block Ack Bitmap. Mediante BlockACK podemos llegar a confirmar 64 tramas de una sola vez. Este campo lo podemos dividir en 8 bloques de 8 bits que servirá para detallar que tramas se ha recibido o cuales no. El procedimiento es el siguiente. Supongamos que el número de secuencia desde la que vamos a empezar verificar es la número 360. Como se muestra en la captura el Block Ack Bitmat tiene un valor de todos los dígitos de f"f" si convertimos todas las f de HEX a binarios tenemos que serían 64 unos. Cuando un número de secuencia tiene asociado un valor de 1 es que se ha recibido, si el valor es 0 es que no ha llegado bien. Todo unos significa que todo se ha recibido correctamente: 
Ahora vamos a analizar este otro bitmap. 


La tabla resultante seria la siguiente, he agrupado hex de 2 en dos (4 bits para representar 16 que es el valor máximo de cada HEX individual). 
Tal y como muestra Wireshark en la captura anterior,  las tramas 1569, 1571 y 1572, no han llegado correctamente.

A-MSDU

A continuación se muestra una captura de como se analizaría una A-MSDU con wireshark. Para aislar este tipo de tramas podemos aplicar el siguiente display filter:
wlan.qos.amsdupresent == 1
Para poder ver las subframes que contiene la trama se ha de desencriptar la captura.


En la captura podemos ver que la trama contiene dos subframes. Cada subframe tiene información sobre el DA y el SA más la longitud de la trama. Al final observamos el campo pading en la primera subframe, pero éste no aparece en la segunda ya que es la última. La recepción de la trama se confirma con un BlockACK

Amplío la información con la tabla con la duración de cada TxOP en función de la QoS:






 











No hay comentarios:

Publicar un comentario

Modulación , codificación y cálculo del bitrate.

La idea que principal de las redes inalámbricas es pode trasmitir los datos generados o almacenados en una aplicación de un dispositivo a ot...