CAPITULO
II
Protocolo
de Control de Transmisión (TCP)
En
las secciones anteriores hemos visto el servicio de entrega de paquetes sin
conexión y no confiable, que forma la base para toda comunicación en InterNet,
así como el protocolo IP que lo defina.
Ahora
veremos el segundo servicio más importante y mejor conocido a nivel de red, la
entrega de flujo confiable (Reliable Stream Transport), así como el Protocolo
de Control de Transmisión (TCP) que lo define.
En
el nivel más bajo, las redes de comunicación proporcionan una entrega de
paquetes no confiable. Los paquetes se pueden perder o destruir debido a errores
(falla el hardware, sobrecarga de la red,...). Las redes que rutean dinámicamente
los paquetes pueden entregarlos en desorden, con retraso o duplicados. En el
nivel más alto, los programas de aplicación a menudo necesitan enviar grandes
volúmenes de datos de una computadora a otra. Utilizar un sistema de entrega de
conexión y no confiable para transferencias de grandes volúmenes de información
resulta ser la peor opción. Debido a esto, el TCP se ha vuelto un protocolo de
propósito general para estos casos.
La
interfaz entre los programas de aplicación y la entrega confiable (es, decir,
las características del TCP) se caracterizan por cinco funciones :
·
Servicio
Orientado a Conexión : El
servicio de entrega de flujo en la máquina destino pasa al receptor exactamente
la misma secuencia de bytes que le pasa el transmisor en la máquina origen.
·
Conexión
de Circuito Virtual : Durante
la transferencia, el software de protocolo en las dos máquinas continúa
comunicándose para verificar que los datos se reciban correctamente. Si la
comunicación no se logra por cualquier motivo (v.q. falla el hardware de red),
ambas máquinas detectarán la falla y la reportarán a los programas apropiados
de aplicación. Se utiliza el término circuito
virtual para describir dichas conexiones porque aunque los programas de
aplicación visualizan la conexión como un circuito dedicado de hardware, la
confiabilidad que se proporciona depende del servicio de entrega de flujo.
·
Transferencia
con Memoria Intermedia : Los
programas de aplicación envían un flujo de datos a través del circuito
virtual pasando repetidamente bytes de datos al software de protocolo. Cuando se
transfieren datos, cada aplicación utiliza piezas del tamaño que encuentre
adecuado, que pueden ser tan pequeñas como un byte. En el extremo receptor, el
software de protocolo entrega bytes del flujo de datos en el mismo orden en que
se enviaron, poniéndolos a disposición del programa de aplicación receptor
tan pronto como se reciben y se verifican. El software de protocolo puede
dividir el flujo en paquetes, independientemente de las piezas que transfiera el
programa de aplicación. Para hacer eficiente la transferencia y minimizar el tráfico
de red, las implantaciones por lo general recolectan datos suficientes de un
flujo para llenar un datagrama razonablemente largo antes de enviarlo. Por lo
tanto, inclusive si el programa de aplicación genera el flujo un byte a la vez,
la transferencia a través de la red puede ser sumamente eficiente. De forma
similar, si el programa de aplicación genera bloques de datos muy largos, el
software de protocolo puede dividir cada bloque en partes más pequeñas para su
transmisión. Para aplicaciones en las que los datos de deben entregar aunque no
se llene una memoria intermedia, el servicio de flujo proporciona un mecanismo
de empuje o push que las aplicaciones utilizan para forzar una transferencia. En
el extremo transmisor, el push obliga al software de protocolo a transferir
todos los datos generados sin tener que esperar a que se llene una memoria
intermedia. Sin embargo, la función de push sólo garantiza que los datos se
transferirán, por tanto, aún cuando la entrega es forzada, el software de
protocolo puede dividir el flujo en formas inesperadas (v.q. el transmisor puede
reducirlo en caso de congestión).
·
Flujo
no estructurado : Posibilidad
de enviar información de control junto a datos.
·
Conexión
Full Duplex : Se
permite la transferencia concurrente en ambas direcciones. Desde el punto de
vista de un proceso de aplicación, una conexión full duplex permite la
existencia de dos flujos independientes que se mueven en direcciones opuestas,
sin ninguna interacción aparente. Esto ofrece una ventaja : el software
subyacente de protocolo puede enviar datagramas de información de control de
flujo al origen, llevando datos en la dirección opuesta. Este procedimiento de
carga, transporte y descarga REDUCE EL TRAFICO en la red.
Hemos
visto que el servicio de entrega de flujo confiable garantiza la entrega de los
datos enviados de una máquina a otra sin pérdida o duplicación. Surge ahora
la pregunta contradictoria “del millón” : ¿
Cómo puede el software subyacente de protocolo proporcionar una transferencia
confiable si el sistema subyacente de comunicación sólo ofrece una entrega NO
confiable de paquetes ?.
La
respuesta es complicada, pero la mayor parte de los protocolos confiables
utilizan una técnica fundamental conocida como acuse
de recibo positivo con retransmisión. La técnica requiere que un
receptor se comunique con el origen y le envíe un mensaje de acuse de recibo (ACK)
conforme recibe los datos (ver los primeros temas para una descripción más
detallada). El transmisor guarda un registro de cada paquete que envía y espera
un ACK antes de enviar el siguiente paquete. El transmisor también arranca un
temporizador cuando envía un paquete y lo retransmite si dicho temporizador
expira antes de que llegue un ACK.
El
problema final de la confiabilidad surge cuando un sistema subyacente de entrega
de paquetes los duplica. Los duplicados también pueden surgir cuando las redes
tienen grandes retrasos que provocan la retransmisión prematura. Para evitar la
confusión causada por ACKs retrasados o duplicados, los protocolos de acuses de
recibo positivos envían los números de secuencia dentro de los ACKs, para que
el receptor pueda asociar correctamente los acuses de recibo con los paquetes.
Pero,
como casi todo en esta vida es un problema tras otro, el TCP no iba a ser menos ;
uno de los problemas que acarrea lo anterior es que un protocolo simple de
acuses de recibo positivos ocupa una cantidad sustancial de ancho de banda de
red debido a que debe retrasar el envío de un nuevo paquete hasta que reciba un
ACK del paquete anterior.
La
solución está en otra técnica conocida como ventana
deslizante, que es una forma más compleja de acuse de recibo positivo y
retransmisión. Los protocolos de ventana deslizante utilizan el ancho de banda
de red de mejor forma al permitir que el transmisor envíe varios paquetes sin
esperar el ACK (remitirse a capítulos anteriores para una descripción de éste
método).
Al
igual que el UDP, el TCP reside sobre el IP en el esquema de estratificación
por capas de protocolos. El TCP permite que varios programas de aplicación en
una máquina se comuniquen de manera concurrente y realiza el demultiplexado del
tráfico TCP entrante entre los programas de aplicación. Así mismo, al igual
que el UDP, el TCP utiliza números de puerto de protocolo para identificar el destino final dentro de
una máquina. Cada puerto tiene asignado un número entero pequeño utilizado
para identificarlo.
Para
comprender el significado de un puerto hay que pensar de cada puerto como en una
cola de salida en la que el software de protocolo coloca los datagramas
entrantes, aunque en realidad los puertos TCP son más complejos, ya que un número
de puerto no corresponde a un sólo objeto. El TCP utiliza la conexión, no el
puerto de protocolo, como su abstracción fundamental ; las conexiones se
identifican por medio de un par de puntos extremos.
¿Qué
es exactamente un punto extremo en TCP ?
Un
punto extremo es un par de números enteros (host,
puerto), en donde host es la
dirección IP de un anfitrión y puerto
es el un puerto TCP en dicho anfitrión.
Las
conexiones vienen definidas por dos puntos extremos, y es más : la
abstracción de la conexión para TCP permite que varias conexiones compartan un
punto extremo (por ejemplo, varias conexiones en los mismos puertos). Esto es
posible a que el TCP identifica una conexión por medio de un par de puntos
extremos, y por eso varias conexiones en la misma máquina pueden compartir un número
de puerto TCP.
El
TCP combina la asignación dinámica y estática de puertos mediante un conjunto
de asignación de puertos bien conocidos para programas llamados
con frecuencia, pero la salida de la mayor parte de los números
disponibles para el sistema se asigna conforme los programas lo necesitan.
La
siguiente tabla muestra un ejemplo
de números de puerto TCP asignados actualmente.
DECIMAL |
CLAVE |
CLAVE
UNIX |
DESCRIPCIÓN |
0 |
|
|
Reservado |
1 |
TCPMUX |
|
Multiplexor
TCP |
5 |
RJE |
|
Introducción
de función remota |
7 |
ECHO |
echo |
Eco |
9 |
DISCARD |
discard |
Abandonar |
11 |
USERS |
systat |
Usuarios
activos |
13 |
DAYTIME |
daytime |
Fecha,
hora |
15 |
|
netstat |
Estado
de red |
17 |
QUOTE |
qotd |
Cita
del día |
19 |
CHARGEN |
chargen |
Generador
de caracteres |
20 |
FTP-DATA |
ftp-data |
Datos
para FTP |
21 |
FTP |
ftp |
File
Transfer Protocol |
23
|
TELNET |
telnet |
Conexión
por terminal |
25 |
SMTP |
smtp |
Protocolo
de Transporte de Correo Sencillo |
42 |
NAMESERVER |
name |
Nombre
del host servidor |
43 |
NICNAME |
whois |
Comando
whois |
53 |
DOMAIN |
nameserver |
Servidor
de nombre de dominio (DNS) |
79 |
FINGER |
finger |
Comando
finger |
93 |
DCP |
|
Protocolo
de Control de Dispositivo |
101 |
HOSTNAME |
hostnames |
Servidor
de Nombre de Anfitrión NIC |
103 |
X400 |
x400 |
Servicio
de correo X400 |
104
|
X400-SND |
x400-snd |
Envío
de coreo X400 |