Análisis de la captura de paquetes del protocolo de paquetes TCP / IP y UDP

2020-04-15

Palabras clave: protocolo Ethernet, análisis de paquetes de red


 

Este artículo combina el proceso de comunicación de red real para comprender brevemente el protocolo Ethernet, el formato de mensaje TCP, el formato de mensaje IP y el formato de mensaje UDP.

 

Antes de esto, debemos saber: todos los datos, sin importar qué datos de red, paquetes de red, video, audio, imágenes, etc., son un conjunto de "datos seriales ordenados" en el cable de red. Esta larga cadena de datos contiene varios protocolos y diversos datos.

 

1. Formato de mensaje TCP / IP

 

Primero veamos el formato de mensaje TCP / IP en aplicaciones prácticas de comunicación.

 

Aquí uso la herramienta tcpdump para tomar, y uso wireshark para analizar el proceso interactivo de los dos dispositivos que envían el texto "Hola mundo" a través de Socket.

 

1.1, entorno de análisis

Primero pegue el paquete de red original del autor aquí, si está interesado, puede descargar y ver:

Enlace: https://pan.baidu.com/s/1QHXq88yiqTWISRMd-8-Q2g
código de extracción: nd5u

Filtrar por IP en wireshark: ip.addr == 192.168.77.104 

 

Primero introduzca la información básica de los dos dispositivos:

Equipo de servidor:

IP: 192.168.77.104

MAC: A8: BD: 3A: 37: 54: AB

Dispositivo cliente:

IP: 192.168.77.103

MAC: A8: BD: 3A: 37: 54: FF

 

Antes de la comunicación, TCP debe establecer una conexión a través de un "apretón de manos tres", como se muestra en la siguiente figura:

 

Al mismo tiempo, después de recibir un mensaje de la otra parte, una parte debe hacer una "respuesta" para informar al remitente "Lo he recibido".

 

De esta manera, el proceso de comunicación de texto "Hola mundo" que llevamos a cabo a través de Socket requiere al menos 5 procesos de comunicación, es decir, 5 paquetes de red. Por supuesto, si desea contar las "cuatro ondas" cuando se desconecta, debe agregar 4 paquetes de red más, un total de 9 paquetes de red. Pero aquí, no consideramos el caso de desconexión, por lo que solo tenemos que considerar 5 paquetes de red.

 

Se pueden filtrar cinco paquetes de red en este proceso en wireshark, como se muestra en la siguiente figura:

 

1.2, encabezado Ethernet

El contenido del primer paquete de red es el siguiente:

Aquí solo miramos la parte de "Datos seriales" en el medio. Wirehark agregó el contenido de ambos lados para facilitar la visualización.

 

Primero, los primeros 14 bytes pertenecen al encabezado Ethernet. Su composición es la siguiente:

Dirección MAC de destino (6 bytes) + Dirección MAC de origen (6 bytes) + Número de versión del protocolo IP (2 bytes)

 

Podemos encontrar fácilmente que los primeros 6 bytes son de hecho la dirección MAC del dispositivo del servidor A8: BD: 3A: 37: 54: AB, y los 6 bytes intermedios son la dirección MAC del cliente A8: BD: 3A: 37: 54: FF. Los dos últimos bytes 0x0800 indican que el paquete de red está utilizando el protocolo de comunicación IPV4.

 

La estructura del encabezado Ethernet es muy simple.

 

1.3, formato de mensaje IP

El siguiente paso es el protocolo IP.

 

Antes de ver el formato del mensaje IP, es necesario consultar el diagrama de composición del formato estándar, como se muestra a continuación:

Formato de mensaje IP

Por defecto, la longitud de un paquete IP es de 20 bytes, como se muestra en la figura anterior. Tome el paquete de red que capturamos arriba, su parte del paquete IP se muestra a continuación:

 

 

El paquete de red de comunicación real se combina con el formato de mensaje IP anterior para formar un diagrama. El primer byte del mensaje IP contiene dos partes: la versión del protocolo y la longitud del mensaje IP, cada una de las cuales representa 4 Bit

 

Versión + longitud del encabezado:

El primer byte en nuestro paquete de red es 0x45. El valor de los 4 dígitos superiores es el número 4 en decimal, lo que indica que el número de versión del protocolo IP actual es 4, que es IPV4. Si es IPV6, el valor de los 4 dígitos superiores es el número 6.

Los 4 dígitos inferiores son el número decimal 5. Este valor es un poco especial. No significa que el paquete IP tenga solo 5 bytes de longitud, sino que el valor se multiplica por 4 bytes, es decir 5 * 4bytes = 20bytes. Los datos del paquete IP en este paquete de red ocupan 20 bytes de longitud. No contiene campos opcionales y campos de relleno.

 

Servicios diferenciados:

En nuestro paquete de red, su valor es 0x00. Este valor generalmente se ignora.

 

Longitud total:

Toma 2 bytes y el valor es 0x003c, que es 60 en decimal. Representa la longitud total de los paquetes IP + paquetes de datos en todo el paquete de red, es decir, la longitud total de este paquete de red después de eliminar los primeros 14 bytes del encabezado Ethernet. Se puede considerar que este valor describe la longitud total de todo el paquete de red.

 

Logotipo:

Toma dos bytes. 0x500a. Se puede considerar como el número de identificación de este paquete de red. Este número generalmente aumenta en secuencia, y el valor se incrementa en 1 por cada paquete de red enviado. Sin embargo, cuando los datos del mismo paquete de red son demasiado largos (más del tamaño de MTU), este paquete de red se "dividirá" en paquetes cortos y se enviará uno por uno (es decir, fragmentado). La identificación en cada fragmento es la misma, para garantizar que el extremo receptor pueda reensamblar paquetes de red dispersos en un paquete de red completo.

 

Logotipo + desplazamiento de corte:

Ocupa 2 bytes, la bandera ocupa los 3 bits superiores y el desplazamiento del chip ocupa los 13 bits inferiores.

Logotipo:

Los tres dígitos de mayor a menor son:

1. Bits reservados

2. Está prohibido fragmentar

0 significa que el paquete de red tiene fragmentos. 1 significa que no hay fragmentación. (Dependiendo de si el tamaño de los datos del paquete de red excede la MTU)

3. Más fragmentos

0 significa que el segmento es el último. Un valor de 1 indica que este paquete de red es solo uno de ellos, y hay más fragmentos más adelante.

En el paquete de red muestreado en este artículo, el valor del segmento indicador es 0x4-> 010. Indica que este paquete de red no está fragmentado.

Corte de corte:

Valor de 13 bits, el rango de valores es 0 ~ 8191. Indica el número de bits de desplazamiento de este fragmento en relación con el primer bit en el paquete de datos original. Este valor tiene que multiplicarse por 8 para ser la verdadera posición de desplazamiento. Para decirlo sin rodeos, es un marco de referencia para el reensamblaje masivo al receptor cuando los datos del paquete de red son demasiado largos para dividirse y enviarse.

 

Tiempo de supervivencia:

Eso es TTL, que ocupa 1 byte. En este ejemplo, el valor es 0x40, que es 60 en decimal. Indica el número máximo de saltos de ruta permitidos por este paquete IP. Cada vez que un paquete IP pasa a través de un enrutador, este valor disminuye en 1. Cuando el valor disminuye a 0 y no se alcanza el destino, el paquete de red se descarta. De hecho, este TTL es realmente bastante importante. Sin ella, nuestro Internet puede estar completamente bloqueado por spam.

 

Acuerdo:

1 byte Indica el tipo de protocolo utilizado por los datos transportados en el paquete IP. Los valores opcionales comunes son los siguientes:

1、0x06 - TCP

2、0x11 - UDP

3、0x01 - ICMP

4、0x02 - IGMP

 

La primera suma de control:

 2 bytes de código de verificación de paquetes IP.

 

Dirección de origen + dirección de destino:

Cada uno toma 4 bytes. c0a84d67-> 192.168.77.103; c0a84d68-> 192.168.77.104

 

En este punto, hemos analizado que hay 20 bytes. Dado que nuestro paquete IP no tiene campos opcionales y campos de relleno, todo el protocolo del paquete IP ha terminado. Lo siguiente es la parte del campo de datos.

 

1.4, formato de mensaje TCP

Aquí nuestra parte de datos utiliza el protocolo TCP para comunicarse. Entonces, el siguiente análisis es el formato de mensaje TCP.

 

El formato estándar del protocolo de mensaje TCP se muestra a continuación:

 

En el paquete de red utilizado en este análisis de ejemplo, el contenido de la parte TCP se muestra en la siguiente figura:

 

Puerto de origen + puerto de destino:

Los primeros cuatro bytes son el puerto de origen y el puerto de destino de la dirección IP. 0xe785 es el puerto de comunicación IP del dispositivo cliente. 0x4315 es el puerto de comunicación IP del dispositivo del servidor.

 

Número de serie + número de confirmación:

Cada uno toma 4 bytes. El número de serie es 0xaca2b4fd en este ejemplo. El número de serie y el número de confirmación se pueden describir como el flujo de tiempo en una sesión TCP. En circunstancias normales, estos dos números están aumentando secuencialmente. El número de serie es el número de serie correspondiente a este paquete de red, que simplemente se entiende como la oración que dije en un momento determinado. El número de confirmación indica que espero el número de serie utilizado por el extremo receptor al responder a mi paquete de red. Es decir, el número de serie utilizado por el receptor al responder a nuestro paquete de red debe ser el número de confirmación de nuestro paquete de red.

En términos generales, el número de confirmación es un valor que se incrementa en función del último número de serie del receptor. En este ejemplo, el número de confirmación es 0. Esto se debe a que este paquete de red es el primer paquete cuando se inicia una sesión TCP. No hay un número de serie del paquete anterior al que hacer referencia, por lo que solo puede completar 0.

Aquí hay un diagrama esquemático del número de serie y el número de confirmación utilizado en los cinco paquetes de red en este ejemplo para profundizar la comprensión. Los estudiantes aprecian cuidadosamente la diferencia entre estos dos números en varios paquetes de red consecutivos:

 

Longitud de la cabeza:

También se llama "desplazamiento de datos". 4 puestos. Indica la longitud de bytes ocupados por los datos del encabezado del paquete TCP. Este valor es 0xa en este ejemplo-> que es 10 decimal. Debe multiplicarse por 4 bytes en función de este número, por lo que la longitud del encabezado TCP es 10 * 4bytes = 40bytes. Para decirlo sin rodeos, es la longitud del paquete TCP, excepto los datos.

 

12 bits de bandera:

Los 12 bits que siguen inmediatamente a la "longitud de la cabeza" en el párrafo anterior son una serie de bits de bandera. Entre ellos, los 6 bits altos son bits reservados, y los 6 bits bajos se usan para establecer algo. No quiero hacer ninguna corrección sobre el significado de estas configuraciones de bits. Pego directamente la ayuda de wireshark y la explicación en un artículo de internauta para su referencia.

 

 

 

Tamaño de la ventana:

Tarda 2 bytes. Relacionado con el control de flujo TCP. Se puede usar para indicar el tamaño de creación del búfer de recepción.

 

Suma de comprobación TCP:

Tarda 2 bytes.

 

Puntero de emergencia:

Tarda 2 bytes. Se usa para indicar la longitud de bytes de los datos de emergencia en este mensaje. Los datos urgentes estarán a la cabeza del segmento de datos.

 

Opciones adicionales:

Ligeramente

 

Los datos del paquete TCP, excepto las opciones adicionales, se fijan en 20 bytes, que es lo mismo que la longitud del encabezado del paquete IP.

 

El siguiente es un completo desmontaje de paquetes de red TCP / IP y anotaciones que transportan datos:

    000c296b8577000c296b8577 [dirección MAC de ambas partes]
     0800 [logotipo IPV4]
     45 [Versión y longitud del encabezado del mensaje IP, aquí es 5 * 4 = 20 bytes]
     00 [Servicio diferenciado] 
    003a [Longitud total] 
    fe10 [Identificación] 
    4000 [Marca Offset from slice]
     40 [TTL]
     06 [Protocolo, 06 significa TCP] 
    dd58 [Código de verificación] 
    c0a86f01c0a86f02 [Dirección IP de ambas partes] 
    [De aquí en adelante es el formato del protocolo de mensaje TCP] 
    aa384316 [Puerto de origen y puerto de destino] 
    56f4b30f [Número de serie] 
    e4c60050 [Número de confirmación] 
    8018 [Longitud de la cabeza y bandera] 
    00e5 [Ventana] 
    0807 [Suma de verificación]
     0000 [Puntero de emergencia]  
    0101080a00145223ffff9bf1 [Opciones, 12 bytes. 
    68656c6c6f0a [Datos]

 

 

2. Formato de mensaje UDP

 

A través del análisis de paquetes de red TCP / IP anterior, ya sabemos que la composición de todo el paquete de red se organiza en secuencia en no más de tres partes:

1. Información de Ethernet

2. Información del mensaje IP

3. Información del mensaje TCP o UDP o ICMP o IGMP

 

El formato del mensaje UDP es mucho más simple que el TCP.

 

El formato estándar del protocolo de mensaje UDP se muestra a continuación:

Puerto de origen + puerto de destino:

Ligeramente

 

Longitud:

Tarda 2 bytes. Encabezado de paquete UDP + longitud total de datos.

 

Comprobar valor:

Ligeramente

 

Datos:

Ligeramente

 

Debido a que la comunicación UDP no es como TCP para darse la mano y decir adiós, simplemente transmite datos a la red de manera directa y grosera, por lo tanto, analizar su formato no tiene que ser tan engorroso como analizar TCP antes. Y la información de Ethernet y la información del mensaje de IP frente al paquete de red de comunicación UDP ya se han introducido en el frente. Por lo tanto, publique directamente un paquete de red UDP completo para enviar datos y haga los comentarios correspondientes para su referencia y aprendizaje:

comunicaciones de paquetes UDP completos red: 
000c296b8577000c296b8577080045000022cf40400040110c36c0a86f01c0a86f028ebf4316000e8acb68656c6c6f0a

Interpretación:
000c296b8577000c296b8577 dirección [MAC] tanto en el
0800 [número de versión IP, aquí es IPV4] [El siguiente es el principio del paquete IP] 45 [+ longitud del número de versión de cabecera. IPV4 + 20bytes] 00 [Servicios diferenciados] 0022 [Longitud total distinta del encabezado Ethernet de 14 bytes, 34 bytes] cf40 [Identidad, es decir, número de sesión] 4000 [Logotipo + desplazamiento de corte. Sin fragmentación 40 [TTL] 11 [Protocolo para transportar datos en paquetes IP, aquí está UDP] 0c36 [Suma de verificación del encabezado del paquete IP] c0a86f01c0a86f02 [Dirección IP de ambas partes] [El siguiente es un paquete UDP] 8ebf4316 [Puerto de ambas partes Numero Puerto de origen + puerto de destino] 000e [longitud, longitud total del paquete UDP, encabezado UDP+ Datos en total 14 bytes] 8acb [Código de verificación] 68656c6c6f0a [Datos]

 


Materiales de referencia:

https://blog.csdn.net/bobozai86/article/details/87518617

https://blog.csdn.net/a7980718/article/details/82316880

https://blog.csdn.net/a4230787/article/details/80301048

Supongo que te gusta

Origin www.cnblogs.com/chorm590/p/12674282.html
Recomendado
Clasificación