TCP (Transmission Control Protocol): retrato del protocolo de transporte
Cuando nos queremos conectar a Internet, solo necesitamos un par de maniobras para establecer una conexión entre el rúter y el ordenador o el terminal móvil. No se requieren más pasos, ya que el inicio de sesión en red es automático, al igual que la asignación de una dirección individual de Internet que necesitas para enviar y recibir datos. Todo ello es posible gracias a una serie de protocolos que también se conoce como familia de protocolos de Internet. En este contexto, uno de los miembros más importantes y antiguos es el protocolo de control de transmisión TCP, siglas de Transmission Control Protocol, y sirve para determinar cómo los dispositivos reunidos en la red deben transmitir sus datos.
¿Qué es el Transport control Protocol?
El protocolo TCP es un acuerdo estandarizado de transmisión de datos entre distintos participantes de una red informática. La historia de este protocolo se remonta hasta el año 1973, cuando los informáticos Robert E. Kahn y Vinton G. Cerf publicaron su primera versión en el marco de su trabajo de investigación. No obstante, tuvieron que pasar otros ocho años para que se estandarizara con el documento RFC 793. Desde entonces, se ha ido sucediendo una serie de mejoras y ampliaciones, aunque el núcleo del producto se mantiene sin cambios hasta hoy en día. La versión actual, publicada en el RFC 7323 es del año 2014.
El estado actual de desarrollo del protocolo TCP permite establecer una conexión entre dos puntos terminales en una red informática común que posibilite un intercambio mutuo de datos. En este proceso, cualquier pérdida de datos se detecta y resuelve, por lo que se considera un protocolo fiable. Dentro de la familia de protocolos de Internet, el TCP, junto con el UDP y el SCTP forma el grupo de los protocolos de transporte, que, según el modelo OSI, se ubican en la capa de transporte dentro de la arquitectura de red. Como el protocolo TCP se combina casi en todos los casos con el protocolo de Internet (IP) y esta conexión forma la base de la gran mayoría de redes locales y servicios de red, es común hablar del conjunto de protocolos TCP/IP, aunque en realidad se haga referencia a la familia de protocolos de Internet.
¿Cómo funcionan exactamente las conexiones con el protocolo TCP?
El protocolo de control de transmisión permite la transmisión de información en ambas direcciones. Por lo tanto, los sistemas informáticos que se comunican mediante TCP pueden enviar y recibir datos de forma simultánea, como si se tratase de una llamada telefónica. En este contexto, las unidades de transmisión básicas de las que echa mano el protocolo son segmentos (paquetes) que, aparte de los datos de uso, también pueden contener información de control y están limitados a un tamaño de 1500 bytes. El establecimiento y la interrupción de las conexiones, que se pueden catalogar como conexiones de terminal a terminal, así como la transmisión de datos en sí, la realiza el software TCP en la pila de protocolos de red del sistema operativo correspondiente.
El software TCP se activa mediante distintas aplicaciones de red, como los navegadores de red o los servidores, a través de interfaces específicas. Cada conexión se debe identificar siempre claramente mediante dos puntos terminales definidos (cliente y servidor). En este contexto, qué lado desempeña el papel de cliente y cuál el de servidor es indiferente. Lo que importa es que el software TCP cuente con una pareja ordenada de dirección IP y puerto (también denominada “2-tupla” o “socket”) en cada punto terminal.
Triple apretón de manos: el establecimiento de la conexión TCP en detalle
Para que el establecimiento de una conexión TCP válida sea posible, ambos puntos terminales deben contar con una dirección IP unívoca (IPv4 o IPv6) y deben haber declarado y habilitado el puerto deseado para la transmisión de datos. Mientras que la dirección IP funciona como característica de identificación, el puerto sirve para que el sistema operativo pueda asignar las conexiones a las aplicaciones de servidor y de cliente.
Puedes consultar una explicación detallada de la interacción entre TCP e IP en nuestro artículo extendido sobre TCP/IP.
La secuencia específica para establecer una conexión con el protocolo TCP es la siguiente:
- En el primer paso, el cliente que desea establecer la conexión envía al servidor un paquete SYN o segmento SYN (del inglés synchronize = “sincronizar”) con un número de secuencia individual y aleatorio. Este número garantiza la transmisión completa en el orden correcto (sin duplicados).
- Si el servidor ha recibido el segmento, confirma el establecimiento de la conexión mediante el envío de un paquete SYN-ACK (del inglés acknowledgement = “confirmación”) incluido el número de secuencia del cliente después de sumarle 1. De forma adicional, transmite un número de secuencia propio al cliente.
- Para finalizar, el cliente confirma la recepción del segmento SYN-ACK mediante el envío de un paquete ACK propio, que en este caso cuenta con el número de secuencia del servidor después de sumarle 1. En este punto también puede transmitir ya los primeros datos al servidor.
Como el establecimiento de la conexión mediante el Transmission Control Protocol implica un total de tres pasos, se ha acuñado el nombre de “triple apretón de manos” para este proceso.
Si el puerto del servidor está cerrado o si bloquea el acceso, en lugar del paquete de confirmación, el cliente recibe un paquete TCP-RST (del inglés reset = “restablecer”).
TCP teardown: así se interrumpe una conexión TCP de forma controlada
Ambos interlocutores de la comunicación pueden interrumpir una conexión TCP establecida e incluso se permite la interrupción unilateral. Este último caso también se denomina como conexión semicerrada, en la que la contraparte todavía puede transmitir datos cuando un participante ya ha interrumpido la conexión.
Las diferentes estaciones del establecimiento de conexión mutua (por no complicar la explicación, iniciado, en este caso, también por el cliente) se pueden resumir de la siguiente manera:
- El cliente envía un segmento FIN al servidor para comunicarle que ya no desea enviar más datos. Al igual que en el establecimiento de conexión, también envía un número de secuencia propio.
- El servidor confirma la recepción del paquete mediante un segmento ACK que incluye el número de secuencia después de sumarle 1.
- Si el servidor, a su vez, ha finalizado con la transmisión de datos, envía también un paquete FIN al que vuelve a añadir su número de secuencia.
- Ahora le toca al cliente enviar un paquete ACK con el número de secuencia recibido tras sumarle 1 y así el servidor dará la conexión TCP por interrumpida oficialmente.
No obstante, para la parte que envía el último segmento ACK (en nuestro caso, el cliente), la conexión no se interrumpe inmediatamente. Como no existe forma de garantizar que el último paquete enviado ha llegado a su destino, el correspondiente interlocutor de comunicación permanece en un modo de espera (también estado “Time-Wait”) hasta que hayan transcurrido los tiempos de ejecución máximos del segmento ACK y de un posible nuevo segmento FIN (según RFC 793, 2 minutos en cada caso).
¿Cómo es la estructura del encabezado TCP?
Como es costumbre en los protocolos, los datos más importantes, es decir, los datos que se necesitan para el establecimiento de la conexión y la transmisión de datos con el protocolo de control de transmisión se encuentran en el encabezado de un paquete TCP. Estos datos de cabecera (también información de control) están antes de la carga útil (Payload) y suelen tener un tamaño de 20 bytes (160 bits), seguidos de hasta 40 bytes (320 bits) de información adicional que es opcional y que no se usa en todos los paquetes.
Si solo se transmiten confirmaciones, mensajes de error, etc., como en el caso de los mensajes SYN y FIN (establecimiento/interrupción de conexión), se permiten segmentos TCP sin datos de uso, o sea, encabezados puros.
Si lo analizamos más en detalles, esta es la estructura del encabezado TCP:
En este contexto, los distintos componentes o campos del encabezado del protocolo TCP tienen el siguiente significado:
Puerto de origen (16 bits): indica el número de puerto del emisor.
Puerto de destino (16 bits): indica el número de puerto del receptor.
Número de secuencia (32 bits): el número de secuencia indica el primer byte de los datos de uso anexos o se envía en el contexto del establecimiento o la interrupción de la conexión. Sirve para la validación y clasificación (después de la transmisión) de los segmentos.
Número de confirmación (32 bits): en este campo se indica el número de confirmación que espera el emisor en siguiente lugar. La condición para su validez es una etiqueta ACK (en el campo “Flags”).
Offset (4 bits): el campo “Offset” indica la longitud del encabezado en bloques de 32 bits para destacar el punto de inicio de los datos de uso. Dicho punto varía de segmento a segmento debido al campo variable de opciones.
Reservado (6 bits): según RFC 793, reservado para un uso futuro (sin uso hasta ahora). Este campo siempre debe tener un valor igual a “0”.
Flags (6 bits): mediante los 6 posibles bits individuales en el campo “Flags” se pueden activar distintas acciones TCP para organizar la comunicación y el procesamiento de datos. Las flags, que se ajustan o no para estas activaciones, son las siguientes:
- URG. La etiqueta “Urgent” (en español, “urgente”) señaliza a la aplicación TCP que los datos de uso hasta el Urgent-Pointer (véase más abajo) fijado se deben procesar inmediatamente.
- ACK. Junto con el número de confirmación, ACK sirve para confirmar la recepción de paquetes TCP. Si no se ha ajustado la etiqueta, el número de confirmación se convierte en inválido de forma automática.
- PSH. “Push” sirve para facilitar un segmento TCP inmediatamente sin tener que pasar por el buffer de datos del emisor y el receptor.
- RST. Si ha surgido un error durante la transmisión, la aplicación se puede restablecer mediante un paquete TCP con flag RST (“Reset”) ajustado.
- SYN. Los mensajes con una etiqueta SYN representan el primer paso del triple apretón de manos, es decir, inician el establecimiento de conexión.
- FIN. “Finish” señaliza a la contraparte que uno de los interlocutores de la comunicación ha finalizado la transmisión.
Tamaño de ventana (16 bits): en este campo se le transmite al interlocutor de comunicación el número de bytes que el emisor está dispuesto a recibir.
Suma de comprobación (16 bits): el protocolo es capaz de reconocer errores de transmisión de manera fiable. En este contexto, se usa la suma de comprobación, que se calcula a partir del encabezado, los datos de uso y el denominado seudoencabezado.
Urgent-Pointer (16 bits): el Urgent-Pointer (indicador “urgente”) indica la posición del primer byte después de los datos de uso que deben tratarse con carácter urgente. Por lo tanto, este campo solo es válido y relevante si tiene una etiqueta URG.
Opciones (0-320 bits): si se desea que se faciliten funciones TCP que no pertenecen al encabezado general, esta tarea se realiza mediante el campo de opciones. Un ejemplo es la definición del tamaño máximo de segmento. La longitud de las opciones siempre debe ser un múltiplo de 32 bits, en caso contrario, hay que rellenar con bits cero (padding).
Así funciona la transmisión de datos con TCP
Antes de que se transmitan los primeros datos, el emisor y el receptor se ponen de acuerdo en cuanto al tamaño máximo de los segmentos que se van a enviar (Maximum Segment Size, MSS). Por defecto se permiten hasta 1500 bytes por segmento, de los que hay que tener en cuenta que 20 bytes son para el encabezado TCP y otros 20 bytes, para el encabezado IP, de manera que quedan 1460 bytes disponibles para datos de uso. Si se desea un tamaño concreto, hay que especificarlo a través del campo de opciones, tal y como se ha explicado anteriormente, por lo que hay que restar más capacidad a los bytes destinados para los datos de uso.
Si contamos con el tamaño máximo de segmento menos los encabezados, esto significa que un paquete TCP no puede transmitir datos de un tamaño superior a 1,46 KB, o sea, 0,00146 MB. Para que el protocolo se pueda usar para enviar contenido web, como imágenes, que pueden ocupar varios cientos de kilobytes, se emplea la segmentación, en la que los datos de aplicación se dividen en varios bloques de datos antes del transporte, se numeran y se envían en un orden aleatorio. Como el receptor debe confirmar la recepción de cada uno de los segmentos y puede reconstruir el orden real mediante los números de secuencia, no tiene ningún problema para recomponer todos los datos de uso recibidos después de la transmisión.
Si el emisor no recibe confirmación para uno de los segmentos enviados, se usa el denominado Retransmission Timeout (RTO). Si se agota esta cuenta regresiva tras el envío de un paquete antes de que se transmita respuesta alguna, se inicia automáticamente un nuevo envío. La duración de la cuenta regresiva se adapta de forma dinámica mediante un algoritmo y depende de la velocidad individual de transmisión.
Resumen de los datos más importantes del Transmission Control Protocol
El protocolo TCP ya lleva un cuarto de siglo marcando la historia y el desarrollo de las redes informáticas. Esto es debido, por un lado, a su buena compatibilidad con el también histórico protocolo de Internet (IP) y, por el otro, gracias a las características principalmente ventajosas que le diferencian de alternativas como el UDP o el SCTP. En este contexto, este es un resumen de las características más importantes:
- El TCP está orientado a la conexión y permite una comunicación recíproca entre dos puntos terminales mediante el denominado triple apretón de manos.
- Es fiable, ya que el protocolo garantiza que se transmiten todos los datos de forma íntegra y que el receptor pueda recomponerlos en el orden correcto.
- Envía los datos en segmentos individuales con un tamaño máximo de 1500 bytes (incluidos los encabezados).
- En el modelo OSI, el TCP se clasifica en la capa de transporte (capa 4).
- En la mayoría de los casos, el protocolo se suma al protocolo de Internet (IP), por lo que a menudo se habla del conjunto de protocolos TCP/IP.
- El encabezado TCP cuenta con un tamaño por defecto de 20 bytes y pueden llegar a sumarse hasta 40 bytes de opciones adicionales.