es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Comenzaron a llegar paquetes RST desde el socket del cliente después de que respondí con un paquete SYN + ACK al paquete SYN.

Estoy creando un programa de simulación TCP simple que puede actuar como un servidor TCP simple sobre IP, el problema está en mi código. Codifiqué que cuando recibo un paquete SYN, formulo todas las respuestas en mi programa servidor y creo el paquete de respuesta y lo respondo con un paquete SYN+ACK.

Pero justo después de responder con el paquete SYN+ACK, recibo un paquete RST desde el socket del cliente. No tengo idea de qué está mal con mi TCP o qué encabezados hacen que el socket del cliente simplemente responda mi paquete SYN+ACK con un paquete RST.

Leí en internet sobre el paquete RST y dice que se recibe en el host por dos razones, pero puede haber más razones.

Hay algunas circunstancias en las que un paquete TCP puede no ser esperado; las dos más comunes son:

El paquete es un paquete SYN inicial que intenta establecer una conexión a un puerto del servidor en el que ningún proceso está escuchando.
El paquete llega a una conexión TCP que fue establecida previamente, pero la aplicación local ya cerró su socket o salió y el sistema operativo cerró el socket.

Por lo tanto, me gustaría saber cuál es la razón en mi caso.

Cuando recibí el paquete SYN en el socket IP del programa

0000 45 00 00 3c 81 37 40 00 40 06 24 11 c0 a8 0a 14
0010 c0 a8 0a 0f ba 50 00 50 15 1a 68 41 00 00 00 00
0020 a0 02 fa f0 a3 ce 00 00 02 04 05 b4 04 02 08 0a
0030 de d7 fc f8 00 00 00 00 01 03 03 07

Respondo con el paquete SYN+ACK. Mi paquete TCP se ve así:

0000 45 00 00 28 00 64 40 00 40 06 a4 f8 c0 a8 0a 0f
0010 c0 a8 0a 14 00 50 ba 50 00 01 00 00 15 1a 68 41
0020 50 12 fa f0 e7 70 00 00

Por lo tanto, los campos en TCP son como se muestra arriba, en 20 (encabezado IP) + 20 (encabezado TCP) bytes del paquete (SYN+ACK) para responder al SYN+ACK desde mi código al socket del cliente. Pero en lugar de empezar a enviar datos desde el cliente, mi cliente empieza a enviar paquetes RST y en mi código recibo un paquete RST justo después de enviar el paquete SYN+ACK desde mi código al socket del cliente.

¿Pero qué es lo que en los valores de los encabezados anteriores hace que reciba un paquete RST en lugar de recibir algunos datos del cliente o al menos que la llamada a la función [connect()] de mi cliente tenga éxito? ¿Cómo puedo hacer que este paquete RST que envía mi cliente desaparezca para que finalmente pueda empezar a enviar datos y mi código de servidor comience a recibir datos? ¿Qué estoy haciendo mal?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Según la información proporcionada, es probable que el socket del cliente esté recibiendo el paquete SYN+ACK del servidor, pero no lo reconozca como una respuesta válida a su paquete SYN inicial. Esto podría ser debido a varios factores, incluyendo secuenciación incorrecta de paquetes o errores de suma de verificación en las cabeceras. También es posible que el socket del cliente no esté configurado adecuadamente para manejar el paquete SYN+ACK, o que esté experimentando algún otro problema no relacionado con el código del servidor.

    Para solucionar el problema, puede ser útil examinar los mensajes de error específicos o las entradas de registro asociadas al paquete RST recibido por el servidor. Esto puede proporcionar pistas adicionales sobre la causa del problema. También puede ser útil examinar de cerca los campos de cabecera tanto en los paquetes SYN como en los paquetes SYN+ACK para asegurarse de que se están estableciendo correctamente y coinciden con los valores esperados.

    Si no se identifican problemas evidentes con el código o las cabeceras de los paquetes, puede ser necesario depurar más a fondo el socket del cliente y/o el código del servidor para encontrar la causa raíz del problema. Esto puede implicar realizar pruebas con otros clientes o utilizar herramientas de captura de paquetes para monitorear el tráfico de la red e identificar cualquier anomalía o error en la comunicación.

Comments are closed.