¿Cuáles pueden ser las razones de los errores de conexión rechazada?
Estoy intentando escribir un programa de servidor en C, usando otro cliente, aparece este error cuando intento conectarme a través del puerto 2080, por ejemplo.
connection refused
¿Cuáles pueden ser las razones de este error?
Podría haber muchas razones, pero las más comunes son:
El puerto no está abierto en la máquina de destino.
El puerto está abierto en la máquina de destino, pero su acumulación de conexiones pendientes está llena.
Un firewall entre el cliente y el servidor está bloqueando el acceso (verifique también los firewalls locales).
Después de verificar si hay firewalls y que el puerto esté abierto, use telnet para conectarse a la IP/puerto para probar la conectividad. Esto elimina cualquier problema potencial de su aplicación.
El error significa que el sistema operativo del socket de escucha reconoció la solicitud de conexión entrante pero decidió rechazarla intencionalmente.
Suponiendo que un firewall intermedio no interfiera, solo hay dos razones (que yo sepa) para que el sistema operativo rechace una solicitud de conexión entrante. Una razón ya se ha mencionado varias veces: el puerto de escucha al que se está conectando no está abierto.
Hay otra razón que aún no se ha mencionado: el puerto de escucha está realmente abierto y se utiliza activamente, pero su acumulación de solicitudes de conexión entrantes en cola ha alcanzado su máximo, por lo que no hay espacio disponible para que la solicitud de conexión entrante se ponga en cola en ese momento. momento. El código del servidor no ha llamado a aceptar() suficientes veces todavía para terminar de borrar los espacios disponibles para nuevos elementos de la cola.
Espere un momento e intente la conexión nuevamente. Desafortunadamente, no hay forma de diferenciar entre "el puerto no está abierto en absoluto" y "el puerto está abierto pero demasiado ocupado en este momento". Ambos usan el mismo código de error genérico.
Si intenta abrir una conexión TCP con otro host y ve el error "Conexión rechazada", significa que
- Envió un paquete TCP SYN al otro host.
- Luego recibió un paquete TCP RST en respuesta.
RST es un bit en el paquete TCP que indica que la conexión debe restablecerse. Por lo general, significa que el otro host ha recibido su intento de conexión y está rechazando activamente su conexión TCP, pero a veces un firewall interviniente puede bloquear su paquete TCP SYN y enviarle un TCP RST.
Consulte https://www.rfc-editor.org/rfc/rfc793 página 69:
ESTADO SINCRONIZADO
Si el bit RST está establecido
Si esta conexión se inició con un OPEN pasivo (es decir, vino del estado LISTEN), entonces regrese esta conexión al estado LISTEN y regrese. No es necesario informar al usuario. Si esta conexión se inició con un OPEN activo (es decir, vino del estado SYN-SENT), entonces la conexión fue rechazada, indique al usuario "conexión rechazada". En cualquier caso, se deben eliminar todos los segmentos de la cola de retransmisión. Y en el caso ABIERTO activo, ingrese al estado CERRADO, elimine el TCB y regrese.
Conexión rechazada significa que el puerto al que intenta conectarse no está realmente abierto.
Entonces, o se está conectando a la dirección IP incorrecta, o al puerto incorrecto, o el servidor está escuchando en el puerto incorrecto, o en realidad no se está ejecutando.
Un error común es no especificar el número de puerto al vincular o conectar en el orden de bytes de la red...