Universidade Federal do Paraná
Professor:
Eduardo Parente Ribeiro, Dr.
Mestrando:
Fabricio Carvalho de Gouveia
Na internet, a perda de pacotes pode ocorrer como um
resultado de transmissão de erros, mas também, e mais comumente, como um
resultado de congestionamento. Nem todas as aplicações na internet usam TCP e
portanto não seguem o mesmo conceito de favoráveis compartilhamentos da largura
de banda disponível. Novas tendências nas comunicações, em particular o
desdobramento multicast, aplicações de áudio/vídeo em tempo real, tais como
videoconferência, tocadores de áudio e Telefonia IP estão em constante crescimento e são prováveis causas de aumento
da porcentagem de tráfego de aplicações que não usam TCP na internet. Essas
aplicações raramente desempenham controle de congestionamento de alguma maneira
aos protocolos baseados em TCP; eles não compartilham a largura de banda
disponível juntamente com aplicações construídas em TCP, como Web browsers,
Hypertext Transfer Protocol (HTTP), Fife Transfer Protocol (FTP), ou Simple
Mail Transfer Protocol (SMTP). A comunidade internet teme fortemente que a
corrente evolução poderia levar a um colapso no congestionamento e inanição do
tráfego TCP. Por esta razão, é
desejável definir regras de adaptação de taxas e mecanismos para o tráfego de
aplicações que não usam TCP que são
compatíveis com o mecanismo de adaptação de taxas do TCP. Protocolos baseados
em TCP estão sendo desenvolvidos para se comportarem favoravelmente com
respeito ao coexistente tráfego TCP.
TCP e Aplicações Baseadas em TCP
O TCP (Transmission Control Protocol) é um protocolo
de comunicação que provê um serviço de entrega contínua e confiável através da
sua orientação à conexão, reconhecimento positivo e retransmissão. O Controle
de fluxo do TCP utiliza o mecanismo de janela deslizante, onde o destino deve
retornar um aviso de janela (window advertisement) para indicar o
tamanho do seu buffer, de forma a regular a quantidade de dados (janela)
que o transmissor pode enviar sem receber reconhecimento. Quando mandamos
dados, são consumidos slots dajanela de quem envia, e o originador pode
mandar pacotes somente quando slots livres
estão disponíveis. Quando um reconhecimento para destacamento de pacotes é
recebido, a janela é varrida para que os pacotes reconhecidos deixem a janela,
e o mesmo número de slots livres tornem-se disponíveis. Na inicialização, TCP
desempenha o slowstart, durante o qual a taxa dobra seu estado a cada
RTT (round-trip times) que é exponencial. No estado regular, o TCP usa um
mecanismo de aumento adicional, diminuição multiplicativa (AIMD) para
detectar largura de banda adicional para reagir ao congestionamento. Quando não
há nenhuma indicação de perda, o TCP aumenta a janela de congestionamento de
1 slot/RTT. No caso de perda de
pacotes, indicados por um timeout, a janela de congestionamento é reduzida a um
slot e o TCP reentra na fase de slowstart. A Perda de pacotes indicada por três
duplicatas ACKs resulta em uma redução de janela à metade de seu tamanho
prévio.
Um dos
principais fatores que tornaram o TCP tão difundido é a sua capacidade de se adaptar
rapidamente a variações na carga oferecida e na banda disponível, utilizando a
perda de pacote como forma de retroalimentação.
Quando a carga oferecida a qualquer rede é maior do
que sua capacidade, acontece um congestionamento [1]. A internet não é exceção
a essa regra. Mesmo que a camada de rede também tente gerenciar o
congestionamento, o trabalho mais pesado é feito pelo TCP, pois a verdadeira
solução para o congestionamento é diminuir a taxa de transmissão de dados.Para
tratarmos o congestionamento, a idéia é não incluir um novo pacote na rede até
que o antigo o tenha deixado (entregue). O TCP tenta alcançar esse objetivo
manipulando dinamicamente o tamanho da janela. Para gerenciarmos o
congestionamento devemos primeiramente detecta-lo. Antigamente, detectar um
congestionamento era difícil. Um timeout causado por um pacote perdido
podia ter sido provocado por ruído na linha de transmissão ou pelo fato de o
pacote ter sido descartado em um congestionamento do roteador. Era difícil
saber a diferença dos dois casos.
Hoje em dia, a perda de pacotes devido a erros de transmissão é relativamente rara
porque a maioria dos troncos de longa distância é de fibra. Como conseqüência,
a maioria dos timeouts de transmissão, na Internet se deve a congestionamentos. Todos os algoritmos TCP
da Internet presumem que os timeouts são causados por congestionamentos,
e monitora os timeouts à procura de problemas da mesma forma que um vigia
observa as pessoas que entram em um banco.
Quando uma conexão é estabelecida, deve-se escolher um
tamanho de janela adequado. O receptor pode especificar uma janela a partir do
tamanho de seu buffer. Se o transmissor se mantiver dentro do tamanho da
janela, não haverá problemas causados pela sobrecarga dos buffers na
extremidade receptora, mas eles ainda podem ocorrer devido à congestionamentos
internos na rede. A solução da Internet é entender que existem dois problemas
potenciais: a capacidade da rede e a capacidade do receptor, lidando com cada
um em separado. Para isso, cada transmissor mantém duas janelas: a janela
fornecida pelo receptor e uma segunda janela, a janela de congestionamento.
Cada uma mostra o número de bytes que o transmissor pode enviar, que é o valor
mínimo das duas janelas. Portanto a janela efetiva é o mínimo do que o
transmissor e o receptor consideram viável. Se o receptor disser: “Envie 8KB”,
mas o transmissor souber que qualquer rajada com mais do que 4KB poderá
congestionar a rede, ele enviará apenas 4KB. Por outro lado, se o receptor
disser: “Envie 8KB”, e o transmissor souber que rajadas de até 32KB passam pela
rede sem problemas, ele enviará os 8KB solicitados.
Quando uma conexão é estabelecida, o transmissor
ajusta a janela de congestionamento ao tamanho do segmento máximo em uso na
conexão. Em seguida, ele envia um segmento máximo. Se esse segmento for
confirmado antes de ocorrer um timeout, o transmissor incluirá o número de
bytesde um segmento na janela de congestionamento de modo que ela tenha
capacidade equivalente a dois segmentos
máximos e enviará dois segmentos. À medida que cada um desses segmentos for
confirmado, a janela de congestionamento é aumentada em um tamanho de segmento
máximo. Quando a janela de congestionamento chegar a N segmentos em tamanho,e
se todos os N segmentos forem confirmados a tempo, a janela de congestionamento
será aumentada no número de bytes correspondentes aos N segmentos. Cada rajada
duplica a janela de congestionamento. A janela de congestionamento mantém seu
crescimento exponencial até que ocorra um timeout ou que a janela do receptor
seja alcançada. Esse algoritmo é conhecido como inicialização lenta (slow
start), mas não é lento de forma alguma, pois ele é exponencial. Todas as
implementações TCP dever ser
compatíveis com ele.
Fig. 1 – a) Uma rede rápida alimentando
um receptor de pequena capacidade. b) Uma rede lenta alimentando um receptor de
grande capacidade.
O algoritmo de controle de congestionamento da
Internet utiliza um terceiro parâmetro, o limitante (threshold), que, em
princípio, é 64KB, além das janelas do receptor e de congestionamento. Quando
há um timeout, o limitante é atribuído à metade da janela de congestionamento
atual, e a janela de congestionamento é reinicializada para um tamanho de
segmento máximo. Em seguida, a inicialização lenta é usada para determinar o
que a rede é capaz de gerenciar, só que agora o crescimento exponencial é
interrompido quando o limite é alcançado. A partir daí, as transmissões
bem-sucedidas proporcionam um crescimento linear à janela de congestionamento
(o aumento é de um segmento máximo para cada rajada) em vez de um para cada
segmento. Esse algoritmo diminui o tamanho da janela de congestionamento à
metade, e depois retoma seu crescimento a partir daí.
A figura 2 ilustra o funcionamento desse algoritmo. O
tamanho máximo do segmento aqui é de 1024 bytes. A janela de congestionamento
em princípio tem 64KB, mas há um timeout; portanto foi atribuído ao limite o
valor de 32KB e à janela de congestionamento 1KB para transmissão 0. Em
seguida, a janela de congestionamento cresce de maneira exponencial até chegar
ao limite (32KB). A partir daí seu crescimento é linear.
A transmissão 13 não tem muita sorte, e há um timeout.
Ao limite é atribuído um valor que é a
metade da janela atual (agora 40KB, portanto, a metade é 20KB), e o slow start
começa outra vez. Quando as confirmações da transmissão 18 começam a chegar,,
os quatro primeiros incrementam a janela de congestionamento em um segmento
máximo cada um; depois disso,o crescimento volta a ser linear.
Se não houver outro timeout, a janela de
congestionamento continuará a crescer até atingir o tamanho da janela do
receptor. Nesse ponto, ela para de crescer e permanece constante desde que não
ocorra outro timeout e que a janela do receptor não mude de tamanho. Por outro
lado, se um pacote SOURCE QUENCH ICMP
chegar e for passado à entidade TCP, esse evento será tratado como se
tivesse havido um timeout.
Fig. 2 – Exemplo do algoritmo de
congestionamento na Internet
Classificação
de Esquemas de Controle de Congestionamento
Esquemas
de controle de congestionamento podem ser classificados com respeito a diversas
características como seguem:
Baseados na janela x Baseados
na taxa
Algoritmos
que pertencem a categoria baseados na
janela usam uma janela de congestionamento até o transmissor ou até o(s)
receptor(es) para assegurar TCP friendliness [2]. Similar ao TCP, cada pacote
transmitido consome um slot na janela
de congestionamento, enquanto cada pacote recebido ou ou a confirmação de um
pacote recebido livra um slot. O transmissor está permitido a transmitir
pacotes somente quando um slot está disponível. O tamanho da janela de
congestionamento é aumentado na ausência de indicações de congestionamento e
diminuição quando ele ocorre.
Os
baseados na taxa executam o controle de congestionamento dos TCP frindliness
por adaptação dinâmica da taxa
de transmissão de acordo com o mecanismo de realimentação da rede que indica
congestionamento. Ele pode ser subdividido em um esquema simples AIMD e
controle de congestionamento baseado em modelo. O esquema simples AIMD imita o
comportamento do controle de
congestionamento TCP. O controle de congestionamento baseado em modelo pode
produzir mudanças de taxa mais brandas que são melhor demandados pelo tipo de
tráfego.
UNICAST x
MULTICAST
TCP
friendliness são desejáveis para ambos os tráfegos unicast and multicast.
Entretanto, o desenvolvimento de um bom protocolo de controle de
congestionamento multicast é mais distante e difícil que o desenvolvimento do
protocolo de controle de congestionamento unicast.
SINGLE-RATE
x MULTIRATE
Os
protocolos de transporte unicast estão confinados a esquemas de single-rate,
onde os dados são mandados a todos os receptores à mesma taxa. Isto limita a escalabilidade do mecanismo,
sendo que todos os receptores estão restritos à taxa que é baseada em TCP para
o receptor com o menor gargalo.
Os
protocolos de controle de congestionamento multirate permitem uma alocação mais
flexível da largura de banda ao longo de diferentes caminhos na rede. Uma abordagem típica para controle de
congestionamento multirate é o uso das camadas multicast: Um transmissor divide
os dados em algumas camadas e as transmite para diferentes grupos multicast.
Cada receptor pode individualmente selecionar e fazer parte de tantos grupos
forem possíveis através do gargalo da largura de banda entre o receptor e o
transmissor. Para a transmissão de vídeo um aumento no número de camadas de
receptores pode agregar qualidade de vídeo, enquanto para um volume seguro deuma
adicional tranferência de dados pode diminuir o tempo de tranferência.
END-TO-END
x ROUTER-SUPORTED
Muitos
dos esquemas baseados em TCP propostos
são desenvolvidos para o melhor desempenho de redes IP que não provêem qualquer
mecanismo adicional de roteamento para sustentar os protocolos. Então, eles
podem prontamente ser desdobrados na Internet de hoje. Estes esquemas são
chamados controle de congestionamento end-to-end e podem ser subdivididos em
acessos sender-based e receiver-based.
No acesso sender-based
o transmissor usa a informação sobre o congestionamento da rede e ajusta
a taxa ou o tamanho da janela para alcançar o TCP amigável. Os receptores somente provêem avaliação enquanto a responsabilidade do
ajuste da taxa é somente do transmissor.
Particularmente os
protocolos multicast podem se beneficiar da funcionalidade da rede adicional
como agregação de realimentação, medidas de RTT hierárquico, administração de
subgrupos de receptores, ou modificação
das estratégias de fila dos roteadores.
ESQUEMAS DE CLASSIFICAÇÃO
Usaremos o esquema mostrado na Figura 3 para
classificar as aproximações diferentes. Esta classificação distingue entre
controle de congestionamento single-rate e multirate ao nível de topo e
controle de congestionamento rate-based e window-based ao segundo nível.
Abaixo são
apresentados uma seleção de protocolos
de controle de congestionamento de single-rate. Uma avaliação mais completa
pode ser encontrada no relatório técnico correspondente[3].
Fig. 3 – Esquema de classificação dos protocolos TCP amigáveis
Muitos
protocolos de controle de congestionamento single-rate implicitamente ou explicitamente ajustam a sua taxa de
acordo com um modelo de tráfego TCP. Uma aproximação muito óbvia para controle
de congestionamento TCP-amigável é aplicar o mecanismo de controle de
congestionamento de TCP diretamente, mas sem o mecanismo de confiança
associado.
RAP (Rate adaption Protocol)- é um AIMD
simples planejado para fluxos de unicast. Cada pacote de dados é reconhecido
pelo receptor. Os reconhecimentos são usados para detectar a perda de pacotes e
deduzir o RTT. Em períodos sem congestionamento, a taxa de envio aumenta de 1
pacote/RTT, imitando assim o
comportamento de AIMD do TCP.
LDA+ (Loss-delay Based Adaption Algoritm)- Ao
contrário muitos dos outros esquemas, o algoritmo LDA+ não inventa seu próprio mecanismo de avaliação para controlar a taxa de envio mas confia no RTCP (Real-time Transfer Control
Protocol) mensagens de realimentação providas RTP (Real-time Transfer
Protocol). Enquanto LDA+ é essencialmente um esquema de controle de
congestionamento AIMD, ele usa alguns elementos adicionais interessantes.
Os fatores de aumento e diminuição para AIMD se ajustam dinamicamente às
condições da rede. Uma estimativa da largura de banda no gargalo de garrafa é
obtido usando pares de pacotes. A
quantia de aumento aditivo é então determinada como um mínimo de três fatores de aumento independentes que
asseguram isso:
TFRC (TCP-friendly
Rate Control Protocol)- Este Protocolo evoluiu do protocolo de TFRCP, e é
especificado somente para comunicação
de unicast, embora com algumas modificações ele pode ser adaptado para
multicast. Ele ajusta sua taxa de envio
fazendo uso de métodos sofisticados para garantir os parâmetros necessários. A
taxa de perda é medida em termos de
intervalos de perda, enquanto mede o número de
pacotes entre eventos de perda sucessivos. O RTT é medido pelo método
padrão de realimentação de timestamps para o remetente. Imediatamente depois de startup, o remetente
entra em um slowstart fase semelhante a
slowstart do TCP que aumenta a taxa depressa para uma porção mediana da largura de banda. O slowstart do TFRC é
terminado com o primeiro evento de
perda. Uma vez pelo RTT o receptor TFRC atualiza seus parâmetros e envia um
relatório de estado ao remetente. O remetente
computa uma nova taxa média destes parâmetros
e ajusta a taxa enviando adequadamente. A melhor vantagem do TFRC é que
ele tem uma taxa relativamente estável de envio enquanto ainda possui
responsabilidade suficiente para
competir no tráfego.
TEAR
(TCP Emulation At Receivers)- TEAR é um protocolo híbrido que combina
aspectos de controle de congestionamento window-based e rate-based. Os
receptores do TEAR calculam uma taxa de recepção que é mandada de volta ao
remetente que então ajusta a taxa de
envio. Para este fim, os receptores mantêm uma janela de congestionamento que é
modificada semelhantemente à janela de congestionamento do TCP. Desde que a
janela de congestionamento do TCP fica situada ao remetente, um receptor de
TEAR tenta determinar de onde os pacotes chegam quando o TCP aumentaria ou
diminuiria o tamanho de janela de
congestionamento. Desde que a taxa seja determinada
aos receptores e o TEAR reconhecer
pacotes, ele pode ser usado para comunicações multicast bem como para comunicação unicast, contanto que se
tenha um esquema escalável que determine o RTT e informe as taxas que serão
usadas no caso de multicast. Para controle de congestionamento multicast,
o remetente de TEAR tem que adaptar a sua taxa ao mínimo que a taxa
informada pelos receptores.
O domínio
de controle de congestionamento unicast window-based é bem coberto por TCP. Há
dois problemas principais que têm de
ser resolvidos para usar controle de congestionamento window-based para multicast.
Primeiro, os protocolos deveriam prevenir drop-to-zero da taxa devido à
multiplicidade de caminho de perda acima mencionado. O segundo problema é como
livrar slots na janela de
congestionamento. Claramente não é possível para o transmissor receber ACKs para cada pacote de cada
receptor, desde que isto poderia causar
uma implosão de ACKs. A seguir serão
apresentados várias aproximações para controle de congestionamento window-based
para transmissão multicast. Em particular,
será focalizado em como os dois problemas principais são resolvidos para cada.
A framework para controle de congestionamento window-based - Golestani e Sabnani propõem
usar uma aproximação window-based onde cada receptor mantém uma
janela separada de congestionamento ajustada semelhantemente à janela de
congestionamento do TCP. Do tamanho da
janela e do número de excelente
pacotes, cada receptor calcula o número sequencial mais alto que pode receber sem reivindicar uma quantia
injusta de largura de banda.
Esta informação precisa ser comunicada ao transmissor sem causar uma implosão de realimentação. Como um exemplo de como isto pode ser feito, os autores mostram que uma estrutura de árvore formado pelos receptores ou outros sistemas intermediários pode ser agregada a informação: cada nó leva o mínimo números seqüenciais contidas em todas as mensagens de entrada e encaminha esta seqüência de números para seu pai. Quando o informação agregada alcança o transmissor, é permitido que envie pacotes até o número seqüencial mínimo que se tenha recebido. Cada receptor mantém sua própria janela de congestionamento, que evita o problema de perda por caminhos múltiplos. As observações feitas por Golestani e Sabnani formam um fundo teórico para controle de congestionamento window-based para transmissão multicast. Eles precisam ser concretizados através de algoritmos atuais como esses que seguem.
RLA e LPR (Ramdom Listening Algoritm)
- O RLA proposto por Wang e
Schwartz introduziram alguns
encarecimentos para multicast. Para
cada receptor, o transmissor multicast armazena o RTT alisado e a
probabilidade de medida de congestionamento. Uma perda é descoberta pelo
transmissor por identificação de ACKs descontínuos ou por um timeout. Baseado
nestas indicações de perda, o número de
receptores n com uma probabilidade de congestionamento alta é
encontrado. Se o congestionamento é descoberto, a janela é dividida nos
seguintes dois casos:
MTCP (Multicast TCP) – MTCP é um
protocolo multicast seguro que usa controle de congestionamento window-based
para alcançar TCP amigável. O MTCP agrupa os participantes de sessão em
uma estrutura de árvore lógica de onde
a raiz da árvore é o transmissor dos
dados. Para controlar o
congestionamento, o MTCP exige que cada pai
mantenha dois valores: uma janela de congestionamento e uma janela de
trânsito. O tamanho da janela de
congestionamento é administrado semelhantemente para o de TCP, inclusive slowstart e a evitação de
congestionamento. As diferenças
principais do TCP são:
A desvantagem principal do MTCP é sua complexidade e organização exigida de uma estrutura de árvore onde cada nó tem que executar armazenamento de pacotes, conserto, e monitoramento da funcionalidade de congestionamento.
NCA (Nominee-based Congestion Avoidance)
e pgmcc
(pragmatic general multicast congestion control)- NCA e pgmcc são duas
aproximações de controle de congestionamento que parte da mesma idéia fundamental:
eles selecionam como representante de grupo o receptor de gargalo de garrafa
com a pior conexão de rede. Este
receptor reconhece todo pacote recebido
e assim permite que o remetente use um
algoritmo TCP-style de controle de congestionamento. É importante notar que
nesta aproximação de controle de congestionamento e conserto de pacote são
tratados independentemente um do outro. Assim, a aproximação pode ser usada em
combinação com um grande número de mecanismos que estabelecem confiança, como também para transmissão de
dados incertos. O aspecto mais
desafiador de NCA e pgmcc é como
selecione o representante de grupo. Em ambas as aproximações, cada receptor calcula os dados e taxas a qual
pode receber por usando uma simples
fórmula TCP. Esta fórmula leva em
consideração o RTT e a taxa de perda experimentadas pelo receptor. A informação sobre a taxa aceitável é
carregada para o remetente e em uma estrutura de árvore de roteadores que
sempre remetem o relatório do
participante com a mais baixa taxa de dados aceitável (NCA). Desses relatórios o remetente seleciona como o
representante o participante com a mais
baixa taxa aceitável e usa um mecanismo
de controle de congestionamento TCP-like para este participante. O problema principal é que o processo de
seleção é baseado em uma estimativa
áspera da taxa de dados aceitável.
Em um ambiente controlado como uma companhia de intranet é possível implementar soluções que requerem mudanças na infra-estrutura de rede. Porém, o desenvolvimento destes mecanismos na Internet global é um tarefa muito mais difícil que consome tempo e é muito caro. Assim, tais soluções serão usadas só se elas oferecerem desempenho muito melhor em cima de soluções que podem ser usadas com a infra-estrutura da Internet de hoje. Entre protocolos que caem na categoria anterior são protocolos tree-based como MTCP, e protocolos que usam um serviço de multicast diferente do multicast de IP padrão como Rainbow.
As mesmas considerações são verdadeiras para complexidade do protocolo. Os esquemas Simple Rate-based AIMD tais como RAP requer menor complexidade mas tem as mesmas variações grandes na taxa de dados como TCP. Além disso, se eles só confiam no AIMD mas não levam em conta timeouts de TCP, seus TCP-amigáveis são limitados. Por causa da semelhança do mecanismo de controle de congestionamento, o esquema de controle de congestionamento window-based geralmente mostra-se um bom TCP amigável. Sua complexidade, considerando o mecanismo de controle de congestionamento, é comparável para esquemas AIMD rate-based.
Esquemas de controle de congestionamento model-based requerem uma moderada quantia de complexidade. Além da computação do modelo, a medida de parâmetros necessários em um modo que evita comportamentos não desejados (por exemplo, oscilações de taxa) acrescenta à complexidade. Esquemas Model-based podem falhar em produzir uma taxa de envio quando as condições de rede não obedecem as suposições feitas para o modelo de rede no qual a equação é baseada.
A complexidade do receptor e do transmissor podem ser reduzidas pelo movimento de inteligência na rede. Porém, como mencionado antes, complexidade aumentada na rede é até mesmo menos desejável que complexidade aumentada nos receptores e transmissores. Normalmente, tal apoio do roteador é usado para supressão da realimentação e para agregação de informação do protocolo.
Fig. 4 - Características dos protocolos
de controle de congestionamentos apresentados.
Com este trabalho, foi apresentada uma pesquisa com
recentes avanços dentro o área de
controle de congestionamento TCP-amigável. Foi discutido a necessidade do controle de congestionamento TCP-amigável
para ambos os tráfegos non-TCP-based
unicast e comunicação multicast,
e um overview de mecanismos de controle
de congestionamento.
Foram analisados várias aproximações que proveja amizade de TCP, por qualquer um
restringindo todos os receptores de tal modo que é alcançada amizade de TCP
pelo pior receptor (single-rate) ou
adaptando a taxa de cada receptor
individualmente de uma maneira TCP-amigável (multirate). Além
disso, foram classificados os
protocolos de acordo com o tipo de o
mecanismo de controle de congestão e a sua necessidade para rede apoio.
Acredito que determinado os mecanismos de fila e envio
da Internet atual, amizade de TCP é essencial para protocolos de transporte de end-to-end. Eventualmente, mecanismos
de roteamento que obrigam
comportamentos TCP-amigável e castigam os fluxos não conformes serão
necessários como um incentivo para
controle de congestionamento de end-to-end.
A Execução apropriada dos mecanismos roetadores
precisam ser investigados, e embora
aproximações teóricas iniciais para implementar algoritmos escaláveis e
eficientes existem, mas muito trabalho
é necessário antes de eles poderem ser
desdobrados. Até então, a eficiência da Internet depende da colaboração de aplicações usando Protocolos de controle de congestionamento
TCP-amigáveis.
BIBLIOGRAFIA
[1] TANEMBAUM, ANDREW S.:
“Redes de Computadores”,Editora Campus, 1997.
[2] j. widmer, r.denda, e m.mauve: “A
Survey on TCP-Friendly Congestion Control”, IEEE Network, Vol. 15 Nº 3, pp. 28-37,
maio/junho 2001.
[3] j.
widmer, r.denda, e m.mauve: “A
Survey on TCP-Friendly Congestion Control (Extended version),”Tech. rep.
TR-2001-002, Dept. of Math. and Comp. Sci., Univ. of Mannhein, Feb. 2001.