Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ahora que hemos cubierto los principios subyacentes de la transferencia confiable de datos, vamos
Internet protocolo. En esta sección, veremos que para proporcionar una transferencia de datos
confiable, TCP se basa en muchos de los principios subyacentes discutidos en la sección anterior,
campos de encabezado para números de secuencia y acuse de recibo. TCP se define en RFC 793,
3.5.1 La conexión TCPSe dice que TCP está orientado a la conexión porque antes de que un
comienzan a enviar datos a otro, los dos procesos primero deben "apretón de manos" con cada uno
otro, es decir, deben enviarse algunos segmentos preliminares entre sí para establecer el parámetros
ambos lados de la conexión inicializarán muchas variables de estado TCP (muchas de las cuales
serán discutido en esta sección y en la Sección 3.7) asociado con la conexión TCP.
La "conexión" TCP no es un circuito TDM o FDM de extremo a extremo como en una red de
conmutación de circuitos. Tampoco es un circuito virtual (ver Capítulo 1), ya que el estado de
conexión reside enteramente en los dos sistemas finales. Debido a que el protocolo TCP solo se
enlace). conmutadores), los elementos de red intermedios no mantienen el estado de conexión TCP.
con la ARPAnet, el precursor de Internet, es solo una de muchas redes. Cada uno de
estas redes tenían su propio protocolo. Dos investigadores, Vinton Cerf y Robert Kahn,
reconoció la importancia de interconectar estas redes e inventó un protocolo entre redes llamado
TCP/IP, que significa Control de Transmisión Protocolo/Protocolo de Internet. Aunque Cerf y Kahn
empezaron por ver el protocolo como una sola entidad, luego se dividió en sus dos partes, TCP e
IP, que operaban por separado. Cerf y Kahn publicaron un artículo sobre TCP/IP en mayo de 1974
en IEEE Transacciones sobre Tecnología de las Comunicaciones [Cerf 1974]. El protocolo TCP/IP,
que es el pan y la mantequilla de la Internet actual, fue ideado antes de las PC, estaciones de
trabajo, teléfonos inteligentes y tabletas, antes de la proliferación de Ethernet, cable, y DSL, WiFi y
otras tecnologías de red de acceso, y antes de la Web, redes sociales y transmisión de video. Cerf y
Kahn vieron la necesidad de un protocolo de red que, por un lado, proporcione un amplio soporte
para aplicaciones aún por definir y, por otro lado, permite que hosts arbitrarios y protocolos de
capa de enlace interoperen. En 2004, Cerf y Kahn recibieron el Premio Turing de la ACM,
A principios de la década de 1970, las redes de conmutación de paquetes comenzaron a proliferar, con la
estas redes tenían su propio protocolo. Dos investigadores, Vinton Cerf y Robert Kahn,
reconoció la importancia de interconectar estas redes e inventó un protocolo entre redes llamado TCP/IP, que
Protocolo/Protocolo de Internet. Aunque Cerf y Kahn empezaron por ver el protocolo como
una sola entidad, luego se dividió en sus dos partes, TCP e IP, que operaban por separado. Cerf y Kahn
antes de las PC, estaciones de trabajo, teléfonos inteligentes y tabletas, antes de la proliferación de Ethernet,
redes sociales y transmisión de video. Cerf y Kahn vieron la necesidad de un protocolo de red que, por un
y, por otro lado, permite que hosts arbitrarios y protocolos de capa de enlace interoperen.
De hecho, los enrutadores intermedios son completamente ajenos a las conexiones TCP; ellos
Una conexión TCP proporciona un servicio full-duplex: Si hay una conexión TCP
entre el Proceso A en un host y el Proceso B en otro host, entonces los datos de la capa de
aplicación pueden fluir del Proceso A al Proceso B al mismo tiempo que los datos de la capa de
aplicación fluyen del Proceso B al Proceso A. Una conexión TCP también es siempre
punto a punto, es decir, entre un solo emisor y un solo receptor. Así llamado
receptores en una sola operación de envío, no es posible con TCP. Con TCP, dos hosts
Ahora echemos un vistazo a cómo se establece una conexión TCP. Supongamos que un
proceso que se ejecuta en un host quiere iniciar una conexión con otro proceso en
otro anfitrión. Recuerde que el proceso que está iniciando la conexión se llama el
proceso cliente, mientras que el otro proceso se denomina proceso servidor. El proceso de
aplicación del cliente primero informa a la capa de transporte del cliente que desea establecer un
clientSocket.connect((nombreServidor,PuertoServidor))
proceso en el servidor. TCP en el cliente luego procede a establecer una conexión TCP
con TCP en el servidor. Al final de esta sección discutimos con cierto detalle el procedimiento de
establecimiento de la conexión. Por ahora basta con saber que el cliente envía primero
un segmento TCP especial; el servidor responde con un segundo segmento TCP especial; y
finalmente el cliente vuelve a responder con un tercer segmento especial. Los dos primeros
segmentos no llevar carga útil, es decir, sin datos de capa de aplicación; el tercero de estos
segmentos puede llevar una carga útil. Debido a que se envían tres segmentos entre los dos hosts,
de tres vías.
Una vez que se establece una conexión TCP, los dos procesos de aplicación pueden enviar
datos entre sí. Consideremos el envío de datos desde el proceso del cliente al
proceso del servidor. El proceso del cliente pasa un flujo de datos a través del socket (el
puerta del proceso), como se describe en la Sección 2.7. Una vez que los datos pasan
la puerta, los datos están en manos de TCP ejecutándose en el cliente. Como se muestra en la
figura
3.28, TCP dirige estos datos al búfer de envío de la conexión, que es uno de los
búfer que se reserva durante el protocolo de enlace inicial de tres vías. De vez en cuando,
TCP tomará fragmentos de datos del búfer de envío y pasará los datos a la red
capa. Curiosamente, la especificación TCP [RFC 793] es muy relajada en cuanto a especificar
cuándo TCP debe enviar datos almacenados en búfer, indicando que TCP debe "enviar
esos datos en segmentos según su propia conveniencia”. La cantidad máxima de datos que
se puede agarrar y colocar en un segmento está limitado por el tamaño máximo del segmento
marco de capa de enlace que puede ser enviado por el host de envío local (el llamado máximo
unidad de transmisión, MTU), y luego configurando el MSS para asegurar que un segmento TCP
(cuando está encapsulado en un datagrama IP) más la longitud del encabezado TCP/IP
(típicamente 40 bytes) caben en un solo marco de capa de enlace. Tanto los protocolos de capa de
enlace Ethernet como PPP tienen un MSS de 1500 bytes. También se han propuesto enfoques para
descubrir la ruta MTU, la trama de capa de enlace más grande que se puede enviar en todos los
enlaces desde de origen a destino [RFC 1191] y configurar el MSS en función de la ruta MTU
valor. Tenga en cuenta que el MSS es la cantidad máxima de datos de capa de aplicación en el
segmento, no el tamaño máximo del segmento TCP, incluidos los encabezados. (Esta terminología
es confusa, pero tenemos que vivir con ella, ya que está muy arraigada).
TCP empareja cada fragmento de datos del cliente con un encabezado TCP, formando así TCP
segmentos Los segmentos se transmiten a la capa de red, donde se encapsulan por separado
los datos se colocan en el búfer de recepción de la conexión TCP, como se muestra en la Figura
3.28. Él aplicación lee el flujo de datos de este búfer. Cada lado de la conexión tiene
su propio búfer de envío y su propio búfer de recepción. (Puede ver el control de flujo en línea
y recibir búferes). Vemos en esta discusión que una conexión TCP consta de búferes, variables y
una conexión de socket a un proceso en un host y otro conjunto de búferes, variables y una
estructura. El segmento TCP consta de campos de encabezado y un campo de datos. Los datos
El campo contiene una parte de los datos de la aplicación. Como se mencionó anteriormente, el
MSS limita la
tamaño máximo del campo de datos de un segmento. Cuando TCP envía un archivo grande, como
un
imagen como parte de una página web, normalmente divide el archivo en fragmentos de tamaño
MSS
(excepto por el último fragmento, que a menudo será menor que el MSS). Sin embargo, las
aplicaciones interactivas suelen transmitir fragmentos de datos que son más pequeños que el
MSS; por
Por ejemplo, con aplicaciones de inicio de sesión remotas como Telnet, el campo de datos en el
segmento TCP suele ser de un solo byte. Debido a que el encabezado TCP suele tener 20 bytes (12
bytes
más que el encabezado UDP), los segmentos enviados por Telnet pueden tener solo 21 bytes de
longitud.
La figura 3.29 muestra la estructura del segmento TCP. Al igual que con UDP, el encabezado
como con
también contiene
son utilizados por el remitente y el receptor de TCP para implementar datos confiables.
breve que
se utiliza para indicar el número de bytes que un receptor está dispuesto a aceptar.
• El campo de longitud del encabezado de 4 bits especifica la longitud del encabezado TCP en 32
bits. palabras. El encabezado TCP puede tener una longitud variable debido al campo de opciones
TCP. (Por lo general, el campo de opciones está vacío, por lo que la longitud del encabezado TCP
típico
es de 20 bytes).
El receptor negocia el tamaño máximo del segmento (MSS) o como un factor de escala de ventana
para su uso en redes de alta velocidad. También se define una opción de sellado de tiempo. Ver
• El campo de bandera contiene 6 bits. El bit ACK se usa para indicar que el valor transportado en
Los bits SYN y FIN se utilizan para establecer y desconectar la conexión, como veremos al final de
para indicar que hay datos en este segmento que la capa superior del lado emisor
entidad ha marcado como “urgente”. La ubicación del último byte de estos datos urgentes es
indicado por el campo de puntero de datos urgentes de 16 bits. TCP debe informar a la entidad de
capa superior del lado receptor cuando existan datos urgentes y pasarle un puntero al
fin de los datos urgentes. (En la práctica, el PSH, URG y el puntero de datos urgentes
Dos de los campos más importantes en el encabezado del segmento TCP son el número de
secuencia
campo y el campo del número de acuse de recibo. Estos campos son una parte crítica de TCP
servicio confiable de transferencia de datos. Pero antes de analizar cómo se utilizan estos campos
para proporcionar
transferencia de datos confiable, primero expliquemos qué pone TCP exactamente en estos
campos.
TCP ve los datos como un flujo de bytes no estructurado, pero ordenado. El uso de TCP de
Los números de secuencia reflejan esta visión en el sentido de que los números de secuencia están
sobre la corriente de
número para un segmento es, por lo tanto, el número de flujo de bytes del primer byte en el
flujo de datos a un proceso en el Host B a través de una conexión TCP. El TCP en el Host A
numerar implícitamente cada byte en el flujo de datos. Supongamos que el flujo de datos consiste
de un archivo que consta de 500.000 bytes, que el MSS es de 1.000 bytes, y que el primero
byte del flujo de datos se numera 0. Como se muestra en la Figura 3.30, TCP construye 500
segmentos fuera del flujo de datos. Al primer segmento se le asigna el número de secuencia 0,
número de secuencia asignado 2.000, y así sucesivamente. Cada número de secuencia se inserta
en el
Ahora consideremos los números de acuse de recibo. Estos son un poco más complicados que
números de secuencia. Recuerde que TCP es full-duplex, por lo que el Host A puede estar
recibiendo
datos del Host B mientras envía datos al Host B (como parte de la misma conexión TCP).
Cada uno de los segmentos que llegan del Host B tiene un número de secuencia para los datos
es el número de secuencia del siguiente byte que el Host A espera del Host B. Está bien
para ver algunos ejemplos para entender lo que está pasando aquí. Supongamos que el anfitrión A
ha recibido todos los bytes numerados del 0 al 535 de B y suponga que se trata de
para enviar un segmento al Host B. El Host A está esperando el byte 536 y todos los subsiguientes
bytes en el flujo de datos del Host B. Entonces el Host A pone 536 en el número de
reconocimiento
B que contiene los bytes 0 a 535 y otro segmento que contiene los bytes 900 a
1,000 Por alguna razón, el Host A aún no ha recibido los bytes 536 a 899. En este
ejemplo, el host A todavía está esperando el byte 536 (y más allá) para volver a crear el de B
flujo de datos. Por lo tanto, el siguiente segmento de A a B contendrá 536 en el acuse de recibo
campo numérico. Debido a que TCP solo reconoce bytes hasta el primer byte faltante en
Este último ejemplo también trae a colación un tema importante pero sutil. El anfitrión A recibió
(bytes 536 a 899). Así, el tercer segmento llegó fuera de servicio. el sutil
El problema es: ¿Qué hace un host cuando recibe segmentos desordenados en una conexión TCP?
decisión hasta las personas que programan una implementación de TCP. hay básicamente
dos opciones: (1) el receptor descarta inmediatamente los segmentos fuera de servicio
(que, como discutimos anteriormente, puede simplificar el diseño del receptor), o (2) el receptor
mantiene los bytes desordenados y espera a que los bytes que faltan llenen los espacios.
En la Figura 3.30, asumimos que el número de secuencia inicial era cero. En verdad,
ambos lados de una conexión TCP eligen aleatoriamente un número de secuencia inicial. Este es
hecho para minimizar la posibilidad de que un segmento que todavía está presente en la red
segmento válido en una conexión posterior entre estos mismos dos hosts (que también utilizan los
Telnet, definido en RFC 854, es un popular protocolo de capa de aplicación utilizado para
inicio de sesión remoto. Se ejecuta sobre TCP y está diseñado para funcionar entre cualquier par
de hosts.
Telnet es un
aplicación interactiva. Discutimos un ejemplo de Telnet aquí, ya que ilustra muy bien
Secuencia TCP y números de acuse de recibo. Notamos que muchos usuarios ahora
prefieren usar el protocolo SSH en lugar de Telnet, ya que los datos enviados en una conexión
Telnet (¡incluidas las contraseñas!) no están encriptados, lo que hace que Telnet sea vulnerable a
Suponga que el Host A inicia una sesión Telnet con el Host B. Dado que el Host A inicia
la sesión, se etiqueta como el cliente y el host B se etiqueta como el servidor. Cada personaje
escrito por el usuario (en el cliente) se enviará al host remoto; el host remoto se
envíe una copia de cada carácter, que se mostrará en la pantalla del usuario de Telnet.
pantalla. Este "retroceso de eco" se utiliza para garantizar que los caracteres vistos por el usuario
de Telnet
atraviesa la red dos veces entre el momento en que el usuario pulsa la tecla y el momento en que
Ahora suponga que el usuario escribe una sola letra, 'C', y luego toma un café. Examinemos los
segmentos TCP que se envían entre el cliente y el servidor. Como se muestra en la figura
3.31, suponemos que los números de secuencia inicial son 42 y 79 para el cliente y el servidor,
respectivamente. Recuerde que el número de secuencia de un segmento es el número de
secuencia de
el primer byte en el campo de datos. Así, el primer segmento enviado desde el cliente tendrá
número de secuencia 42; el primer segmento enviado desde el servidor tendrá un número de
secuencia
79. Recuerde que el número de acuse de recibo es el número de secuencia del siguiente byte de
datos que el host está esperando. Después de establecer la conexión TCP pero antes de cualquier
se envían los datos, el cliente está esperando el byte 79 y el servidor está esperando el byte 42.
Como se muestra en la Figura 3.31, se envían tres segmentos. El primer segmento se envía desde
secuencia, como
recién descrito. Además, debido a que el cliente aún no ha recibido ningún dato del servidor,
El segundo segmento se envía desde el servidor al cliente. Tiene un doble propósito. Primero
al colocar 43 en el campo de reconocimiento, el servidor le dice al cliente que ha recibido todo con
adelante. El segundo propósito de este segmento es hacer eco de la letra 'C'. Por lo tanto, el
el segundo segmento tiene la representación ASCII de 'C' en su campo de datos. Este segundo
El segmento tiene el número de secuencia 79, el número de secuencia inicial del flujo de datos de
servidor a cliente de esta conexión TCP, ya que este es el primer byte de datos que el
servidor está enviando. Tenga en cuenta que el reconocimiento de los datos de cliente a servidor
se realiza
en un segmento que transporta datos de servidor a cliente; se dice que este reconocimiento es
reconoce los datos que ha recibido del servidor. (Recuerde que el segundo segmento contenía
tiene un campo de datos vacío (es decir, el acuse de recibo no se lleva a cuestas con
recibo
porque el cliente ha recibido el flujo de bytes hasta el número de secuencia de bytes 79 y ahora
está esperando los bytes 80 en adelante. Usted podría pensar que es extraño que este
segmento también tiene un número de secuencia ya que el segmento no contiene datos. Pero
debido a que TCP tiene un campo de número de secuencia, el segmento debe tener algunos
secuencia de números.
TCP, como nuestro protocolo rdt en la Sección 3.4, utiliza un mecanismo de tiempo de
espera/retransmisión para
recuperarse de los segmentos perdidos. Aunque esto es conceptualmente simple, muchos sutiles
un protocolo real como TCP. Quizás la pregunta más obvia es la duración del tiempo de espera.
intervalos Claramente, el tiempo de espera debe ser mayor que el tiempo de ida y vuelta de la
conexión.
(RTT), es decir, el tiempo desde que se envía un segmento hasta que se reconoce. De lo contrario,
todos y cada uno de los segmentos no reconocidos? ¡Muchas preguntas! Nuestra discusión en
esta sección se basa en el trabajo de TCP en [Jacobson 1988] y las recomendaciones actuales de
Comencemos nuestro estudio de la gestión del temporizador TCP considerando cómo calcula TCP
el tiempo de ida y vuelta entre el emisor y el receptor. Esto se logra de la siguiente manera.
entre el momento en que se envía el segmento (es decir, se pasa a IP) y el momento en que se
recibe un acuse de recibo para el segmento. En lugar de medir un SampleRTT para cada
segmento transmitido, la mayoría de las implementaciones de TCP toman solo una medida de
solo para uno de los segmentos transmitidos pero actualmente no reconocidos, lo que lleva a una
nuevo valor de SampleRTT aproximadamente una vez cada RTT. Además, TCP nunca calcula un
SampleRTT para segmentos que se han transmitido una vez [Karn 1987]. (Un problema al final del
esta fluctuación, cualquier valor SampleRTT dado puede ser atípico. Para estimar
un RTT típico, por lo tanto, es natural tomar algún tipo de promedio de los valores de SampleRTT.
TCP mantiene un promedio, denominado RTT estimado, de los valores de RTT de muestra. Al
de es = 0,125 (es decir, 1/8) [RFC 6298], en cuyo caso la fórmula anterior
se convierte en:
Tenga en cuenta que el RTT estimado es un promedio ponderado de los valores del RTT de la
muestra.
Como se discutió en un problema de tarea al final de este capítulo, este promedio ponderado le da
más peso a las muestras recientes que a las muestras antiguas. Esto es natural, como el
de la misma manera que estudiamos en la Sección 3.4. TCP reconoce los datos que han sido
correspondientes
se cree que los reconocimientos se han perdido o dañado. Ciertas versiones de TCP también
tienen un
mecanismo NAK implícito: con el mecanismo de retransmisión rápida de TCP, la recepción de tres
ACK duplicados para un segmento determinado sirve como un NAK implícito para el siguiente
segmento, lo que activa la retransmisión de ese segmento antes de que se agote el tiempo de
permitir que el receptor identifique segmentos perdidos o duplicados. Al igual que en el caso de
nuestro confiable
protocolo de transferencia de datos, rdt3.0, TCP no puede decir con certeza si un segmento, o su
misma:
TCP también utiliza canalización, lo que permite al remitente tener varios segmentos transmitidos
pero aún no reconocidos pendientes en un momento dado. Vimos anteriormente que canalizar
puede mejorar en gran medida el rendimiento de una sesión cuando la relación entre el tamaño
que puede tener el remitente está determinada por los mecanismos de control de congestión y
El control de flujo de TCP se analiza al final de esta sección; El control de congestión TCP se analiza
en la Sección 3.7. Por el momento, simplemente debemos ser conscientes de que el remitente TCP
utiliza canalización.
las muestras más recientes reflejan mejor la congestión actual en la red. En estadística, dicho
exponencialmente rápido a medida que avanzan las actualizaciones. En los problemas de tarea, se
= 1/8 para una conexión TCP entre gaia.cs.umass.edu (en Amherst, Massachusetts) a
Además de tener una estimación del RTT, también es valioso tener una
RTT estimado:
RTT estimado. Si los valores de SampleRTT tienen poca fluctuación, entonces DevRTT
será pequeño; por otro lado, si hay mucha fluctuación, DevRTT será
Dados los valores de EstimatedRTT y DevRTT, ¿qué valor se debe usar para
¿Intervalo de tiempo de espera de TCP? Claramente, el intervalo debe ser mayor o igual que
el intervalo no debe ser mucho mayor que el RTT estimado; de lo contrario, cuando se pierde un
la transferencia de datos. Por lo tanto, es deseable establecer el tiempo de espera igual a la RTT
estimada más
algún margen. El margen debe ser grande cuando hay mucha fluctuación en el
Valores de SampleRTT; debe ser pequeño cuando hay poca fluctuación. El valor de
DevRTT debería entrar en juego aquí. Todas estas consideraciones se tienen en cuenta
evitar
un tiempo de espera prematuro que se produce para un segmento posterior que pronto será
reconocido. Sin embargo, tan pronto como se recibe un segmento y se actualiza el RTT estimado,
Recuerde que el servicio de capa de red de Internet (servicio IP) no es confiable. IP hace
servicio, los datagramas pueden desbordar los búfer del enrutador y nunca llegar a su destino,
los datagramas pueden llegar desordenados y los bits del datagrama pueden corromperse
transportan
a través de la red por datagramas IP, los segmentos de la capa de transporte pueden sufrir estos
problemas también.
TCP crea un servicio de transferencia de datos confiable además del servicio de mejor esfuerzo no
confiable de IP. El servicio confiable de transferencia de datos de TCP garantiza que el flujo de
datos que un
El proceso lee de su búfer de recepción TCP no está dañado, sin espacios, sin
que fue enviado por el sistema final en el otro lado de la conexión. Cómo TCP proporciona una
Sección 3.4.
En nuestro desarrollo anterior de técnicas confiables de transferencia de datos, era
conceptualmente más fácil asumir que un temporizador individual está asociado con cada
transmisión.
pero segmento aún no reconocido. Si bien esto es genial en teoría, la gestión del temporizador
puede requerir una sobrecarga considerable. Por lo tanto, la gestión del temporizador TCP
recomendada
Los procedimientos [RFC 6298] utilizan solo un único temporizador de retransmisión, incluso si hay
Discutiremos cómo TCP proporciona una transferencia de datos confiable en dos pasos
incrementales.
pasos. Primero presentamos una descripción altamente simplificada de un remitente TCP que usa
solo
tiempos de espera para recuperarse de segmentos perdidos; luego presentamos una descripción
más completa que utiliza acuses de recibo duplicados además de tiempos de espera. En la
discusión subsiguiente, suponemos que los datos se envían en una sola dirección, del Host A al
La figura 3.33 presenta una descripción muy simplificada de un remitente TCP. Vemos
que hay tres eventos principales relacionados con la transmisión y retransmisión de datos en
el remitente TCP: datos recibidos de la aplicación anterior; tiempo de espera del temporizador; y
ACK
que cada segmento incluye un número de secuencia que es el número de flujo de bytes de
el primer byte de datos en el segmento, como se describe en la Sección 3.5.2. También tenga en
cuenta que si el
el temporizador ya no se está ejecutando para algún otro segmento, TCP inicia el temporizador
cuando el
el segmento se pasa a IP. (Es útil pensar en el temporizador como asociado con
/* Asumir que el remitente no está limitado por el flujo de TCP o el control de congestión, que los
(evento)
evento: datos recibidos de la aplicación anterior crear segmento TCP con número de secuencia
temporizador retransmitir el segmento aún no reconocido con número de secuencia más pequeño
temporizador de inicio romper; evento: ACK recibido, con valor de campo ACK de y if (y >
espera por
temporizador.
El tercer evento importante que debe manejar el remitente TCP es la llegada de un
segmento de reconocimiento (ACK) del receptor (más específicamente, un segmento que contiene
número de secuencia del último byte que se sabe que se recibió correctamente y en
orden en el receptor.) Como se indicó anteriormente, TCP utiliza acuses de recibo acumulativos,
por lo que
que y acusa recibo de todos los bytes antes del número de byte y. Si y > EnviarBase,
transferencia de datos. Pero incluso esta versión altamente simplificada tiene muchas sutilezas.
Conseguir un
buena sensación de cómo funciona este protocolo, ahora repasemos algunos sencillos
escenarios. La Figura 3.34 muestra el primer escenario, en el que el Host A envía un segmento al
bytes de datos. Después de enviar este segmento, el host A espera un segmento de B con
el segmento retransmitido
En un segundo escenario, que se muestra en la Figura 3.35, el Host A envía dos segmentos de
regreso a
El segmento tiene el número de secuencia 100 y 20 bytes de datos. Suponga que ambos
segmentos
llegan intactos a B, y B envía dos reconocimientos separados para cada uno de estos segmentos. El
el segundo tiene el número de reconocimiento 120. Suponga ahora que ninguno de los
reconocimientos llega al Host A antes del tiempo de espera. Cuando se produce el evento de
mientras
como el ACK para el segundo segmento llega antes del nuevo tiempo de espera, el segundo
segmento no se retransmitirá.
En un tercer y último escenario, suponga que el Host A envía los dos segmentos, exactamente
como
red, pero justo antes del evento de tiempo de espera, el Host A recibe un reconocimiento con
acuse de recibo número 120. Por lo tanto, el Host A sabe que el Host B ha recibido
todo hasta el byte 119; entonces Host A no reenvía ninguno de los dos
TCP. Él
temporizador. En esta modificación, cada vez que ocurre el evento de tiempo de espera, TCP
retransmite el segmento aún no reconocido con el número de secuencia más pequeño, como se
cada vez que TCP retransmite, establece el siguiente intervalo de tiempo de espera en el doble del
anterior valor, en lugar de derivarlo de los últimos RTT estimado y DevRTT (como descrito en la
Sección 3.5.3). Por ejemplo, supongamos que TimeoutInterval está asociado con el segmento más
antiguo aún no reconocido es de 0,75 segundos cuando el temporizador expira por primera vez.
TCP retransmitirá este segmento y establecerá el nuevo tiempo de caducidad en 1,5 segundos. Si
el temporizador vuelve a expirar 1,5 segundos después, TCP volverá a transmitir este segmento,
ahora estableciendo el tiempo de caducidad en 3,0 seg. Así, los intervalos crecen
exponencialmente después de cada retransmisión. Sin embargo, cada vez que el temporizador se
inicia después de cualquiera de los dos otros eventos (es decir, datos recibidos de la aplicación
anterior y ACK recibido), el TimeoutInterval se deriva de los valores más recientes de
EstimatedRTT
y DevRTT.
Esta modificación proporciona una forma limitada de control de la congestión. (En la Sección 3.7
lo más probable es que la caducidad del temporizador se deba a la congestión de la red, es decir,
también
muchos paquetes que llegan a una (o más) colas de enrutador en la ruta entre la fuente
y el destino, lo que hace que los paquetes se descarten y/o que se produzcan largas demoras en la
cola. En tiempos
puede empeorar. En cambio, TCP actúa de manera más cortés, con cada remitente
retransmitiendo
después de intervalos cada vez más largos. Veremos que una idea similar es utilizada por Ethernet
Retransmisión rápida
Uno de los problemas con las retransmisiones activadas por tiempo de espera es que el tiempo de
espera
período puede ser relativamente largo. Cuando se pierde un segmento, este largo período de
tiempo de espera
obliga al remitente a retrasar el reenvío del paquete perdido, lo que aumenta el retraso de
paquetes mucho antes de que ocurra el evento de tiempo de espera al observar los llamados ACK
mire por qué el receptor envía un ACK duplicado en primer lugar. La Tabla 3.2 resume la política
de generación de ACK del receptor TCP [RFC 5681]. Cuando un receptor TCP
número de secuencia en orden, detecta una brecha en el flujo de datos, es decir, un segmento
faltante. Esta brecha podría ser el resultado de segmentos perdidos o reordenados dentro de la
red.
decir, genera un ACK duplicado para) el último byte de datos en orden que tiene.
recibió. (Tenga en cuenta que la Tabla 3.2 permite el caso de que el receptor no descarte
segmentos desordenados).
Debido a que un remitente a menudo envía una gran cantidad de segmentos consecutivos, si se
pierde un segmento, es probable que haya muchos ACK duplicados consecutivos. Si el remitente
TCP
recibe tres ACK duplicados para los mismos datos, esto se toma como una indicación de que el
el segmento que sigue al segmento que ha sido ACKed tres veces se ha perdido. (En el
problemas de tarea, consideramos la pregunta de por qué el remitente espera tres ACK
Se reciben ACK, el remitente TCP realiza una retransmisión rápida [RFC 5681], retransmitiendo el
segmento faltante antes de que expire el temporizador de ese segmento. Esto se muestra en
temporizador
caduca Para TCP con retransmisión rápida, el siguiente fragmento de código reemplaza el ACK
if (y > EnviarBase) {
EnviarBase=y
segmentos reconocidos)
temporizador de inicio
segmento */
recibido por ti
para y==3)
romper;
procedimientos anteriores,
que han evolucionado como resultado de más de 20 años de experiencia con temporizadores TCP,
siguiente pregunta: ¿TCP es un protocolo GBN o SR? Recuerde que los acuses de recibo de TCP son
ACKed por el receptor. En consecuencia, como se muestra en la Figura 3.33 (ver también la Figura
3.19),
el remitente TCP solo necesita mantener el número de secuencia más pequeño de un mensaje
transmitido pero
enviado (NextSeqNum). En este sentido, TCP se parece mucho a un protocolo de estilo GBN. Pero
hay algunas diferencias notables entre TCP y Go-Back-N. Muchas implementaciones de TCP
1994].
Considere también lo que sucede cuando el remitente envía una secuencia de segmentos 1,
2, . . . ,
N, y todos los segmentos llegan en orden sin error al receptor. Supongamos además
que el acuse de recibo para el paquete n < N se pierde, pero los restantes N – 1 acuses de recibo
llegan al remitente antes de sus respectivos tiempos de espera. En este ejemplo, GBN
. . . , N. TCP, por otro lado, retransmitiría como máximo un segmento, a saber, el segmento n.
[RFC 2018], permite que un receptor TCP reconozca segmentos fuera de orden de forma selectiva
receptor: TCP se parece mucho a nuestro protocolo SR genérico. Por lo tanto, la recuperación de
errores de TCP
El mecanismo probablemente se clasifique mejor como un híbrido de los protocolos GBN y SR.
3.5.5 Control de flujo
Recuerde que los hosts en cada lado de una conexión TCP reservan un búfer de recepción para
leerá los datos de este búfer, pero no necesariamente en el instante en que llegan los datos.
De hecho, la aplicación receptora puede estar ocupada con alguna otra tarea y no
incluso intente leer los datos hasta mucho después de que hayan llegado. Si la aplicación es
relativamente lenta para leer los datos, el remitente puede desbordar fácilmente la conexión.
TCP proporciona un servicio de control de flujo a sus aplicaciones para eliminar la posibilidad
del remitente desbordando el búfer del receptor. El control de flujo es, por lo tanto, un ajuste de
velocidad
servicio: hacer coincidir la tasa a la que el remitente envía con la tasa a la que el
la aplicación receptora está leyendo. Como se señaló anteriormente, un remitente TCP también se
puede limitar
debido a la congestión dentro de la red IP; esta forma de control del remitente se conoce como
control de congestión, un tema que exploraremos en detalle en las Secciones 3.6 y 3.7. Incluso
aunque las acciones tomadas por el control de flujo y congestión son similares (el
estrangulamiento de
los autores usan los términos indistintamente, y el lector inteligente haría bien en distinguirlos.
Para ver el bosque por los árboles, suponemos a lo largo de esta sección que el TCP
la implementación es tal que el receptor TCP descarta los segmentos fuera de servicio.
TCP proporciona control de flujo al hacer que el remitente mantenga una variable llamada
recibir ventana. Informalmente, la ventana de recepción se utiliza para dar al remitente una idea
de
cuánto espacio de búfer libre está disponible en el receptor. Debido a que TCP es full-duplex, el
un archivo grande al Host B a través de una conexión TCP. El host B asigna un búfer de recepción a
este
búfer:
Debido a que la habitación libre cambia con el tiempo, rwnd es dinámico. La variable rwnd es
¿Servicio? El host B le dice al host A cuánto espacio libre tiene en el búfer de conexión
colocando su valor actual de rwnd en el campo de la ventana de recepción de cada segmento que
envía a A. Inicialmente, el host B establece rwnd = RcvBuffer. Tenga en cuenta que para lograr
esto,
datos no reconocidos menores que el valor de rwnd, el Host A está seguro de que no es
desbordando el búfer de recepción en el Host B. Por lo tanto, el Host A se asegura durante todo el
Hay un problema técnico menor con este esquema. Para ver esto, supongamos
El búfer de recepción del host B se llena, de modo que rwnd = 0. Después de anunciar rwnd = 0
al Host A, suponga también que B no tiene nada que enviar a A. Ahora considere lo que sucede. A
medida que el proceso de aplicación en B vacía el búfer, TCP no envía nuevos segmentos con
nunca se le informa que se ha abierto algo de espacio en el búfer de recepción del Host B: Host
¡A está bloqueado y no puede transmitir más datos! Para resolver este problema, la especificación
TCP requiere que el Host A continúe enviando segmentos con un byte de datos cuando B
Habiendo descrito el servicio de control de flujo de TCP, mencionamos brevemente aquí que UDP
no proporciona control de flujo. Para comprender el problema, considere enviar una serie de
implementación, UDP agregará los segmentos en un búfer de tamaño finito que "precede"
En esta subsección, veremos más de cerca cómo se establece y cómo se establece una conexión
TCP.
percibidos
(por ejemplo, al navegar por la Web). Además, muchos de los ataques de red más comunes,
se establece la conexión. Supongamos que un proceso que se ejecuta en un host (cliente) desea
iniciar una conexión con otro proceso en otro host (servidor). El proceso de aplicación del cliente
primero informa al cliente TCP que desea establecer una conexión con
un proceso en el servidor. El TCP en el cliente luego procede a establecer una conexión TCP con el
• Paso 1. El TCP del lado del cliente primero envía un segmento TCP especial al lado del servidor
TCP. Este segmento especial no contiene datos de capa de aplicación. Pero uno de la bandera
bits en el encabezado del segmento (ver Figura 3.29), el bit SYN, se establece en 1. Para esto
Por este motivo, este segmento especial se denomina segmento SYN. además, el
este número en el campo de número de secuencia del segmento TCP SYN inicial. Este
• Paso 2. Una vez que el datagrama IP que contiene el segmento TCP SYN llega al
host del servidor (¡suponiendo que llegue!), el servidor extrae el segmento TCP SYN
El protocolo de enlace de tres vías hace que TCP sea vulnerable a un ataque de denegación de
servicio conocido
como inundación SYN). Este segmento de conexión otorgada tampoco contiene datos de la capa
reconocimiento
el campo de número de secuencia del encabezado del segmento TCP. Esta conexión otorgada
segmento está diciendo, en efecto, "Recibí su paquete SYN para iniciar una conexión
con su número de secuencia inicial, client_isn. Acepto establecer esta conexión. Mi propio número
SYNACK.
segmento; este último segmento reconoce el segmento de conexión otorgada del servidor (el
cliente lo hace poniendo el valor server_isn+1 en el campo de reconocimiento del encabezado del
se establece la conexión. Esta tercera etapa del apretón de manos de tres vías puede llevar
Una vez que se han completado estos tres pasos, los hosts cliente y servidor pueden enviar
segmentos que contienen datos entre sí. En cada uno de estos segmentos futuros, el bit SYN
se pondrá a cero. Tenga en cuenta que para establecer la conexión, se envían tres paquetes
entre los dos hosts, como se ilustra en la Figura 3.39. Por esta razón, este procedimiento de
los aspectos del protocolo de enlace de tres vías TCP se exploran en los problemas de tarea
(¿Por qué se necesitan números de secuencia iniciales? ¿Por qué es un apretón de manos de tres
vías, como
y un asegurador (que está estacionado debajo del escalador y cuyo trabajo es manejar
idénticos a los TCP para garantizar que ambos lados estén listos antes de que el escalador
comience a ascender.
Todo lo bueno debe llegar a su fin, y lo mismo ocurre con una conexión TCP. Cualquiera de los dos
procesos que participan en una conexión TCP puede finalizar la conexión. Cuando finaliza una
en los hosts están desasignados. Como ejemplo, supongamos que el cliente decide cerrar el
conexión, como se muestra en la Figura 3.40. El proceso de solicitud del cliente emite un cierre
dominio. Esto hace que el cliente TCP envíe un segmento TCP especial al servidor
proceso. Este segmento especial tiene un bit indicador en el encabezado del segmento, el bit FIN
(ver Figura 3.29), establecido en 1. Cuando el servidor recibe este segmento, envía al cliente
segmento de cierre del servidor. En este punto, todos los recursos en los dos hosts ahora están
desasignado
Durante la vida de una conexión TCP, el protocolo TCP que se ejecuta en cada host
hace transiciones a través de varios estados de TCP. La Figura 3.41 ilustra un típico
secuencia de estados TCP que son visitados por el cliente TCP. El cliente TCP comienza en
el estado CERRADO. La aplicación en el lado del cliente inicia una nueva conexión TCP (al crear un
del capítulo 2). Esto hace que TCP en el cliente envíe un segmento SYN a TCP en el
servidor. Luego de haber enviado el segmento SYN, el cliente TCP ingresa al SYN_SENT
Expresar. Mientras está en el estado SYN_SENT, el cliente TCP espera un segmento del
servidor TCP que incluye un reconocimiento para el segmento anterior del cliente y
tiene el bit SYN establecido en 1. Habiendo recibido dicho segmento, el cliente TCP ingresa al
Estado ESTABLECIDO. Mientras está en el estado ESTABLECIDO, el cliente TCP puede enviar
y recibir segmentos TCP que contienen datos de carga útil (es decir, generados por la aplicación).
Suponga que la aplicación cliente decide que quiere cerrar la conexión.
(Tenga en cuenta que el servidor también podría optar por cerrar la conexión). Esto hace que el
Cliente TCP para enviar un segmento TCP con el bit FIN establecido en 1 y para ingresar el
Estado FIN_WAIT_1. Mientras está en el estado FIN_WAIT_1, el cliente TCP espera un TCP
el cliente espera otro segmento del servidor con el bit FIN establecido en 1; después
entra en el estado TIME_WAIT. El estado TIME_WAIT permite que el cliente TCP reenvíe el
acuse de recibo final en caso de que se pierda el ACK. El tiempo pasado en TIME_WAIT
El estado depende de la implementación, pero los valores típicos son 30 segundos, 1 minuto y
La Figura 3.42 ilustra la serie de estados visitados típicamente por el lado del servidor
TCP, asumiendo que el cliente comienza a interrumpir la conexión. Las transiciones se explican por
sí mismas. En estos dos diagramas de transición de estado, solo hemos mostrado cómo un TCP
Hemos visto en nuestra discusión sobre el protocolo de enlace de tres vías de TCP que un servidor
asigna
cliente. Si el cliente no envía un ACK para completar el tercer paso de este 3-way
Este protocolo de gestión de conexiones TCP prepara el escenario para una denegación clásica de
Ataque de servicio (DoS) conocido como ataque de inundación SYN. En este ataque, el(los)
atacante(s)
enviar una gran cantidad de segmentos TCP SYN, sin completar el tercer protocolo de enlace
paso. Con esta avalancha de segmentos SYN, los recursos de conexión del servidor se vuelven
agotados ya que se asignan (¡pero nunca se usan!) para conexiones semiabiertas; a los clientes
legítimos se les niega el servicio. Tales ataques de inundación SYN estuvieron entre los primeros
ataques DoS documentados [CERT SYN 1996]. Afortunadamente, una defensa efectiva conocida
ya que las cookies SYN [RFC 4987] ahora se implementan en la mayoría de los principales sistemas
operativos.
una conexión TCP medio abierta para este SYN, el servidor crea un TCP inicial
número de secuencia que es una función complicada (función hash) de direcciones IP de origen y
número que solo conoce el servidor. Este número de secuencia inicial cuidadosamente elaborado
es
la llamada “cookie”. Luego, el servidor envía al cliente un paquete SYNACK con este
ACK, debe verificar que el ACK corresponde a algún SYN enviado anteriormente. pero como es
¿Se hace esto si el servidor no mantiene memoria sobre los segmentos SYN? como puedas
lo habrás adivinado, se hace con la galleta. Recuerde que para un ACK legítimo, el
SYNACK (el valor de la cookie en este caso) más uno (ver Figura 3.39). El servidor puede
números de puerto en el SYNACK (que son los mismos que en el SYN original) y el
número secreto. Si el resultado de la función más uno es el mismo que el valor de reconocimiento
(cookie) en el SYNACK del cliente, el servidor concluye que el ACK corresponde a un segmento SYN
SYN no ha causado ningún daño en el servidor, ya que el servidor aún no ha asignado ningún
quieren iniciar o cerrar al mismo tiempo. Si está interesado en aprender sobre este y otros temas
Nuestra discusión anterior ha asumido que tanto el cliente como el servidor están preparados
para comunicarse, es decir, que el servidor está escuchando en el puerto al que el cliente envía
su segmento SYN. Consideremos lo que sucede cuando un host recibe un segmento TCP
enchufes en el anfitrión. Por ejemplo, suponga que un host recibe un paquete TCP SYN con
puerto de destino 80, pero el host no acepta conexiones en el puerto 80 (es decir, es
no está ejecutando un servidor web en el puerto 80). Luego, el host enviará un segmento de
reinicio especial a la fuente. Este segmento TCP tiene el bit indicador RST (consulte la Sección
3.5.2) establecido en
1. Por lo tanto, cuando un host envía un segmento de reinicio, le está diciendo a la fuente "No
tengo un
socket para ese segmento. Por favor, no reenvíe el segmento”. Cuando un host recibe un
Paquete UDP cuyo número de puerto de destino no coincide con un UDP en curso
Ahora que tenemos una buena comprensión de la gestión de conexiones TCP, vamos a
vuelva a visitar la herramienta de escaneo de puertos nmap y examine más de cerca cómo
un puerto TCP específico, digamos el puerto 6789, en un host de destino, nmap enviará un
segmento TCP SYN con el puerto de destino 6789 a ese host. Hay tres resultados posibles:
• El host de origen recibe un segmento TCP SYNACK del host de destino. Desde esto
significa que una aplicación se está ejecutando con el puerto TCP 6789 en la publicación de
destino, nmap
devuelve "abierto".
• El host de origen recibe un segmento TCP RST del host de destino. Esto significa que
el segmento SYN alcanzó el host de destino, pero el host de destino no está ejecutando una
aplicación con el puerto TCP 6789. Pero el atacante al menos sabe que los segmentos destinados
al host en el puerto 6789 no están bloqueados por ningún firewall en la ruta entre
• La fuente no recibe nada. Esto probablemente significa que el segmento SYN fue bloqueado
Nmap es una herramienta poderosa, que puede "encajonar la unión" no solo para puertos TCP
abiertos,
pero también para puertos UDP abiertos, para firewalls y sus configuraciones, e incluso para las
manipulación de TCP
www.nmap.org.
En la Sección 3.7, volveremos a TCP y analizaremos el control de congestión de TCP con cierta
profundidad.
Sin embargo, antes de hacerlo, primero damos un paso atrás y examinamos los problemas de
control de la congestión.
frente a
paquete perdido. Mencionamos anteriormente que, en la práctica, tal pérdida típicamente resulta
de
el desbordamiento de los búfer del enrutador a medida que la red se congestiona. Paquete
muchas fuentes que intentan enviar datos a una velocidad demasiado alta. Para tratar la causa de
la congestión de la red, se necesitan mecanismos para estrangular a los remitentes frente a la red.
congestión.
buscando entender por qué la congestión es algo malo, cómo la congestión de la red
enfoques que se pueden tomar para evitar o reaccionar ante la congestión de la red. esto mas
El estudio general del control de la congestión es apropiado ya que, al igual que con la
transferencia confiable de datos, ocupa un lugar destacado en nuestra lista de los "diez
redes La siguiente sección contiene un estudio detallado del algoritmo de control de congestión de
TCP.
Comencemos nuestro estudio general del control de la congestión examinando tres cada vez más
escenarios complejos en los que se produce la congestión. En cada caso, veremos por qué ocurre
no completamente utilizados y bajo rendimiento recibido por los sistemas finales). No lo haremos
(todavía)
centrarse en cómo reaccionar o evitar la congestión, sino más bien centrarse en el problema más
simple
de comprender lo que sucede a medida que los hosts aumentan su velocidad de transmisión y la
red se congestiona.
hosts (A y B) cada uno tiene una conexión que comparte un solo salto entre la fuente y
(por ejemplo, pasar datos al protocolo de nivel de transporte a través de un socket) a una tasa
promedio de bytes/seg. Estos datos son originales en el sentido de que cada unidad de datos
tasa en
qué host A ofrece tráfico al enrutador en este primer escenario es, por lo tanto,
en bytes/seg.
enviando a una velocidad de bytes/seg. Los paquetes de los hosts A y B pasan a través de un
que
capacidad del enlace saliente. En este primer escenario, asumimos que el enrutador tiene un
infinito
La Figura 3.44 traza el desempeño de la conexión del Host A bajo este primer
guión. El gráfico de la izquierda traza el rendimiento por conexión (número de bytes por
Tasa: todo lo que envía el remitente se recibe en el receptor con un retraso finito.
Sin embargo, cuando la tasa de envío es superior a R/2, el rendimiento es solo R/2. esta parte
superior
El límite de rendimiento es una consecuencia de compartir la capacidad del enlace entre dos
tasa que exceda R/2. No importa cuán altas establezcan los hosts A y B sus tasas de envío,
cada uno de ellos nunca verá un rendimiento superior a R/2.
bueno, porque el enlace se utiliza completamente para entregar paquetes a sus destinos. El
operando cerca de la capacidad del enlace. A medida que la tasa de envío se acerca a R/2 (desde la
izquierda), la
el retraso promedio se vuelve más y más grande. Cuando la tasa de envío supera R/2, el
operar a estas tasas de envío por un período infinito de tiempo y hay un número infinito
rendimiento agregado de
cerca de R puede ser ideal desde el punto de vista del rendimiento, está lejos de ser ideal desde un
retraso
punto de vista. Incluso en este escenario (extremadamente) idealizado, ya hemos encontrado uno
costo de una red congestionada: se experimentan grandes retrasos en las colas a medida que la
Modifiquemos ahora ligeramente el escenario 1 de las siguientes dos maneras (ver Figura 3.45).
En primer lugar, se supone que la cantidad de almacenamiento en búfer del enrutador es finita.
La suposición del mundo real es que los paquetes se descartarán cuando lleguen a un búfer ya
lleno. Segundo, asumimos que cada conexión es confiable. Si un paquete que contiene un
retransmitirlo. Debido a que los paquetes se pueden retransmitir, ahora debemos tener más
cuidado
con nuestro uso del término tasa de envío. Específicamente, denotemos nuevamente la tasa en
por el que la aplicación envía los datos originales al socket en bytes/seg. La tasa en
que la capa de transporte envía segmentos (que contienen datos originales y datos retransmitidos)
cómo se realiza la retransmisión. Primero, considere el caso poco realista de que el Host A es
y, por lo tanto, envía un paquete solo cuando hay un búfer libre. En este caso, no se produciría
ninguna pérdida.
in sería igual a in, y el rendimiento de la conexión sería igual a
pulg. Este caso se muestra en la figura 3.46(a). Desde el punto de vista del rendimiento, el
rendimiento es ideal: todo lo que se envía se recibe. Tenga en cuenta que el host promedio que
envía
tasa no puede exceder R/2 en este escenario, ya que se supone que la pérdida de paquetes nunca
que se produzca.
Considere a continuación el caso un poco más realista de que el remitente retransmite solo
cuando se sabe con certeza que un paquete se ha perdido. (De nuevo, esta suposición es un poco
estirar. Sin embargo, es posible que el host de envío establezca su tiempo de espera demasiado
suficiente para estar virtualmente seguro de que un paquete que no ha sido reconocido ha
Figura 3.46(b). Para apreciar lo que está sucediendo aquí, considere el caso de que el
carga ofrecida, en (la tasa de transmisión de datos original más retransmisiones), es igual
R/2. De acuerdo con la Figura 3.46(b), a este valor de la carga ofrecida, la tasa a la cual
los datos se entregan a la aplicación receptora es R/3. Así, de las unidades 0.5R de
datos transmitidos, 0.333R bytes/seg (en promedio) son datos originales y 0.166R bytes/
seg (en promedio) son datos retransmitidos. Vemos aquí otro costo de una red congestionada: el
retransmitir un paquete que se ha retrasado en la cola pero que aún no se ha perdido. En este
caso,
Por supuesto, el receptor solo necesita una copia de este paquete y descartará la retransmisión.
En este caso, el trabajo realizado por el enrutador al reenviar los datos retransmitidos
se desperdició una copia del paquete original, ya que el receptor ya habrá recibido
la copia original de este paquete. El enrutador habría utilizado mejor la capacidad de transmisión
del enlace para enviar un paquete diferente. Aquí entonces hay otro costo más de
una red congestionada: retransmisiones innecesarias por parte del remitente frente a grandes
los retrasos pueden hacer que un enrutador use su ancho de banda de enlace para reenviar copias
innecesarias de un
paquete. La figura 3.46 (c) muestra el rendimiento frente a la carga ofrecida cuando cada paquete
se supone que el enrutador lo reenvía (en promedio) dos veces. Dado que cada paquete es
reenviado dos veces, el rendimiento tendrá un valor asintótico de R/4 como el ofrecido
Rutas multisalto
En nuestro escenario de congestión final, cuatro hosts transmiten paquetes, cada uno sobre rutas
de dos saltos superpuestas, como se muestra en la Figura 3.47. Nuevamente asumimos que cada
host
datos confiable
servicio, que todos los hosts tengan el mismo valor de in, y que todos los enlaces del enrutador
tengan
capacidad R bytes/seg.
comparte el enrutador R2 con la conexión B–D. Para valores extremadamente pequeños de in,
buffer
correspondiente
valores de
caso de que
tráfico que llega al enrutador R2 (que llega a R2 después de ser reenviado desde R1)
puede tener una tasa de llegada a R2 que es como máximo R, la capacidad del enlace desde R1
a R2, independientemente del valor de in. Si es extremadamente grande para todas las conexiones
(incluida la conexión B-D), entonces la tasa de llegada del tráfico B-D en R2 puede ser
mucho mayor que la del tráfico A-C. Debido a que el tráfico A–C y B–D debe
competir en el enrutador R2 por la cantidad limitada de espacio de búfer, la cantidad de A–C
El tráfico que pasa con éxito a través de R2 (es decir, no se pierde debido al desbordamiento del
búfer) se vuelve cada vez más pequeño a medida que la carga ofrecida de B–D se hace más grande
más grande En el límite, cuando la carga ofrecida se acerca al infinito, un búfer vacío en R2
La carga es evidente cuando se considera la cantidad de trabajo desperdiciado realizado por la red.
En el escenario de alto tráfico descrito anteriormente, cada vez que se descarta un paquete
en un enrutador de segundo salto, el trabajo realizado por el enrutador de primer salto al reenviar
un
han estado igualmente bien (más exactamente, igualmente mal) si el primer enrutador
enrutador
podría haber sido mucho más rentable para transmitir un paquete diferente. (Para
ejemplo, al seleccionar un paquete para la transmisión, podría ser mejor para un enrutador
para dar prioridad a los paquetes que ya han atravesado cierto número de upstream
enrutadores.) Así que aquí vemos otro costo más de descartar un paquete debido a la congestión:
gran medida.
detalle. Aquí, identificamos los dos enfoques amplios para el control de la congestión que son
control de la congestión,
la capa de red no proporciona soporte explícito a la capa de transporte para propósitos de control
ejemplo, paquetes
pérdida y retraso). Veremos en la Sección 3.7 que TCP necesariamente debe adoptar este enfoque
retroalimentación.
hasta los sistemas finales con respecto a la congestión de la red. Pérdida de segmento TCP (como
se indica
por un tiempo de espera o un acuse de recibo triple duplicado) se toma como una indicación de
una propuesta más reciente para el control de congestión de TCP que utiliza el aumento de ida y
vuelta
Control de congestión asistido por red. Con control de congestión asistido por red,
Los componentes de la capa de red (es decir, los enrutadores) brindan retroalimentación explícita
al
remitente sobre el estado de congestión en la red. Esta retroalimentación puede ser tan
simple como un solo bit que indica congestión en un enlace. Este enfoque fue tomado en
los primeros IBM SNA [Schwartz 1982] y DEC DECnet [Jain 1989; Ramakrishnan 1990], se propuso
1994; RFC 3168], y también se utiliza en el control de congestión de tasa de bits disponible (ABR)
de ATM, como se explica a continuación. También es posible una retroalimentación de red más
sofisticada. Por ejemplo, una forma de control de congestión ATM ABR que estudiaremos
transmisión que
(el enrutador) puede admitir en un enlace saliente. El protocolo XCP [Katabi 2002] proporciona
paquete,
con respecto a cómo esa fuente debe aumentar o disminuir su tasa de transmisión.
alimenta
Se pueden enviar comentarios directos desde un enrutador de red al remitente. Esta forma de
marca/actualiza un campo
en un paquete que fluye del remitente al receptor para indicar congestión. Al recibir un
Tenga en cuenta que esta última forma de notificación requiere al menos un tiempo completo de
ida y vuelta.
Concluimos esta sección con un breve estudio de caso del algoritmo de control de congestión
en ATM ABR, un protocolo que adopta un enfoque asistido por red para la congestión
control. Hacemos hincapié en que nuestro objetivo aquí no es describir aspectos de la arquitectura
ATM
en gran detalle, sino más bien para ilustrar un protocolo que toma un marcado diferente
solo presentamos a continuación aquellos pocos aspectos de la arquitectura ATM que se necesitan
para
conmutación de paquetes. Recuerde de nuestra discusión en el Capítulo 1, esto significa que cada
el cambio en la ruta de origen a destino mantendrá el estado sobre el VC de origen a destino. Este
remitente para reducir su tasa cuando el conmutador se congestiona). Este estado por VC
en los conmutadores de red hace que ATM sea ideal para realizar el control de congestión asistido
por red.
ABR ha sido diseñado como un servicio de transferencia de datos elástico de una manera que
recuerda a TCP. Cuando la red está sobrecargada, el servicio ABR debería poder tomar
ventaja del ancho de banda disponible de repuesto; cuando la red está congestionada, ABR
La Figura 3.50 muestra el marco para el control de congestión ATM ABR. En nuestro
discusión adoptamos la terminología ATM (por ejemplo, usando el término interruptor en lugar de
en lugar de enrutador, y el término celda en lugar de paquete). Con servicio ATM ABR, datos
Las células se transmiten desde un origen a un destino a través de una serie de conmutadores
intermedios. Intercaladas con las celdas de datos hay celdas de gestión de recursos
(células RM); estas celdas RM se pueden usar para transmitir información relacionada con la
congestión
ser dado la vuelta y enviado de vuelta al remitente (posiblemente después de que el destino haya
pueden ser
través del
calcula explícitamente una tasa máxima a la que puede enviar y se regula en consecuencia. ABR
• Bit EFCI. Cada celda de datos contiene una indicación de congestión directa explícita
(EFCI) bits. Un conmutador de red congestionado puede establecer el bit EFCI en una celda de
datos para
Bit EFCI en todas las celdas de datos recibidas. Cuando una celda RM llega al destino,
si la celda de datos recibida más recientemente tenía el bit EFCI establecido en 1, entonces el
bit en celdas RM, un remitente puede ser notificado sobre la congestión en una red
cambiar.
• Bits CI y NI. Como se indicó anteriormente, las celdas RM de emisor a receptor se intercalan
el valor predeterminado es una celda RM cada 32 celdas de datos. Estas células RM tienen un
bit de indicación de congestión (CI) y un bit de no aumento (NI) que puede establecerse mediante
un
conmutador de red congestionada. Específicamente, un interruptor puede configurar el bit NI en
un paso
enviar la celda RM de regreso al remitente con sus bits CI y NI intactos (excepto que
descrito arriba).
Una fuente ATM ABR ajusta la velocidad a la que puede enviar celdas en función de
los valores de CI, NI y ER en una celda RM devuelta. Las reglas para hacer esta tarifa
En esta sección volvemos a nuestro estudio de TCP. Como aprendimos en la Sección 3.5, TCP
brinda un servicio de transporte confiable entre dos procesos que se ejecutan en diferentes hosts.
En la sección anterior, TCP debe usar control de congestión de extremo a extremo en lugar de
explícita a
que hay congestión a lo largo de la ruta, entonces el remitente reduce su tasa de envío. Pero esto
enfoque plantea tres preguntas. En primer lugar, ¿cómo limita un remitente TCP la velocidad a la
que
envía tráfico a su conexión? En segundo lugar, ¿cómo percibe un remitente TCP que
algoritmo debe utilizar el remitente para cambiar su tasa de envío como una función de percibido
Primero examinemos cómo un remitente TCP limita la velocidad a la que envía tráfico
en su conexión. En la Sección 3.5 vimos que cada lado de una conexión TCP consiste
denotado cwnd, impone una restricción sobre la velocidad a la que un remitente TCP puede enviar
tráfico
ahora en adelante que el búfer de recepción de TCP es tan grande que la restricción de la ventana
y, por lo tanto, limita indirectamente la velocidad de envío del remitente. Para ver esto, considere
una conexión para la cual la pérdida y los retrasos en la transmisión de paquetes son
datos en la conexión; al final del RTT, el remitente recibe acuses de recibo de los datos. Por lo
ajustando el valor de cwnd, el remitente puede, por lo tanto, ajustar la tasa a la que
ACK del receptor. (Recuerde nuestra discusión en la Sección 3.5.4 del tiempo de espera
al recibir tres ACK duplicados.) Cuando hay una congestión excesiva, entonces
uno (o más) búferes del enrutador a lo largo de la ruta se desbordan, lo que hace que se descarte
resultado
duplicados
caso optimista cuando la red está libre de congestión, es decir, cuando un evento de pérdida
llegada de estos reconocimientos como una indicación de que todo está bien, que los segmentos
tamaño (y por lo tanto su velocidad de transmisión). Tenga en cuenta que si los acuses de recibo
llegan a un
tasa relativamente lenta (por ejemplo, si la ruta de extremo a extremo tiene un retraso alto o
contiene un
relativamente
ritmo lento. Por otro lado, si los acuses de recibo llegan a una tasa alta, entonces el
Dado el mecanismo de ajuste del valor de cwnd para controlar la tasa de envío,
la pregunta crítica sigue siendo: ¿Cómo debe un remitente TCP determinar la velocidad a la que
debe enviar? Si los remitentes TCP envían colectivamente demasiado rápido, pueden congestionar
la red, lo que lleva al tipo de colapso de congestión que vimos en la Figura 3.48. En efecto,
Colapso de congestión de Internet [Jacobson 1988] bajo versiones anteriores de TCP. Sin embargo,
si los remitentes de TCP son demasiado cautelosos y envían demasiado lento, podrían subutilizar
el ancho de banda en la red; es decir, los remitentes TCP podrían enviar a una velocidad mayor
sin congestionar la red. Entonces, ¿cómo determinan los remitentes TCP sus tasas de envío de
todo el ancho de banda disponible? ¿Los remitentes de TCP están explícitamente coordinados o
existe una
enfoque distribuido en el que los remitentes TCP pueden establecer sus tasas de envío basándose
únicamente
principios:
Un segmento perdido implica congestión y, por lo tanto, la tasa del remitente TCP debe ser
que un evento de tiempo de espera o la recepción de cuatro acuses de recibo para un segmento
dado (un ACK original y luego tres ACK duplicados) se interpreta como un
indicación implícita de "evento de pérdida" del segmento que sigue al cuádruple ACK
segmento, desencadenando una retransmisión del segmento perdido. Desde el punto de vista del
evento de pérdida.
• Un segmento reconocido indica que la red está entregando el mensaje del remitente.
segmentos al receptor, y por lo tanto, la tarifa del remitente se puede aumentar cuando un
como una indicación implícita de que todo está bien: los segmentos se están
entregado con éxito del remitente al receptor y, por lo tanto, la red no está congestionada. Por lo
eventos de ruta y pérdida que indican una ruta congestionada, la estrategia de TCP para ajustar su
tasa de transmisión es aumentar su tasa en respuesta a los ACK que llegan hasta una pérdida
por lo tanto, aumenta su tasa de transmisión para sondear la tasa a la que la congestión
comienza el inicio, retrocede de ese ritmo y luego comienza a sondear nuevamente para ver si
análogo al niño que solicita (y obtiene) más y más golosinas hasta que finalmente
finalmente se le dice "¡No!", retrocede un poco, pero luego comienza a hacer solicitudes
de nuevo poco después. Tenga en cuenta que no hay señalización explícita de congestión.
estado por la red—ACKs y eventos de pérdida sirven como señales implícitas—y que
cada remitente TCP actúa sobre la información local de forma asíncrona desde otro TCP
remitentes
Dada esta descripción general del control de congestión de TCP, ahora estamos en condiciones de
considerar
tres componentes principales: (1) inicio lento, (2) evitación de congestión y (3) recuperación
rápida. El inicio lento y la evitación de la congestión son componentes obligatorios de TCP, que se
diferencian en cómo aumentan el tamaño de cwnd en respuesta a los ACK recibidos. Ya veremos
en breve, ese inicio lento aumenta el tamaño de cwnd más rápidamente (¡a pesar de su nombre!)
que evitar la congestión. Se recomienda, pero no se requiere, una recuperación rápida para
Remitentes TCP.
Comienzo lento
Cuando comienza una conexión TCP, el valor de cwnd normalmente se inicializa a un
pequeño valor de 1 MSS [RFC 3390], lo que da como resultado una tasa de envío inicial de
aproximadamente
SMS/RTT. Por ejemplo, si MSS = 500 bytes y RTT = 200 mseg, el resultado
la velocidad de envío inicial es de solo unos 20 kbps. Dado que el ancho de banda disponible para
el
El remitente TCP puede ser mucho más grande que MSS/RTT, al remitente TCP le gustaría
lento, el
El valor de cwnd comienza en 1 MSS y aumenta en 1 MSS cada vez que se transmite
y envía dos segmentos de tamaño máximo. Estos segmentos luego son reconocidos, con el
los segmentos reconocidos, dando una ventana de congestión de 4 MSS, y así sucesivamente.
Este proceso da como resultado una duplicación de la tasa de envío cada RTT. Así, el TCP
La tasa de envío comienza lenta pero crece exponencialmente durante la fase de inicio lento.
Pero, ¿cuándo debería terminar este crecimiento exponencial? El inicio lento proporciona varios
respuestas a esta pregunta. Primero, si hay un evento de pérdida (es decir, congestión) indicado
por un tiempo de espera, el remitente TCP establece el valor de cwnd a 1 y comienza la lenta
iniciar el proceso de nuevo. También establece el valor de una segunda variable de estado,
ssthresh
(abreviatura de “umbral de inicio lento”) a cwnd/2: la mitad del valor de la ventana de congestión
el inicio lento puede terminar está directamente relacionado con el valor de ssthresh. Desde
ssthresh
es la mitad del valor de cwnd cuando se detectó la congestión por última vez, podría ser un poco
ssthresh. Por lo tanto, cuando el valor de cwnd es igual a ssthresh, finaliza el inicio lento.
Para servicios en la nube, como búsqueda, correo electrónico y redes sociales, es deseable
proporcionar un
alto nivel de capacidad de respuesta, idealmente dando a los usuarios la ilusión de que los
dentro de sus propios sistemas finales (incluidos sus teléfonos inteligentes). Esto puede ser un
gran desafío,
ya que los usuarios a menudo se encuentran lejos de los centros de datos que son responsables de
servir
el contenido dinámico asociado a los servicios en la nube. De hecho, si el sistema final está lejos
desde un centro de datos, entonces el RTT será grande, lo que podría conducir a un tiempo de
respuesta deficiente
Como caso de estudio, considere la demora en recibir una respuesta para una consulta de
búsqueda.
Por lo general, el servidor requiere tres ventanas TCP durante el inicio lento para entregar el
respuesta [Pathak 2010]. Por lo tanto, el tiempo desde que un sistema final inicia una conexión
(un RTT para configurar la conexión TCP más tres RTT para las tres ventanas de datos)
más el tiempo de procesamiento en el centro de datos. Estos retrasos de RTT pueden conducir a
un notable
Además, hay
puede haber una pérdida significativa de paquetes en las redes de acceso, lo que lleva a
retransmisiones TCP y
Una forma de mitigar este problema y mejorar el rendimiento percibido por el usuario es (1)
implementar servidores front-end más cerca de los usuarios, y (2) utilizar la división de TCP
rompiendo el
Conexión TCP en el servidor front-end. Con la división de TCP, el cliente establece una conexión
TCP con el front-end cercano y el front-end mantiene una conexión TCP persistente con
el centro de datos con una ventana de congestión TCP muy grande [Tariq 2008, Pathak 2010,
Chen 2011]. Con este enfoque, el tiempo de respuesta se convierte aproximadamente en 4 RTTFE
RTTBE
tiempo de procesamiento, donde RTTFE es el tiempo de ida y vuelta entre el cliente y el servidor
front-end, y
RTT
BE es el tiempo de ida y vuelta entre el servidor front-end y el centro de datos (servidor back-end).
Si el servidor front-end está cerca del cliente, entonces este tiempo de respuesta se vuelve
aproximadamente
RTT más tiempo de procesamiento, ya que RTTFE es insignificantemente pequeño y RTTBE es
aproximadamente RTT. En
RTT, mejorando significativamente el rendimiento percibido por el usuario, especialmente para los
centro de datos más cercano. La división de TCP también ayuda a reducir los retrasos en la
pérdidas en las redes de acceso. Hoy, Google y Akamai hacen un uso extensivo de su CDN
servidores en redes de acceso (consulte la Sección 7.2) para realizar la división de TCP para los
servicios en la nube
cwnd con más cautela cuando esté en el modo de prevención de congestión. La última forma de
entrar
el inicio lento puede terminar si se detectan tres ACK duplicados, en cuyo caso
TCP realiza una retransmisión rápida (consulte la Sección 3.5.4) y entra en la recuperación rápida
FSM
descripción del control de congestión de TCP en la Figura 3.52. El algoritmo de inicio lento
rastrea sus raíces hasta [Jacobson 1988]; un enfoque similar al inicio lento también se propuso de
Prevención de la congestión
su valor cuando se encontró congestión por última vez; la congestión podría estar alrededor
¡la esquina! Por lo tanto, en lugar de duplicar el valor de cwnd cada RTT, TCP adopta un
cada RTT [RFC 5681]. Esto puede ser realizado de varias maneras. Una común
El enfoque es que el remitente TCP aumente cwnd en bytes MSS (MSS/cwnd) cada vez que llega
Pero, ¿cuándo debería aumentar linealmente la evitación de la congestión (de 1 MSS por RTT)?
¿fin? El algoritmo para evitar la congestión de TCP se comporta de la misma manera cuando se
el valor de ssthresh se actualiza a la mitad del valor de cwnd cuando el evento de pérdida
ocurrió. Recuerde, sin embargo, que un evento de pérdida también puede desencadenarse por un
evento ACK duplicado triple. En este caso, la red continúa entregando segmentos de
comportamiento de TCP ante este tipo de evento de pérdida debería ser menos drástico que con
TCP reduce a la mitad el valor de cwnd (agregando 3 MSS como buena medida para tener en
cuenta
los ACK duplicados triples recibidos) y registra el valor de ssthresh para que sea la mitad
el valor de cwnd cuando se recibieron los ACK duplicados triples. La rápida recuperación
Rápida recuperación
En la recuperación rápida, el valor de cwnd aumenta en 1 MSS por cada ACK duplicado
recibido para el segmento faltante que hizo que TCP entrara en el estado de recuperación rápida.
espera, rápido
la recuperación pasa al estado de inicio lento después de realizar las mismas acciones que en
el valor de ssthresh se establece en la mitad del valor de cwnd cuando ocurrió el evento de
pérdida.
5681]. Es interesante que una versión anterior de TCP, conocida como TCP Tahoe, redujo
mas nuevo
La Figura 3.53 ilustra la evolución de la ventana de congestión de TCP tanto para Reno
y Tahoe. En esta figura, el umbral es inicialmente igual a 8 MSS. Para los primeros ocho
sube exponencialmente rápido durante el comienzo lento y alcanza el umbral en la cuarta ronda
de transmision Luego, la ventana de congestión sube linealmente hasta que ocurre un evento de
triple ACK duplicado, justo después de la ronda 8 de transmisión. Tenga en cuenta que la ventana
de congestión
establece en
retransmitidos.
recuperación rápida, vale la pena dar un paso atrás y ver el bosque desde los árboles. Ignorando el
período inicial de inicio lento cuando comienza una conexión y suponiendo que las pérdidas se
indican mediante ACK duplicados triples en lugar de tiempos de espera, el control de congestión
de TCP consiste en un aumento lineal (aditivo) en cwnd de 1 MSS por RTT y luego una reducción a
la mitad
El control de congestión de TCP a menudo se conoce como una forma de control de congestión de
al comportamiento de "diente de sierra" que se muestra en la Figura 3.54, que también ilustra
intuición anterior de TCP "probando" el ancho de banda: TCP aumenta linealmente el tamaño de
su ventana de congestión (y, por lo tanto, su velocidad de transmisión) hasta un triple ACK
duplicado
evento ocurre. Luego disminuye el tamaño de su ventana de congestión por un factor de dos, pero
luego nuevamente comienza a aumentarlo linealmente, sondeando para ver si hay más disponible
banda ancha.
[Padhye
2001]. Se han propuesto muchas variaciones del algoritmo de Reno [RFC 3782; RFC
2018]. El algoritmo TCP Vegas [Brakmo 1995; Ahn 1995] intenta evitar la congestión manteniendo
un buen rendimiento. La idea básica de Vegas es (1) detectar la congestión en los enrutadores
baje la tasa linealmente cuando se detecte esta pérdida de paquete inminente. Pérdida inminente
de paquetes
se predice observando el RTT. Cuanto más largo sea el RTT de los paquetes, mayor será la
Congestión en los enrutadores. Linux admite una serie de algoritmos de control de congestión
(incluyendo TCP Reno y TCP Vegas) y permite que un administrador del sistema configure
qué versión de TCP se utilizará. La versión predeterminada de TCP en Linux versión 2.6.18
se configuró en CUBIC [Ha 2008], una versión de TCP desarrollada para aplicaciones de gran ancho
de banda. Para una encuesta reciente de los muchos sabores de TCP, consulte [Afanasyev 2010].
El algoritmo AIMD de TCP se desarrolló sobre la base de una gran cantidad de conocimientos de
ingeniería y experimentación con el control de la congestión en las redes operativas. Diez años
después del desarrollo de TCP, los análisis teóricos mostraron que TCP
algoritmo que da como resultado varios aspectos importantes del rendimiento del usuario y de la
red
siendo optimizado simultáneamente [Kelly 1998]. Una rica teoría del control de la congestión
podría ser el rendimiento (es decir, la tasa promedio) de una conexión TCP de larga duración. En
esto
análisis ignoraremos las fases de inicio lento que ocurren después de los eventos de tiempo de
espera. (Estos
Las fases suelen ser muy cortas, ya que el emisor crece exponencialmente fuera de la fase.
rápido.) Durante un intervalo de ida y vuelta en particular, la velocidad a la que TCP envía datos es
un
bytes y el tiempo de ida y vuelta actual es RTT segundos, entonces la velocidad de transmisión de
TCP es
aproximadamente con RTT. Luego, TCP busca ancho de banda adicional aumentando w en 1 MSS
cada RTT hasta que ocurra un evento de pérdida. Denotar por W el valor de w cuando ocurre un
evento de pérdida
cuando
MSS/RTT cada RTT hasta que llegue nuevamente a W/RTT. Este proceso se repite a lo largo
y otra vez Debido a que el rendimiento de TCP (es decir, la tasa) aumenta linealmente entre
Usando este modelo altamente idealizado para la dinámica de estado estacionario de TCP,
podemos
también obtenga una expresión interesante que relacione la tasa de pérdida de una conexión con
su ancho de banda disponible [Mahdavi 1997]. Esta derivación se describe en los problemas de
tarea. Un modelo más sofisticado que se ha encontrado empíricamente para estar de acuerdo con
los años y
de hecho continúa evolucionando. Para obtener un resumen de las variantes actuales de TCP y la
discusión
de la evolución de TCP, consulte [Floyd 2001, RFC 5681, Afanasyev 2010]. que estuvo bueno
para Internet, cuando la mayor parte de las conexiones TCP llevaban tráfico SMTP, FTP y Telnet, no
Conexiones TCP de alta velocidad que se necesitan para aplicaciones de computación en red y en
la nube. Por ejemplo, considere una conexión TCP con segmentos de 1500 bytes y 100
ms RTT, y supongamos que queremos enviar datos a través de esta conexión a 10 Gbps.
Siguiendo [RFC 3649], notamos que usando la fórmula de rendimiento de TCP anterior, en
necesita ser 83,333 segmentos. Son muchos segmentos, lo que nos lleva a estar bastante
preocupados de que uno de estos 83,333 segmentos en vuelo se pierda. Qué pasaría
en el caso de una pérdida? O, dicho de otro modo, ¿qué fracción de los segmentos transmitidos
podría perderse que permitiría que el algoritmo de control de congestión de TCP especificado en
la Figura 3.52 aún alcanzara la velocidad deseada de 10 Gbps? En las preguntas de tarea para este
Conexión TCP en función de la tasa de pérdida (L), el tiempo de ida y vuelta (RTT) y la
Usando esta fórmula, podemos ver que para lograr un rendimiento de 10 Gbps,
el algoritmo de control de congestión de TCP actual solo puede tolerar una probabilidad de
segmentos):
una tasa muy baja. Esta observación ha llevado a un número de investigadores a investigar nuevas
ver [Jin 2004; RFC 3649; Kelly 2003; Ha 2008] para las discusiones de estos esfuerzos.
3.7.1 Equidad
Considere las conexiones K TCP, cada una con una ruta de extremo a extremo diferente, pero
todas pasan
a través de un enlace de cuello de botella con tasa de transmisión R bps. (Por enlace de cuello de