sábado, 30 de julio de 2016

Entendiendo TCP Three-way Handshake

TCP (Transport Control Protocol) es un protocolo orientado a la conexión, lo que significa que establece la conexión, maneja el intercambio de datos y termina la conexión. Este protocolo establece una serie de pasos para establecer la conexión.

Para entender la programación con sockets TCP, es esencial conocer los pasos de la comunicación entre dos sistemas o mejor dicho entre un cliente y un servidor. A esta forma de establecer comunicación se le conoce como three-way handshake.

Fig 1 TCP Three-way handshake.

El proceso three-way handshake/call setup/virtual circuit setup es una única secuencia de tres paquetes de datos se intercambian al comienzo de una conexión TCP entre dos sistemas, la secuencia es la siguiente:

1-. En el primer paso del three-way handshake el cliente reserva un puerto para establecer la comunicación y envía un paquete SYN a la máquina objetivo que especifica la dirección IP, el puerto y un número de reconocimiento. El paquete SYNC tiene un número de secuencia (SEQ) asociado en este caso x. El número de secuencia es utilizado para rastrear los paquetes de datos que se transfieren entre el cliente y el servidor. La longitud del paquete enviado por el cliente tiene una longitud 0 (LENGTH = 0), esto indica que el paquete no tiene datos.

Fig 2 Primer paso: el paquete SYNC del cliente.

2-. En el segundo paso, el servidor responde con un paquete SYNC ACK, este paquete ACK es el reconocimiento que el servidor hace del paquete que recibió de parte del cliente. El número ACK adjuntado en el paquete tiene un valor del resultado de la suma de la secuencia (SEQ) del paquete 1 más la longitud del primer paquete. Aunque la longitud del paquete 1 es 0 este cuenta como un paquete por eso el ACK number = (cliente + 1). Este reconocimiento notifica al cliente que el paquete 1 fue recibido por el servidor. También el paquete SYN + ACK enviado por el servidor tiene un número de secuencia con valor y este número se utiliza para rastrear los paquetes enviados por el servidor.

Fig 3 Segundo paso: el paquete SYNC+ACK del server.

3-. El cliente reconoce la recepción del paquete del servidor. El número de ACK es un incremento del número de secuencia enviado por el servidor en el paso 2 o sea (y + 1), también el cliente también actualiza el número de secuencia que es la suma del número de secuencia que en el cliente envió en el primer paso más 1 o sea (x+1). Es importante recordar que cada uno, tanto el cliente y el servidor tienen su propio número de secuencia.

Fig 4 Tercer paso: el paquete ACK del cliente.

Una vez que el three-way handshake ha sido completado, se establece una comunicación bi-direccional sobre la conexión.

La importancia entre las aplicaciones basadas en TCP es que TCP soporta características tales como:

  • El re-ordenamiento de paquetes.
  • La repetición de los paquetes perdidos.
  • El reconocimiento de paquetes.
  • Un flujo de control.
Estas características son importantes para las aplicaciones basadas en mensajes.

La forma en que three-way handshake ayuda a sincronizar la conexión entre dos sistemas, emplea números de secuencia (SEQ) y reconocimiento (ACK) para indicar la transmisión de datos y la recepción. Las banderas (flags) de TCP controlan el flujo de sesión y es técnicamente de lo que se aprovechan los escaneadores de puertos por ejemplo. Son esas banderas las que se utilizan para recolectar información de los puertos.

Los números de puerto a diferencia de las direcciones IP no son únicos, aunque sean únicos para el sistema. Estos elementos forman los End Points entre sistemas. Mientras el sistema cliente utiliza números de puerto de manera aleatoria, los servidores en cambio utilizan números de puerto fijos, para facilitar la comunicación con varios sistemas. El RFC 1700 es un documento de consulta indispensable si se requiere información adicional acerca de los números de puerto asignados.