Conexión en TCP

En el TCP se establecen las conexiones usando el protocolo de acuerdo a tres vias (three-way handshake). Para establecer una conexión, un lado, digamos el servidor, espera pasivamente una conexión entrante ejecutando las primitivas LISTEN y ACCEPT y especificando cierto origen o bien nadie en particular.

En el otro lado, digamos el cliente, ejecuta una primitiva CONNECT especificando la dirección y el puerto IP con el que se desea conectar, el tamaño máximo de segmento TCP que está dispuesto a aceptar y opcionalmente algunos datos de usuario (ejemplo: contraseña). La primitiva CONNECT envía un segmento TCP con el bit SYN encendido y el bit ACK apagado, y espera una respuesta.

Al llegar el segmento al destino, la entidad TCP ahí revisa si hay un proceso que haya ejecutado un LISTEN en el puerto indicado en el campo de puerto de destino. Si no lo hay, envía una contestación con el bit RST encendido para rechazar la conexión.

Si algún proceso está escuchando en el puerto, ese proceso recibe el segmento TCP entrante y puede entonces aceptar o rechazar la conexión; si la acepta, se devuelve un segmento de acuse de recibo.

Aunque las conexiones TCP son dúplex integral, para entender la manera en que se liberan las conexiones es mejor visualizarlas como un par de conexiones símplex. Cada conexión símplex se libera independientemente de su igual. Para ello cualquiera de las partes puede enviar un segmento TCP con el bit FIN encendido, lo que significa que no tiene más datos que transmitir. Al reconocerse el FIN, ese sentido se apaga. Sin embargo puede continuar un flujo de datos indefinido en el otro sentido. Cuando ambos sentidos se han apagado se libera la conexión.

Estados en TCP

CLOSED : No hay conexión activa ni pendiente.

LISTEN: El servidor espera una llamada.

SYN RCVD: Llegó una solicitud de conexión; espera ACK.

SYN SENT: La aplicación comenzó a abrir una conexión.

ESTABLISHED: Estado normal de transferencia de datos.

FIN WAIT 1: La aplicación dijo que ya terminó.

FIN WAIT 2: El otro lado acordó liberar.

TIMED WAIT: Espera a que todos los paquetes mueran.

CLOSING: Ambos lados intentaron cerrar simultáneamente.

CLOSE WAIT: El otro lado inició una liberación.

LAST ACK: Espera a que todos los paquetes mueran.

Nivel de Transporte/Conexión en TCP