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.
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:
- Tranferencia de flujos de datos. Desde el punto de vista de la aplicación, TCP transfiere un flujo de bytes contiguo a través de internet. La aplicación no tiene que molestarse troceyo los datos en bloques básicos o datagramas. TCP hace esto agrupando los bytes en segmentos TCP, que se transfieren a IP para transmitirlos al destino. TCP decide también por sí mismo cómo segmentar los datos y debe dirigir los datos a su propia conveniencia.
A veces, una aplicación necesita estar segura de que todos los datos pasados a TCP han llegado al destino. Por esta razón, se define una función push. Esta push todos los segmentos TCP restantes que están almacenados en el host destino. La función close connection normal también pushes los datos hacia el destino.
- Confiabilidad. TCP asigna un número de secuencia a cada byte transmitido y espera por un reconocimiento positivo (ACK) del receptor TCP. Si el ACK no se recibe en un intervalo fijado, los datos se retransmiten. Como los datos se transmiten en bloques (segmentos TCP) sólo el número de secuencia del primer byte de datos en los segmentos se envían al host destino.
El receptor TCP utiliza los números de secuencia para reorganizar los segmentos cuyo lleguen fuera de orden y para eliminar segmentos duplicados.
- Control de flujo. El receptor TCP, cuyo envía un ACK de vuelta al emisor, también indica al emisor el número de bytes que puede recibir más allá del último segmento TCP recibido sin causar ni overrun ni desbordamiento en sus búferes internos. Este se envía en el ACK de forma of the highest sequence number it puede recibir sin problemas. Este mecanismo también se denomina mecanismo ventana y se discutirá con más detalle más tarde en este mismo capítulo.
- Multiplexación. Se logra usando puertos, como en UDP.
- Conexiones lógicas. La confiabilidad y los mecanismos de control de flujo descritos anteriormente requieren que TCP inicializa y mantenga cierta información de estado para cada "flujo de datos". La combinación de este estado, incluyendo sockets, números de secuencia y tamaños de ventana, se llama conexión lógica. Cada conexión se identifica unívocamente por la pareja de sockets usados por los procesos emisor y receptor.
- Full Duplex. TCP proporciona flujos de datos concurrentes en ambas direcciones.
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.
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:
Y utiliza las siguientes reglas:
- El emisor debe enviar todos los paquetes dentro de la ventana sin recibir un ACK pero debe activar el tiempo de timeout para cada uno de ellos.
- El receptor debe reconocer cada paquete recibido, indicando el número de secuencia del último paquete recibido correctamente.
- El emisor rota su ventana cada vez que recibe un ACK.
En nuestro ejemplo, el emisor debe transmitir los paquetes 1 a 5 sin esperar por ningún reconocimiento:
En el momento en que el emisor recibe el ACK 1 (reconocimiento para el paquete 1), debe rotar su ventana para excluir dicho paquete:
En este punto, el emisor debe también transmitir el paquete 6.Imaginemos algunos casos especiales:
- El paquete 2 se pierde: el emisor no recibirá el ACK 2, así que su ventana permanecerá en la posición 1 (como la última figura mostrada). De hecho, como el receptor no recibe el paquete 2, reconocerá el paquete 3, 4 y 5 con un ACK 1, hasta que el paquete 1 sea el último recibido "en secuencia". Por el lado del emisor, eventualmente ocurrirá un timeout para el paquete 2 y será retransmitido. Notar que la recepción de este paquete por el receptor generará un ACK 5, hasta que tengan con éxito todos los paquetes del 1 al 5, y la ventana del emisor rotará cuatro posiciones después de recibir este ACK 5.
- El paquete 2 llegará, pero el reconocimiento se perderá: el emisor no recibirá el ACK 2, pero recibirá el ACK 3. El ACK 3 es un reconocimiento para todos los paquetes mayores que 3 (incluyendo el 2) y el emisor debe entonces rotar su ventana al paquete 4.
Conclusión:
Este mecanismo de ventana asegura:
- Transmisión Reliable.
- Un mejor uso del ancho de banda (mejor rendimiento).
- Control de flujo, como el receptor debe retardarse reconociendo los paquetes, conoce sus búferes libres disponibles y el tamaño de la ventana de la comunicación.
El principio de ventana aplicado a TCP
El principio de ventana anterior lo utiliza TCP con ligeras diferencias:
- Como TCP proporciona una conexión orientada a bytes, los números de secuencia se asignan a cada byte del flujo. TCP divide este flujo de bytes contiguo en segmentos TCP para transmitirlos. El principio de ventana se usa a nivel de byte; esto es, los segmentos enviados y los ACKs recibidos llevarán números de secuencia de bytes y el tamaño de la ventana se expresa como un número de bytes, rather than un número de paquetes.
- El tamaño de la ventana lo determina el receptor, cuando se establece la conexión. Cada mensaje ACK incluirá el tamaño de la ventana que el receptor está preparado para tratar esa vez en particular.
El flujo de datos del emisor se puede ver como:
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
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:
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:
- Un único byte que contiene el número de opción, o
- Una opción de longitud variable con el formato siguiente:
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 segmentoEsta 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.
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:
- 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.
- 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:
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.