Protocolo de Control de Transmisión (TCP)

Figura: Protocolo de Control de Transmisión (TCP)

TCP es un protocolo estándar con número 7 de STD. TCP se describe en el RFC 793 - Protocolo de Control de Transmisión. Este protocolo se recomienda, pero en la práctica cada implementación de TCP/IP que no se use exclusivamente para encaminamiento incluirán TCP.

TCP proporciona muchas más facilidades para las aplicaciones que UDP, recuperación de errores, control de flujo y confiabilidad. Es un protocolo orientado a conexión en contraposición a UDP que no lo es. La mayoría de los protocolos de las aplicaciones de usuario, como TELNET y FTP, utiliza TCP.

Sockets

El concepto de socket se discutió anteriormente en Puertos y sockets.

Dos procesos se comunican a través de sockets TCP. El modelo de socket proporciona a un proceso una conexión full-duplex con otro proceso. La aplicación no necesita manejar el flujo de datos en la conexión; estas facilidades las proporciona TCP.

TCP utiliza el mismo principio que UDP (ver Puertos) para proporcionar multiplexación. Como UDP, usa los puertos conocidos y efímeros. Cado extremo de una conexión TCP tiene un socket que se puede indentificar por la tripleta <TCP, dirección IP, número de puerto>. A esto también se le demomina half-association. Si dos procesos están comunicados por TCP, poseen una conexión lógica que se identifica unívocamente por los dos sockets implicados, es decir, por la combinación <TCP, dirección IP local, puerto local, dirección IP remota, puerto remoto>. Ver Figura - Conexión TCP. Los procesos servidores son capaces de gestionar múltiples conversaciones por un único puerto.

Figura: Conexión TCP - Procesos X e Y comunicados a través de una conexión TCP transmitiendo datagramas IP

Concepto TCP

Como se citó anteriormente, el propósito primordial de TCP es proporcionar circuitos lógicos confiables o servicios de conexión entre parejas de procesos. Esto no implica confiabilidad desde protocolos de más bajo nivel (como IP) así que TCP debe garantizar esto por sí mismo.

TCP se puede caracterizar por las siguientes facilidades que proporciona a las aplicaciones que hacen uso de él:

El principio de ventana

Un protocolo de transporte simple debe usar el principio siguiente: enviar un paquete y luego esperar por un reconocimiento del receptor antes de que envíe el próximo paquete. Si el ACK no se recibe en un tiempo razonable, retransmite el paquete.

Figura: El principio de ventana

Aunque este mecanismo asegura confiabilidad, únicamente utiliza una parte del ancho de banda de la red.

Considerar ahora un protocolo donde los grupos emisores its paquetes to be transmitted as:

Figura: Paquetes de mensaje

Y utiliza las siguientes reglas:

En nuestro ejemplo, el emisor debe transmitir los paquetes 1 a 5 sin esperar por ningún reconocimiento:

Figura: El principio de ventana

En el momento en que el emisor recibe el ACK 1 (reconocimiento para el paquete 1), debe rotar su ventana para excluir dicho paquete:

Figura: Paquetes de mensaje

En este punto, el emisor debe también transmitir el paquete 6.Imaginemos algunos casos especiales:

Conclusión:

Este mecanismo de ventana asegura:

El principio de ventana aplicado a TCP

El principio de ventana anterior lo utiliza TCP con ligeras diferencias:

El flujo de datos del emisor se puede ver como:

Figura: Principio de ventana aplicado a TCP

Donde:

A - Bytes que se transmiten y se reconocen.
B - Bytes que se envían pero no se han reconocido.
C - Bytes que se deben enviar sin espera de reconocimiento.
D - Bytes que no se deben enviar.

Hay que recordar que TCP separará los bytes en segmentos y que un segmento TCP únicamente posee el número de secuencia del primer byte en el segmento.

Formato del segmento TCP

Figura: Formato de segmento TCP

donde:

Puerto de origen
Número de puerto de origen de 16-bit usado por el receptor para responder.
Puerto de destino
Número de puerto destino de 16 bit.
Número de secuencia
Número de secuencia del primer byte de datosen este segmento. Si el bit de control está activo, el número de secuencia es inicialmente el n y el primer byte de datos es el n+1.
Acknowledgment Number
Si el bit de control ACK está activo, este campo contiene los valores del siguiente número de secuencia que el receptor está esperando recibir.
Desplazamiento de datos
Número de 32 bit en la cabecera TCP. Indica donde comienzan los datos.
Reservado
Seis bits reservados para futuro uso; debe ser cero.
URG
Indica que el campo puntero urgente es significativo en este segmento.
ACK
Indica que el campo de reconocimiento es significativo en este segmento.
PSH
Función push.
RST
Resetea la conexión.
SYN
Sincroniza los números de secuencia.
FIN
No hay más datos del emisor.
Ventana
Se usa en los segmentos ACK. Especifica el número de bytes de datos comenzando con el único indicado en el campo de número de reconocimiento que el receptor (= el emisor de este segmento) es willing para aceptar.
Checksum
Complemento a uno de 16-bit de la suma en complemento a uno de todas las palabras de 16 bit en una pseudo-cabecera, la cabecera TCP y los datos TCP.

Mientras se computa la suma de comprobación, el campo de dicha suma se considera cero.

La pseudo-cabecera es la misma que usa UDP para calcular la suma de comprobación. Esta pseudo cabecera IP sólo se utiliza para calcular esta suma con el formato mostrado en la figura siguiente:

Figura: Cabecera Pseudo-IP
Puntero urgente
Apunta al primer byte de datos que sigue a los datos urgenetes. Sólo es significativo cuando el bit de control está activo.
Opciones
Sólo para el caso de opciones de datagrama IP, las opciones pueden ser:

Hay actualmente definidas sólo tres opciones:

Clase  Longitud  Significado
-----  --------  -----------
  0       -      Fin de lista de opciones
  1       -      Sin operarión
  2       4      Tamaño máximo del segmento

Figura: Opción de tamaño máximo de segment

Esta opción se utiliza únicamente durante el establecimiento de la conexión (bit de control SYN activado) y se envía desde el lado que recibe los datos para indicar la longitud máxima de segmento puede hyle. Si esta opción no se usa, no se permite ningún tamaño de segmento.

Rellenando con ceros
Todos los bytes cero utilizados para rellenar la cabecera TCP a una longitud total que es un múltiplo de 32 bits.

Reconocimientos y retransmisiones

TCP envía datos en segmentos de longitud variable. Los números de secuencia están basados en un contador de byte. Los reconocimientos especifican el número de secuencia del próximo byte que espera recibir el receptor.

Ahora suponemos que un segmento se pierde o es erróneo. En este caso, el receptor reconocerá todos segmentos posteriores que se recibieron bien con un reconocimiento referido al primer byte del paquete perdido. El emisor dejará de transmitir cuando haya enviado todos los bytes de la ventana. Eventualmente, ocurrirá un timeout y el segmento perdido se retransmitirá.

Suponemos un tamaño de ventana de 1500 bytes, y segmentos de 500 bytes.

Figura: Proceso de reconocimiento y retransmisión

Se nos plantea un problema, desde que el emisor sabe que el segmento 2 se ha perdido o está, pero no sabe nada acerca de los segmentos 3 y 4. El emisor debería retransmitir, al menos, el segmento 2, pero podría transmitir también el 3 y el 4 (desde que they are conin la ventana actual). Es posible que:

  1. Se recibió el segmento 3, y no sabemos nada del segmento 4: se podría recibir, pero no alcanzó el ACK, o también se podría perder.
  2. El segmento 3 se perdió y recibimos el ACK 1500 después de recibir el segmento 4.

Cada implementación TCP es libre de reaccionar a un timeout así como a los deseos de implementados. Podría retransmitir únicamente el segmento 2, pero en el caso 2 citado, esperaríamos otra vez a queel segmento 3 diera un timeout. En este caso, perdemos todas las ventajas de rendimiento del mecanismo de ventana. TCP debe volver a enviar inmediatamente todos los segmentos de la ventana actual.

Se pierde el rendimiento máximo cualquiera que sea la elección. Esto se debe a que el ACK no contiene un segundo número de secuencia de reconocimiento indicando el marco actual recibido.

Intervalos de timeout variable

Cada TCP debería implementarse un algoritmo para adaptar los valores de timeout para usarse para los tiempos de ida y vuelta de los segmentos. Para hacer esto, TCP almacena la hora cuando se envió un segmento y la hora de recepción del ACK. Se calcula un promedio pesado sobre muchos de estos tiempos de ida y vuelta, para usarse como valor de timeout para el/los siguiente/s segmento/s a enviar.

Esta es una característica importante, dado que los retrasos deben estar disponible en internet, dependiendo de múltiples factores, tales como la carga de una red intermedia de baja velocidad o la saturación de una pasarela IP intermedia.

Estableciendo una conexión TCP

Antes de que algún datos pueda transferirse se debe establecer una conexión entre los dos procesos. Uno de los procesos (típicamente el servidor) emite una llamada passive OPEN, la otra una llamada active OPEN. La llamada passive OPEN permanece dormant hasta que otro proceso intente conectarse mediante una active OPEN.

En la red se modifican tres segmentos TCP:

Figura: Establecimiento de una conexión TCP

Todo este proceso se conoce como protocolo de tres vías. Notar que el cambio de segmentos TCP incluyen los números de secuencia inicial desde ambos lados para usarse en transferencias de datos subsecuentes.

La conexión se cierra implícitamente enviando un segmento TCP con el bit FIN (no hay más datos) activo. Como la conexión es full-duplex (esto es, tenemos dos flujos de datos independientes, uno en cada dirección), el segmento FIN sólo cierra la transferencia de datos en una dirección. El otro proceso enviará ahora los datos restantes que no ha transmitido y también termina con un segmento TCP donde el bit FIN está activo. Se elimina la conexión (información de estado de ambos lados) una vez que los datos se cierren en ambas direcciones.

Datagramas IP con segmentos TCP

Los segmentos TCP se transportan en datagramas IP con los siguientes parámetros:

              Tipo de Servicio = 00000000
                esto es: Rutina de precedencia
                         Retardo     = normal
                         Rendimiento = normal

              Tiempo de vida = 00111100 (1 minuto)

Interfaz de Programación de Aplicaciones TCP

La interfaz de programación de aplicaciones de TCP no está totalmente definida. Sólo se definen algunas funciones base. El RFC 793 - Protocolo de Control de Transmisión proporciona únicamente la descripciñon de algunas de estas funciones base. Como es el caso de la mayoría de los RFCs, en la familia de protocolos TCP/IP, se deja un alto grado de libertad a los implementadores, thereby permitiendo implementaciones óptimas (depende del sistema operativo), resultando con mejor eficiencia (mayor rendimiento).

Las siguientes llamadas a funciones se describen en el RFC:

Abrir
Para establecer la conexión se tiene en cuenta muchos parámetros:
  • Activo/pasivo
  • Socket ajeno
  • Número de puerto local
  • Valor de timeout (opcional)
  • Y muchas otras opciones

Retorna un nombre de conexión local que se usa para referenciar una conexión particular en todas las otras funciones.

Enviar
Causa que los datos en un búfer de usuario referenciado para enviar por encima de la conexión. Se puede activar el flag de URGENT o el de PUSH.
Recibir
Copia los datos provenientes TCP al búfer de usuario.
Cerrar
Cierra la conexión; causa un push de todos los datos restantes y un segmento TCP con el flag FIN activado.
Estado
Es una llamada que depende de la implementación que retorna información como:
  • Socket local y ajeno
  • Envía y recibe tamaños de ventana
  • Estado de la conexión
  • Nombre de la conexión local
Abortar
Causa que todas las operaciones pendientes de enviar y recibir se aborten. Se envía un RESET al TCP ajeno.
Protocolo UDP  |  Tabla de Contenidos  |  Modo de Transferencia asíncrona (ATM)