Diferencia entre revisiones de «Protocolo de control de transmisión»

Contenido eliminado Contenido añadido
m Revertidos los cambios de 186.104.251.18 (disc.) a la última edición de AVBOT
Línea 19:
TCP da soporte a muchas de las aplicaciones más populares de Internet, incluidas [[HTTP]], [[SMTP]], [[SSH]] y [[File Transfer Protocol|FTP]].
 
 
== Información Técnica ==
TCP es un protocolo de comunicación orientado a conexión y fiable del [[nivel de transporte]], actualmente documentado por [[IETF]] en el [[RFC]] [http://www.ietf.org/rfc/rfc793.txt 793].
Es un protocolo de capa 4 según el modelo OSI.
 
=== Funciones de TCP ===
 
En la pila de protocolos [[TCP/IP]], TCP es la capa intermedia entre el [[protocolo de internet]] (IP) y la [[Aplicación (informática)|aplicación]]. Habitualmente, las aplicaciones necesitan que la comunicación sea fiable y, dado que la capa IP aporta un servicio de datagramas no fiable (sin confirmación), TCP añade las funciones necesarias para prestar un servicio que permita que la comunicación entre dos sistemas se efectúe libre de errores, sin pérdidas y con seguridad.
 
Los servicios provistos por TCP corren en el anfitrión ([[host]]) de cualquiera de los extremos de una conexión, no en la red. Por lo tanto, TCP es un protocolo para manejar conexiones de extremo a extremo. Tales conexiones pueden existir a través de una serie de conexiones punto a punto, por lo que estas conexiones extremo-extremo son llamadas circuitos virtuales.
Las características del TCP son:
 
· '''Orientado a la conexión''': dos computadoras establecen una conexión para intercambiar datos. Los sistemas de los extremos se sincronizan con el otro para manejar el flujo de paquetes y adaptarse a la congestión de la red.
 
· '''Operación Full-Duplex''': una conexión TCP es un par de circuitos virtuales, cada uno en una dirección. Sólo los dos sistemas finales sincronizados pueden usar la conexión.
 
· '''Error Checking''': una técnica de checksum es usada para verificar que los paquetes no estén corruptos.
 
· '''Acknowledgements''': sobre recibo de uno o más paquetes, el receptor regresa un acknowledgement (reconocimiento) al transmisor indicando que recibió los paquetes. Si los paquetes no son notificados, el transmisor puede reenviar los paquetes o terminar la conexión si el transmisor cree que el receptor no está más en la [[conexión]].
 
· '''Flow Control''': si el transmisor está desbordando el buffer del receptor por transmitir demasiado rápido, el receptor descarta paquetes. Los acknowledgement fallidos que llegan al transmisor le alertan para bajar la tasa de transferencia o dejar de transmitir.
 
· '''Servicio de recuperación de Paquetes''': el receptor puede pedir la retransmisión de un paquete. Si el paquete no es notificado como recibido ([[ACK]]), el transmisor envía de nuevo el paquete.
 
Los servicios confiables de entrega de datos son críticos para aplicaciones tales como transferencias de archivos ([[FTP]] por ejemplo), servicios de bases de datos, proceso de transacciones y otras aplicaciones de misión crítica en las cuales la entrega de cada paquete debe ser garantizada.
 
=== Formato de los Segmentos TCP ===
En el nivel de transporte, los paquetes de bits que constituyen las unidades de datos de protocolo o PDU ('Protocol Data Unit') se llaman "segmentos".
El formato de los segmentos TCP se muestra en el siguiente esquema:
 
{| {{tablabonita}}
|- align="center"
! colspan="1"|+
! colspan="4" width="11%"|[[Bit]]s 0 - 3
! colspan="4" width="11%"|4 - 7
! colspan="8" width="22%"|8 - 15
! colspan="16" width="44%"|16 - 31
|- align="center"
! colspan="1"|0
| colspan="16"|Puerto Origen
| colspan="16"|Puerto Destino
|- align="center"
! colspan="1"|32
| colspan="32"|Número de Secuencia
|- align="center"
! colspan="1"|64
| colspan="32"|Número de Acuse de Recibo (ACK)
|- align="center"
! colspan="1"|96
| colspan="4"|longitud cabecera TCP
| colspan="4"|Reservado
| colspan="8"|Flags
| colspan="16"|Ventana
|- align="center"
! colspan="1"|128
| colspan="16"|Suma de Verificación (Checksum)
| colspan="16"|Puntero Urgente
|- align="center"
! colspan="1"|160
| colspan="32"|Opciones + Relleno (opcional)
|- align="center"
|- align="center"
! colspan="1"|224
| colspan="32"|&nbsp;<br />Datos<br />&nbsp;
|}
 
Las aplicaciones envían flujos de [[byte]]s a la capa TCP para ser enviados a la red. TCP divide el flujo de bytes llegado de la aplicación en segmentos de tamaño apropiado (normalmente esta limitación viene impuesta por la [[MTU|unidad máxima de transferencia]] (MTU) del [[nivel de enlace de datos]] de la red a la que la entidad está asociada) y le añade sus cabeceras. Entonces, TCP pasa el segmento resultante a la capa IP, donde a través de la red, llega a la capa TCP de la entidad destino. TCP comprueba que ningún segmento se ha perdido dando a cada uno un ''número de secuencia'', que es también usado para asegurarse de que los paquetes han llegado a la entidad destino en el orden correcto. TCP devuelve un asentimiento por bytes que han sido recibidos correctamente; un temporizador en la entidad origen del envío causará un ''timeout'' si el asentimiento no es recibido en un tiempo razonable, y el (presuntamente desaparecido) paquete será entonces ''retransmitido''. TCP revisa que no haya bytes dañados durante el envío usando un [[checksum]]; es calculado por el emisor en cada paquete antes de ser enviado, y comprobado por el receptor.
 
* Puerto de origen (16 bits): Identifica el puerto a través del que se envía.
* Puerto destino (16 bits): Identifica el puerto del receptor.
* Número de secuencia (32 bits): Sirve para comprobar que ningún segmento se ha perdido, y que llegan en el orden correcto. Su significado varía dependiendo del valor de SYN:
:* Si el flag SYN está activo (1), entonces este campo indica el número inicial de secuencia (con lo cual el número de secuencia del primer byte de datos será este número de secuencia más uno).
:* Si el flag SYN no está activo (0), entonces este campo indica el número de secuencia del primer byte de datos.
* Número de acuse de recibo (ACK) (32 bits): Si el flag ACK está puesto a activo, entonces en este campo contiene el número de secuencia del siguiente paquete que el receptor espera recibir.
* Longitud de la cabecera TCP (4 bits): Especifica el tamaño de la cabecera TCP en palabras de 32-bits. El tamaño mínimo es de 5 palabras, y el máximo es de 15 palabras (lo cual equivale a un tamaño mínimo de 20 bytes y a un máximo de 60 bytes). En inglés el campo se denomina “Data offset”, que literalmente sería algo así como “desplazamiento hasta los datos”, ya que indica cuántos bytes hay entre el inicio del paquete TCP y el inicio de los datos.
* Reservado (4 bits): Bits reservados para uso futuro, deberían ser puestos a cero.
* Bits de control (flags) (8 bits): Son 8 flags o banderas. Cada una indica “activa” con un 1 o “inactiva” con un 0.
:* CWR o “Congestion Window Reduced” (1 bit): Este flag se activa (se pone a 1) por parte del emisor para indicar que ha recibido un paquete TCP con el flag ECE activado. El flag ECE es una extensión del protocolo que fue añadida a la cabecera en el RFC 3168. Se utiliza para el control de la congestión en la red.
:* ECE o “ECN-Echo” (1 bit): Indica que el receptor puede realizar notificaciones ECN. La activación de este flag se realiza durante la negociación en tres pasos para el establecimiento de la conexión. Este flag también fue añadido a la cabecera en el RFC 3168.
:* URG o “urgent” (1 bit, ver [[URG]]): Si está activo significa que el campo “Urgente” es significativo, si no, el valor de este campo es ignorado.
:* ACK o “acknowledge” (1 bit, ver [[ACK]]): Si está activo entonces el campo con el número de acuse de recibo es válido (si no, es ignorado).
:* PSH o “push” (1 bit, ver [[PSH]]): Activa/desactiva la función que hace que los datos de ese segmento y los datos que hayan sido almacenados anteriormente en el buffer del receptor deben ser transferidos a la aplicación receptora lo antes posible.
:* RST o “reset” (1 bit, ver [[Flag RST]]): Si llega a 1, termina la conexión sin esperar respuesta.
:* SYN o “synchronize” (1 bit, ver [[SYN]]): Activa/desactiva la sincronización de los números de secuencia.
:* FIN (1 bit, ver [[FIN]]): Si se activa es porque no hay más datos a enviar por parte del emisor, esto es, el paquete que lo lleva activo es el último de una conexión.
* Ventana (16 bits): Es el tamaño de la ventana de recepción, que especifica el número de bytes que el receptor está actualmente esperando recibir.
* Suma de verificación (checksum) (16 bits): Es una suma de verificación utilizada para comprobar si hay errores tanto en la cabecera como en los datos.
* Puntero urgente (16 bits): Si el flag URG está activado, entonces este campo indica el desplazamiento respecto al número de secuencia que indica el último byte de datos marcados como “urgentes”.
* Opciones (número de bits variable): La longitud total del campo de opciones ha de ser múltiplo de una palabra de 32 bits (si es menor, se ha de rellenar al múltiplo más cercano), y el campo que indica la longitud de la cabecera ha de estar ajustado de forma adecuada.
* Datos (número de bits variable): No forma parte de la cabecera, es la carga (payload), la parte con los datos del paquete TCP. Pueden ser datos de cualquier protocolo de nivel superior en el nivel de aplicación; los protocolos más comunes para los que se usan los datos de un paquete TCP son HTTP, telnet, SSH, FTP, etcétera.
 
== Funcionamiento del protocolo en detalle ==
 
Las conexiones TCP se componen de tres etapas: establecimiento de conexión, transferencia de datos y fin de la conexión. Para establecer la conexión se usa el procedimiento llamado ''negociación en tres pasos'' (3-way handshake). Una ''negociación en cuatro pasos'' (4-way handshake) es usada para la desconexión. Durante el establecimiento de la conexión, algunos parámetros como el número de secuencia son configurados para asegurar la entrega ordenada de los datos y la robustez de la comunicación.
 
=== Establecimiento de la conexión (negociación en tres pasos) ===
[[Archivo:300px-Tcp-handshake.png|right|framed|<center>Negociación en tres pasos o ''Three-way handshake''</center>]]
Aunque es posible que un par de entidades finales comiencen una conexión entre ellas simultáneamente, normalmente una de ellas abre un [[socket]] en un determinado [[TCP#Puertos TCP|puerto tcp]] y se queda a la escucha de nuevas conexiones. Es común referirse a esto como apertura pasiva, y determina el lado servidor de una conexión. El lado cliente de una conexión realiza una apertura activa de un puerto enviando un paquete [[SYN]] inicial al servidor como parte de la negociación en tres pasos. En el lado del servidor se comprueba si el puerto está abierto, es decir, si existe algún proceso escuchando en ese puerto. En caso de no estarlo, se envía al cliente un paquete de respuesta con el bit [[Flag RST|RST]] activado, lo que significa el rechazo del intento de conexión. En caso de que sí se encuentre abierto el puerto, el lado servidor respondería a la petición SYN válida con un paquete SYN/ACK. Finalmente, el cliente debería responderle al servidor con un [[ACK]], completando así la negociación en tres pasos (SYN, SYN/ACK y ACK) y la fase de establecimiento de conexión.
 
Es interesante notar que existe un número de secuencia generado por cada lado, ayudando de este modo a que no se puedan establecer conexiones falseadas ([[spoofing]]).
 
=== Transferencia de datos ===
Línea 39 ⟶ 135:
 
Los asentimientos (''ACKs'' o ''Acknowledgments'') de los datos enviados o la falta de ellos, son usados por los emisores para interpretar las condiciones de la red entre el emisor y receptor TCP. Unido a los temporizadores, los emisores y receptores TCP pueden alterar el comportamiento del movimiento de datos. TCP usa una serie de mecanismos para conseguir un alto rendimiento y evitar la congestión de la red (la idea es enviar tan rápido como el receptor pueda recibir). Estos mecanismos incluyen el uso de [[ventana deslizante]], que controla que el transmisor mande información dentro de los límites del ''[[Buffer de datos|buffer]]'' del receptor, y algoritmos de control de flujo, tales como el algoritmo de [[Evitación de la Congestión]] (''congestion avoidance''), el de [[comienzo lento]] (''Slow-start''), el de [[retransmisión rápida]], el de [[recuperación rápida]] (''Fast Recovery''), y otros.
 
=== Tamaño de ventana TCP ===
 
El tamaño de la ventana de recepción TCP es la cantidad de datos recibidos (en bytes) que pueden ser metidos en el ''[[Buffer de datos|buffer]]'' de recepción durante la conexión. La entidad emisora puede enviar una cantidad determinada de datos pero antes debe esperar un asentimiento con la actualización del tamaño de ventana por parte del receptor.
 
Un ejemplo sería el siguiente: un receptor comienza con un tamaño de ventana x y recibe y bytes, entonces su tamaño de ventana será (x - y) y el transmisor sólo podrá mandar paquetes con un tamaño máximo de datos de (x - y) bytes. Los siguientes paquetes recibidos seguirán restando tamaño a la ventana de recepción. Esta situación seguirá así hasta que la aplicación receptora recoja los datos del ''[[Buffer de datos|buffer]]'' de recepción.
 
=== Escalado de ventana ===