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 que los números de puerto 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
resultará en dos conexiones que ser algo como esto:
$ 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 se puede ver, la dirección local y direcciones en el extranjero son los mismos, pero los números de puerto se invierten. 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á en ambos extremos de la conexión. Cada extremo tiene su propia visión de cuál es 'extranjero' y cuál es 'local'.
Incluso puede conectarse a usted mismo en el mismo puerto, y aunque esto no es una ocurrencia común, no está prohibido por la especificación. Aquí está un ejemplo de programa en Python que hacer 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 de una manera en la que es posible abrir una conexión TCP es tener al otro lado de la conexión intente abrir uno con usted de forma simultánea . Esto se conoce como simultaneous SYN exchange, y la respuesta vinculada a StackOverflow describe de qué se trata.
También tengo un documento en using simultaneous SYN exchange to get through NAT, aunque en ese caso la fuente y el extranjero serían completamente diferentes.
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 – dimba