ver puertos conexiones activas abiertos linux networking tcp

puertos - ver conexiones activas linux



¿Cómo puede tener una conexión TCP de vuelta al mismo puerto? (2)

Esto puede deberse a la conexión simultánea de TCP (mencionada en esta publicación en LKML , ver también here ).

Es posible que un programa bucle al intentar conectarse a un puerto dentro del rango de puerto local dinámico (que se puede ver en /proc/sys/net/ipv4/ip_local_port_range ), para tener éxito mientras el servidor no está escuchando en ese puerto.

En un número suficientemente grande de intentos, el socket que se usa para conectarse puede estar vinculado al mismo puerto al que se está conectando, que se realiza correctamente debido a la conexión simultánea mencionada anteriormente. Ahora, mágicamente, tienes un cliente conectado a sí mismo

La máquina es RHEL 5.3 (kernel 2.6.18).

Algunas veces noto en netstat que mi aplicación tiene conexión, conexión TCP establecida cuando la dirección local y la dirección externa son las mismas.

Here mismo problema informado por otra persona también.

Los síntomas son los mismos que se describen en el enlace: el cliente se conecta al puerto X del servidor que se ejecuta localmente. Después de un tiempo, netstat muestra que el cliente tiene una conexión de 127.0.0.1:X a 127.0.0.1:X

¿Como es posible?

Editar 01

La apertura simultánea está causando el problema (muchas gracias a Hasturkun). Puede verlo en un diagrama de estado TCP clásico en transición del estado SYN_SENT a SYNC_RECEIVED


Una conexión TCP está identificada de forma exclusiva por esta tupla (local address, local port #, foreign address, foreign port #) . No es necesario que local address y foreign address , o incluso que los números de los puertos sean diferentes (aunque eso sería extremadamente extraño). Pero hay como máximo 1 conexión TCP que tiene los mismos valores para una tupla determinada.

Cuando una computadora se conecta a sí misma, su dirección local y su dirección en el extranjero son casi siempre las mismas. Después de todo, el lado ''local'' y el lado ''extranjero'' son en realidad la misma computadora. De hecho, cuando esto sucede, su computadora debe mostrar dos conexiones que tienen las mismas direcciones "locales" y "extranjeras", pero números de puerto invertidos. Por ejemplo:

$ ssh localhost

dará lugar a dos conexiones que se verán así:

$ netstat -nA inet | fgrep :22 Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.1:56039 127.0.0.1:22 ESTABLISHED tcp 0 0 127.0.0.1:22 127.0.0.1:56039 ESTABLISHED

Como puede ver, la dirección local y las direcciones extranjeras son las mismas, pero los números de los puertos son inversos. La única tupla para esta conexión TCP es (127.0.0.1, 56039, 127.0.0.1, 22) . No habrá otra conexión TCP que tenga estos mismos cuatro campos.

El hecho de que vea dos es porque su computadora está a ambos lados de la conexión. Cada extremo tiene su propia visión de cuál es ''extranjero'' y cuál es ''local''.

Incluso puedes conectarte a ti mismo en el mismo puerto, y aunque esto no es algo común, no está prohibido por la especificación. Aquí hay un programa de ejemplo en Python que hará esto:

import socket import time s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((''127.0.0.1'', 56443)) s.connect((''127.0.0.1'', 56443)) time.sleep(30)

Este código funciona porque una forma en que es posible abrir una conexión TCP es tener el otro lado de la conexión intente abrir uno con usted simultáneamente. Esto se conoce como intercambio SYN simultáneo , y la respuesta vinculada a describe de qué se trata.

También tengo un documento sobre el uso simultáneo de intercambio SYN para pasar por NAT , aunque en ese caso la fuente y el extranjero serían completamente diferentes.